Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / argument / test.py @ c0fbf04c

History | View | Annotate | Download (15.2 kB)

1 5286e2c3 Stavros Sachtouris
# Copyright 2013 GRNET S.A. All rights reserved.
2 5286e2c3 Stavros Sachtouris
#
3 5286e2c3 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 5286e2c3 Stavros Sachtouris
# without modification, are permitted provided that the following
5 5286e2c3 Stavros Sachtouris
# conditions are met:
6 5286e2c3 Stavros Sachtouris
#
7 5286e2c3 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 5286e2c3 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 5286e2c3 Stavros Sachtouris
#      disclaimer.
10 5286e2c3 Stavros Sachtouris
#
11 5286e2c3 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 5286e2c3 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 5286e2c3 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 5286e2c3 Stavros Sachtouris
#      provided with the distribution.
15 5286e2c3 Stavros Sachtouris
#
16 5286e2c3 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 5286e2c3 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 5286e2c3 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 5286e2c3 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 5286e2c3 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 5286e2c3 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 5286e2c3 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 5286e2c3 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 5286e2c3 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 5286e2c3 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 5286e2c3 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 5286e2c3 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 5286e2c3 Stavros Sachtouris
#
29 5286e2c3 Stavros Sachtouris
# The views and conclusions contained in the software and
30 5286e2c3 Stavros Sachtouris
# documentation are those of the authors and should not be
31 5286e2c3 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 5286e2c3 Stavros Sachtouris
# or implied, of GRNET S.A.
33 5286e2c3 Stavros Sachtouris
34 b7ff6e0c Stavros Sachtouris
from mock import patch, call, MagicMock
35 5286e2c3 Stavros Sachtouris
from unittest import TestCase
36 f17d6cb5 Stavros Sachtouris
from StringIO import StringIO
37 b7ff6e0c Stavros Sachtouris
from datetime import datetime
38 02987e9c Stavros Sachtouris
#from itertools import product
39 5286e2c3 Stavros Sachtouris
40 02987e9c Stavros Sachtouris
from kamaki.cli import argument, errors
41 a7aacf12 Stavros Sachtouris
from kamaki.cli.config import Config
42 5286e2c3 Stavros Sachtouris
43 5286e2c3 Stavros Sachtouris
44 8d427cb9 Stavros Sachtouris
def assert_dicts_are_equal(test_case, d1, d2):
45 8d427cb9 Stavros Sachtouris
    for k, v in d1.items():
46 8d427cb9 Stavros Sachtouris
        test_case.assertTrue(k in d2)
47 8d427cb9 Stavros Sachtouris
        if isinstance(v, dict):
48 8d427cb9 Stavros Sachtouris
            test_case.assert_dicts_are_equal(v, d2[k])
49 8d427cb9 Stavros Sachtouris
        else:
50 8d427cb9 Stavros Sachtouris
            test_case.assertEqual(unicode(v), unicode(d2[k]))
51 8d427cb9 Stavros Sachtouris
52 8d427cb9 Stavros Sachtouris
53 c89d5f34 Stavros Sachtouris
cnf_path = 'kamaki.cli.config.Config'
54 c89d5f34 Stavros Sachtouris
55 c89d5f34 Stavros Sachtouris
56 5286e2c3 Stavros Sachtouris
class Argument(TestCase):
57 5286e2c3 Stavros Sachtouris
58 5286e2c3 Stavros Sachtouris
    def test___init__(self):
59 5286e2c3 Stavros Sachtouris
        self.assertRaises(ValueError, argument.Argument, 'non-integer')
60 5286e2c3 Stavros Sachtouris
        self.assertRaises(AssertionError, argument.Argument, 1)
61 f17d6cb5 Stavros Sachtouris
        self.assertRaises(AssertionError, argument.Argument, 0, 'noname')
62 f17d6cb5 Stavros Sachtouris
        self.assertRaises(AssertionError, argument.Argument, 0, '--no name')
63 f17d6cb5 Stavros Sachtouris
        self.assertRaises(AssertionError, argument.Argument, 0, ['-n', 'n m'])
64 5286e2c3 Stavros Sachtouris
        for arity, help, parsed_name, default in (
65 5286e2c3 Stavros Sachtouris
                (0, 'help 0', '--zero', None),
66 5286e2c3 Stavros Sachtouris
                (1, 'help 1', ['--one', '-o'], 'lala'),
67 5286e2c3 Stavros Sachtouris
                (-1, 'help -1', ['--help', '--or', '--more'], 0),
68 5286e2c3 Stavros Sachtouris
                (0, 'help 0 again', ['--again', ], True)):
69 5286e2c3 Stavros Sachtouris
            a = argument.Argument(arity, help, parsed_name, default)
70 5286e2c3 Stavros Sachtouris
            if arity:
71 5286e2c3 Stavros Sachtouris
                self.assertEqual(arity, a.arity)
72 5286e2c3 Stavros Sachtouris
            self.assertEqual(help, a.help)
73 5286e2c3 Stavros Sachtouris
74 5286e2c3 Stavros Sachtouris
            exp_name = parsed_name if (
75 5286e2c3 Stavros Sachtouris
                isinstance(parsed_name, list)) else [parsed_name, ]
76 5286e2c3 Stavros Sachtouris
            self.assertEqual(exp_name, a.parsed_name)
77 5286e2c3 Stavros Sachtouris
78 5286e2c3 Stavros Sachtouris
            exp_default = default or (None if arity else False)
79 5286e2c3 Stavros Sachtouris
            self.assertEqual(exp_default, a.default)
80 5286e2c3 Stavros Sachtouris
81 f17d6cb5 Stavros Sachtouris
    def test_value(self):
82 f17d6cb5 Stavros Sachtouris
        a = argument.Argument(1, parsed_name='--value')
83 f17d6cb5 Stavros Sachtouris
        for value in (None, '', 0, 0.1, -12, [1, 'a', 2.8], (3, 'lala'), 'pi'):
84 f17d6cb5 Stavros Sachtouris
            a.value = value
85 f17d6cb5 Stavros Sachtouris
            self.assertEqual(value, a.value)
86 f17d6cb5 Stavros Sachtouris
87 f17d6cb5 Stavros Sachtouris
    def test_update_parser(self):
88 f17d6cb5 Stavros Sachtouris
        for i, arity in enumerate((-1, 0, 1)):
89 f17d6cb5 Stavros Sachtouris
            arp = argument.ArgumentParser()
90 f17d6cb5 Stavros Sachtouris
            pname, aname = '--pname%s' % i, 'a_name_%s' % i
91 f17d6cb5 Stavros Sachtouris
            a = argument.Argument(arity, 'args', pname, 42)
92 f17d6cb5 Stavros Sachtouris
            a.update_parser(arp, aname)
93 f17d6cb5 Stavros Sachtouris
94 f17d6cb5 Stavros Sachtouris
            f = StringIO()
95 f17d6cb5 Stavros Sachtouris
            arp.print_usage(file=f), f.seek(0)
96 f17d6cb5 Stavros Sachtouris
            usage, exp = f.readline(), '[%s%s]\n' % (
97 f17d6cb5 Stavros Sachtouris
                pname, (' %s' % aname.upper()) if arity else '')
98 f17d6cb5 Stavros Sachtouris
            self.assertEqual(usage[-len(exp):], exp)
99 f17d6cb5 Stavros Sachtouris
            del arp
100 f17d6cb5 Stavros Sachtouris
101 5286e2c3 Stavros Sachtouris
102 a7aacf12 Stavros Sachtouris
class ConfigArgument(TestCase):
103 a7aacf12 Stavros Sachtouris
104 a7aacf12 Stavros Sachtouris
    def setUp(self):
105 a7aacf12 Stavros Sachtouris
        argument._config_arg = argument.ConfigArgument('Recovered Path')
106 a7aacf12 Stavros Sachtouris
107 a7aacf12 Stavros Sachtouris
    def test_value(self):
108 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
109 a7aacf12 Stavros Sachtouris
        self.assertEqual(c.value, None)
110 a7aacf12 Stavros Sachtouris
        exp = '/some/random/path'
111 a7aacf12 Stavros Sachtouris
        c.value = exp
112 a7aacf12 Stavros Sachtouris
        self.assertTrue(isinstance(c.value, Config))
113 a7aacf12 Stavros Sachtouris
        self.assertEqual(c.file_path, exp)
114 a7aacf12 Stavros Sachtouris
        self.assertEqual(c.value.path, exp)
115 a7aacf12 Stavros Sachtouris
116 a7aacf12 Stavros Sachtouris
    def test_get(self):
117 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
118 a7aacf12 Stavros Sachtouris
        c.value = None
119 c89d5f34 Stavros Sachtouris
        with patch('%s.get' % cnf_path, return_value='config') as get:
120 c89d5f34 Stavros Sachtouris
            self.assertEqual(c.value.get('global', 'config_cli'), 'config')
121 c89d5f34 Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call('global', 'config_cli'))
122 a7aacf12 Stavros Sachtouris
123 c89d5f34 Stavros Sachtouris
    @patch('%s.keys' % cnf_path, return_value=(
124 c89d5f34 Stavros Sachtouris
        'image_cli', 'config_cli', 'history_cli', 'file'))
125 c89d5f34 Stavros Sachtouris
    def test_groups(self, keys):
126 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
127 a7aacf12 Stavros Sachtouris
        c.value = None
128 c89d5f34 Stavros Sachtouris
        cset = set(c.groups)
129 c89d5f34 Stavros Sachtouris
        self.assertTrue(cset.issuperset(['image', 'config', 'history']))
130 c89d5f34 Stavros Sachtouris
        self.assertEqual(keys.mock_calls[-1], call('global'))
131 c89d5f34 Stavros Sachtouris
        self.assertFalse('file' in cset)
132 c89d5f34 Stavros Sachtouris
        self.assertEqual(keys.mock_calls[-1], call('global'))
133 c89d5f34 Stavros Sachtouris
134 c89d5f34 Stavros Sachtouris
    @patch('%s.items' % cnf_path, return_value=(
135 c89d5f34 Stavros Sachtouris
        ('image_cli', 'image'), ('file', 'pithos'),
136 c89d5f34 Stavros Sachtouris
        ('config_cli', 'config'), ('history_cli', 'history')))
137 c89d5f34 Stavros Sachtouris
    def test_cli_specs(self, items):
138 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
139 a7aacf12 Stavros Sachtouris
        c.value = None
140 c89d5f34 Stavros Sachtouris
        cset = set(c.cli_specs)
141 c89d5f34 Stavros Sachtouris
        self.assertTrue(cset.issuperset([
142 a7aacf12 Stavros Sachtouris
            ('image', 'image'), ('config', 'config'), ('history', 'history')]))
143 c89d5f34 Stavros Sachtouris
        self.assertEqual(items.mock_calls[-1], call('global'))
144 c89d5f34 Stavros Sachtouris
        self.assertFalse(cset.issuperset([('file', 'pithos'), ]))
145 c89d5f34 Stavros Sachtouris
        self.assertEqual(items.mock_calls[-1], call('global'))
146 a7aacf12 Stavros Sachtouris
147 a7aacf12 Stavros Sachtouris
    def test_get_global(self):
148 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
149 a7aacf12 Stavros Sachtouris
        c.value = None
150 a7aacf12 Stavros Sachtouris
        for k, v in (
151 a7aacf12 Stavros Sachtouris
                ('config_cli', 'config'),
152 a7aacf12 Stavros Sachtouris
                ('image_cli', 'image'),
153 a7aacf12 Stavros Sachtouris
                ('history_cli', 'history')):
154 c89d5f34 Stavros Sachtouris
            with patch('%s.get_global' % cnf_path, return_value=v) as gg:
155 c89d5f34 Stavros Sachtouris
                self.assertEqual(c.get_global(k), v)
156 c89d5f34 Stavros Sachtouris
                self.assertEqual(gg.mock_calls[-1], call(k))
157 a7aacf12 Stavros Sachtouris
158 a7aacf12 Stavros Sachtouris
    def test_get_cloud(self):
159 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
160 a7aacf12 Stavros Sachtouris
        c.value = None
161 c89d5f34 Stavros Sachtouris
        with patch(
162 c89d5f34 Stavros Sachtouris
                '%s.get_cloud' % cnf_path,
163 c89d5f34 Stavros Sachtouris
                return_value='http://cloud') as get_cloud:
164 c89d5f34 Stavros Sachtouris
            self.assertTrue(len(c.get_cloud('mycloud', 'url')) > 0)
165 c89d5f34 Stavros Sachtouris
            self.assertEqual(get_cloud.mock_calls[-1],  call('mycloud', 'url'))
166 c89d5f34 Stavros Sachtouris
        with patch(
167 c89d5f34 Stavros Sachtouris
                '%s.get_cloud' % cnf_path,
168 c89d5f34 Stavros Sachtouris
                side_effect=KeyError('no token')) as get_cloud:
169 c89d5f34 Stavros Sachtouris
            self.assertRaises(KeyError, c.get_cloud, 'mycloud', 'token')
170 c89d5f34 Stavros Sachtouris
        invalidcloud = 'PLEASE_DO_NOT_EVER_NAME_YOUR_CLOUD_LIKE_THIS111'
171 c89d5f34 Stavros Sachtouris
        self.assertRaises(KeyError, c.get_cloud, invalidcloud, 'url')
172 a7aacf12 Stavros Sachtouris
173 a7aacf12 Stavros Sachtouris
174 1bd4f765 Stavros Sachtouris
class RuntimeConfigArgument(TestCase):
175 1bd4f765 Stavros Sachtouris
176 1bd4f765 Stavros Sachtouris
    def setUp(self):
177 1bd4f765 Stavros Sachtouris
        argument._config_arg = argument.ConfigArgument('Recovered Path')
178 1bd4f765 Stavros Sachtouris
179 1bd4f765 Stavros Sachtouris
    @patch('kamaki.cli.argument.Argument.__init__')
180 1bd4f765 Stavros Sachtouris
    def test___init__(self, arg):
181 1bd4f765 Stavros Sachtouris
        config, help, pname, default = 'config', 'help', 'pname', 'default'
182 1bd4f765 Stavros Sachtouris
        rca = argument.RuntimeConfigArgument(config, help, pname, default)
183 1bd4f765 Stavros Sachtouris
        self.assertTrue(isinstance(rca, argument.RuntimeConfigArgument))
184 1bd4f765 Stavros Sachtouris
        self.assertEqual(rca._config_arg, config)
185 1bd4f765 Stavros Sachtouris
        self.assertEqual(arg.mock_calls[-1], call(1, help, pname, default))
186 1bd4f765 Stavros Sachtouris
187 34c480f2 Stavros Sachtouris
    @patch('%s.override' % cnf_path)
188 34c480f2 Stavros Sachtouris
    def test_value(self, override):
189 34c480f2 Stavros Sachtouris
        config, help, pname, default = argument._config_arg, 'help', '-n', 'df'
190 34c480f2 Stavros Sachtouris
        config.value = None
191 34c480f2 Stavros Sachtouris
        rca = argument.RuntimeConfigArgument(config, help, pname, default)
192 34c480f2 Stavros Sachtouris
        self.assertEqual(rca.value, default)
193 34c480f2 Stavros Sachtouris
194 34c480f2 Stavros Sachtouris
        for options in ('grp', 'grp.opt', 'k v', '=nokey', 2.8, None, 42, ''):
195 34c480f2 Stavros Sachtouris
            self.assertRaises(TypeError, rca.value, options)
196 34c480f2 Stavros Sachtouris
197 34c480f2 Stavros Sachtouris
        for options in ('key=val', 'grp.key=val', 'dotted.opt.key=val'):
198 34c480f2 Stavros Sachtouris
            rca.value = options
199 34c480f2 Stavros Sachtouris
            option, sep, val = options.partition('=')
200 34c480f2 Stavros Sachtouris
            grp, sep, key = option.partition('.')
201 34c480f2 Stavros Sachtouris
            grp, key = (grp, key) if key else ('global', grp)
202 34c480f2 Stavros Sachtouris
            self.assertEqual(override.mock_calls[-1], call(grp, key, val))
203 1bd4f765 Stavros Sachtouris
204 3a5b1ceb Stavros Sachtouris
205 3a5b1ceb Stavros Sachtouris
class FlagArgument(TestCase):
206 3a5b1ceb Stavros Sachtouris
207 3a5b1ceb Stavros Sachtouris
    @patch('kamaki.cli.argument.Argument.__init__')
208 3a5b1ceb Stavros Sachtouris
    def test___init__(self, arg):
209 3a5b1ceb Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
210 3a5b1ceb Stavros Sachtouris
        fa = argument.FlagArgument(help, pname, default)
211 3a5b1ceb Stavros Sachtouris
        self.assertTrue(isinstance(fa, argument.FlagArgument))
212 3a5b1ceb Stavros Sachtouris
        arg.assert_called_once(0, help, pname, default)
213 3a5b1ceb Stavros Sachtouris
214 3a5b1ceb Stavros Sachtouris
215 3a5b1ceb Stavros Sachtouris
class ValueArgument(TestCase):
216 3a5b1ceb Stavros Sachtouris
217 3a5b1ceb Stavros Sachtouris
    @patch('kamaki.cli.argument.Argument.__init__')
218 3a5b1ceb Stavros Sachtouris
    def test___init__(self, arg):
219 3a5b1ceb Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
220 3a5b1ceb Stavros Sachtouris
        fa = argument.ValueArgument(help, pname, default)
221 3a5b1ceb Stavros Sachtouris
        self.assertTrue(isinstance(fa, argument.ValueArgument))
222 3a5b1ceb Stavros Sachtouris
        arg.assert_called_once(1, help, pname, default)
223 3a5b1ceb Stavros Sachtouris
224 3a5b1ceb Stavros Sachtouris
225 02987e9c Stavros Sachtouris
class IntArgument(TestCase):
226 02987e9c Stavros Sachtouris
227 02987e9c Stavros Sachtouris
    def test_value(self):
228 02987e9c Stavros Sachtouris
        ia = argument.IntArgument(parsed_name='--ia')
229 02987e9c Stavros Sachtouris
        self.assertEqual(ia.value, None)
230 02987e9c Stavros Sachtouris
        for v in (1, 0, -1, 923455555555555555555555555555555):
231 02987e9c Stavros Sachtouris
            ia.value = v
232 02987e9c Stavros Sachtouris
            self.assertEqual(ia.value, v)
233 02987e9c Stavros Sachtouris
        for v in ('1', '-1', 2.8):
234 02987e9c Stavros Sachtouris
            ia.value = v
235 02987e9c Stavros Sachtouris
            self.assertEqual(ia.value, int(v))
236 02987e9c Stavros Sachtouris
        for v, err in (
237 02987e9c Stavros Sachtouris
                ('invalid', errors.CLIError),
238 02987e9c Stavros Sachtouris
                (None, TypeError), (False, TypeError), ([1, 2, 3], TypeError)):
239 02987e9c Stavros Sachtouris
            try:
240 02987e9c Stavros Sachtouris
                ia.value = v
241 02987e9c Stavros Sachtouris
            except Exception as e:
242 02987e9c Stavros Sachtouris
                self.assertTrue(isinstance(e, err))
243 02987e9c Stavros Sachtouris
244 02987e9c Stavros Sachtouris
245 b7ff6e0c Stavros Sachtouris
class DateArgument(TestCase):
246 b7ff6e0c Stavros Sachtouris
247 b7ff6e0c Stavros Sachtouris
    def test_timestamp(self):
248 b7ff6e0c Stavros Sachtouris
        da = argument.DateArgument(parsed_name='--date')
249 b7ff6e0c Stavros Sachtouris
        self.assertEqual(da.timestamp, None)
250 b7ff6e0c Stavros Sachtouris
        date, format, exp = '24-10-1917', '%d-%m-%Y', -1646964000.0
251 b7ff6e0c Stavros Sachtouris
        da._value = argument.dtm.strptime(date, format)
252 b7ff6e0c Stavros Sachtouris
        self.assertEqual(da.timestamp, exp)
253 b7ff6e0c Stavros Sachtouris
254 b7ff6e0c Stavros Sachtouris
    def test_formated(self):
255 b7ff6e0c Stavros Sachtouris
        da = argument.DateArgument(parsed_name='--date')
256 b7ff6e0c Stavros Sachtouris
        self.assertEqual(da.formated, None)
257 b7ff6e0c Stavros Sachtouris
        date, format, exp = (
258 b7ff6e0c Stavros Sachtouris
            '24-10-1917', '%d-%m-%Y', 'Wed Oct 24 00:00:00 1917')
259 b7ff6e0c Stavros Sachtouris
        da._value = argument.dtm.strptime(date, format)
260 b7ff6e0c Stavros Sachtouris
        self.assertEqual(da.formated, exp)
261 b7ff6e0c Stavros Sachtouris
262 b7ff6e0c Stavros Sachtouris
    @patch('kamaki.cli.argument.DateArgument.timestamp')
263 b7ff6e0c Stavros Sachtouris
    @patch('kamaki.cli.argument.DateArgument.format_date')
264 b7ff6e0c Stavros Sachtouris
    def test_value(self, format_date, timestamp):
265 b7ff6e0c Stavros Sachtouris
        da = argument.DateArgument(parsed_name='--date')
266 b7ff6e0c Stavros Sachtouris
        self.assertTrue(isinstance(da.value, MagicMock))
267 b7ff6e0c Stavros Sachtouris
        da.value = 'Something'
268 b7ff6e0c Stavros Sachtouris
        format_date.assert_called_once(call('Something'))
269 b7ff6e0c Stavros Sachtouris
270 b7ff6e0c Stavros Sachtouris
    def test_format_date(self):
271 b7ff6e0c Stavros Sachtouris
        da = argument.DateArgument(parsed_name='--date')
272 b7ff6e0c Stavros Sachtouris
        for datestr, exp in (
273 b7ff6e0c Stavros Sachtouris
                ('Wed Oct 24 01:02:03 1917', datetime(1917, 10, 24, 1, 2, 3)),
274 b7ff6e0c Stavros Sachtouris
                ('24-10-1917', datetime(1917, 10, 24)),
275 b7ff6e0c Stavros Sachtouris
                ('01:02:03 24-10-1917', datetime(1917, 10, 24, 1, 2, 3))):
276 b7ff6e0c Stavros Sachtouris
            self.assertEqual(da.format_date(datestr), exp)
277 b7ff6e0c Stavros Sachtouris
        for datestr, err in (
278 b7ff6e0c Stavros Sachtouris
                ('32-40-20134', errors.CLIError),
279 b7ff6e0c Stavros Sachtouris
                ('Wednesday, 24 Oct 2017', errors.CLIError),
280 b7ff6e0c Stavros Sachtouris
                (None, TypeError), (0.8, TypeError)):
281 b7ff6e0c Stavros Sachtouris
            self.assertRaises(err, da.format_date, datestr)
282 b7ff6e0c Stavros Sachtouris
283 b7ff6e0c Stavros Sachtouris
284 8d427cb9 Stavros Sachtouris
class VersionArgument(TestCase):
285 8d427cb9 Stavros Sachtouris
286 8d427cb9 Stavros Sachtouris
    def test_value(self):
287 8d427cb9 Stavros Sachtouris
        va = argument.VersionArgument(parsed_name='--version')
288 8d427cb9 Stavros Sachtouris
        self.assertTrue(va, argument.VersionArgument)
289 8d427cb9 Stavros Sachtouris
        va.value = 'some value'
290 8d427cb9 Stavros Sachtouris
        self.assertEqual(va.value, 'some value')
291 8d427cb9 Stavros Sachtouris
292 8d427cb9 Stavros Sachtouris
293 8d427cb9 Stavros Sachtouris
class KeyValueArgument(TestCase):
294 8d427cb9 Stavros Sachtouris
295 8d427cb9 Stavros Sachtouris
    @patch('kamaki.cli.argument.Argument.__init__')
296 8d427cb9 Stavros Sachtouris
    def test___init__(self, init):
297 8d427cb9 Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
298 8d427cb9 Stavros Sachtouris
        kva = argument.KeyValueArgument(help, pname, default)
299 8d427cb9 Stavros Sachtouris
        self.assertTrue(isinstance(kva, argument.KeyValueArgument))
300 8d427cb9 Stavros Sachtouris
        self.assertEqual(init.mock_calls[-1], call(-1, help, pname, default))
301 8d427cb9 Stavros Sachtouris
302 8d427cb9 Stavros Sachtouris
    def test_value(self):
303 8d427cb9 Stavros Sachtouris
        kva = argument.KeyValueArgument(parsed_name='--keyval')
304 8d427cb9 Stavros Sachtouris
        self.assertEqual(kva.value, None)
305 8d427cb9 Stavros Sachtouris
        for kvpairs in (
306 8d427cb9 Stavros Sachtouris
                'strval', 'key=val', 2.8, 42, None,
307 8d427cb9 Stavros Sachtouris
                ('key', 'val'), ('key val'), ['=val', 'key=val'],
308 8d427cb9 Stavros Sachtouris
                ['key1=val1', 'key2 val2'], ('key1 = val1', )):
309 8d427cb9 Stavros Sachtouris
            self.assertRaises(errors.CLIError, kva.value, kvpairs)
310 8d427cb9 Stavros Sachtouris
        for kvpairs, exp in (
311 8d427cb9 Stavros Sachtouris
                (('key=val', ), {'key': 'val'}),
312 8d427cb9 Stavros Sachtouris
                (['key1=val1', 'key2=val2'], {'key1': 'val1', 'key2': 'val2'}),
313 8d427cb9 Stavros Sachtouris
                (
314 8d427cb9 Stavros Sachtouris
                    ('k1=v1 v2', 'k3=', 'k 4=v4'),
315 8d427cb9 Stavros Sachtouris
                    {'k1': 'v1 v2', 'k3': '', 'k 4': 'v4'}),
316 8d427cb9 Stavros Sachtouris
                (('k=v1', 'k=v2', 'k=v3'), {'k': 'v3'})
317 8d427cb9 Stavros Sachtouris
            ):
318 8d427cb9 Stavros Sachtouris
            kva.value = kvpairs
319 8d427cb9 Stavros Sachtouris
            assert_dicts_are_equal(self, kva.value, exp)
320 8d427cb9 Stavros Sachtouris
321 8d427cb9 Stavros Sachtouris
322 c0fbf04c Stavros Sachtouris
class ProgressBarArgument(TestCase):
323 c0fbf04c Stavros Sachtouris
324 c0fbf04c Stavros Sachtouris
    class PseudoBar(object):
325 c0fbf04c Stavros Sachtouris
            message = ''
326 c0fbf04c Stavros Sachtouris
            suffix = ''
327 c0fbf04c Stavros Sachtouris
328 c0fbf04c Stavros Sachtouris
            def start():
329 c0fbf04c Stavros Sachtouris
                pass
330 c0fbf04c Stavros Sachtouris
331 c0fbf04c Stavros Sachtouris
    @patch('kamaki.cli.argument.FlagArgument.__init__')
332 c0fbf04c Stavros Sachtouris
    def test___init__(self, init):
333 c0fbf04c Stavros Sachtouris
        help, pname, default = 'help', '--progress', 'default'
334 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(help, pname, default)
335 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba, argument.ProgressBarArgument))
336 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.suffix, '%(percent)d%%')
337 c0fbf04c Stavros Sachtouris
        init.assert_called_once(help, pname, default)
338 c0fbf04c Stavros Sachtouris
339 c0fbf04c Stavros Sachtouris
    def test_clone(self):
340 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
341 c0fbf04c Stavros Sachtouris
        pba.value = None
342 c0fbf04c Stavros Sachtouris
        pba_clone = pba.clone()
343 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba, argument.ProgressBarArgument))
344 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba_clone, argument.ProgressBarArgument))
345 c0fbf04c Stavros Sachtouris
        self.assertNotEqual(pba, pba_clone)
346 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.parsed_name, pba_clone.parsed_name)
347 c0fbf04c Stavros Sachtouris
348 c0fbf04c Stavros Sachtouris
    def test_get_generator(self):
349 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
350 c0fbf04c Stavros Sachtouris
        pba.value = None
351 c0fbf04c Stavros Sachtouris
        msg, msg_len = 'message', 40
352 c0fbf04c Stavros Sachtouris
        with patch('kamaki.cli.argument.KamakiProgressBar.start') as start:
353 c0fbf04c Stavros Sachtouris
            pba.get_generator(msg, msg_len)
354 c0fbf04c Stavros Sachtouris
            self.assertTrue(isinstance(pba.bar, argument.KamakiProgressBar))
355 c0fbf04c Stavros Sachtouris
            self.assertNotEqual(pba.bar.message, msg)
356 c0fbf04c Stavros Sachtouris
            self.assertEqual(
357 c0fbf04c Stavros Sachtouris
                pba.bar.message, '%s%s' % (msg, ' ' * (msg_len - len(msg))))
358 c0fbf04c Stavros Sachtouris
            self.assertEqual(pba.bar.suffix, '%(percent)d%% - %(eta)ds')
359 c0fbf04c Stavros Sachtouris
            start.assert_called_once()
360 c0fbf04c Stavros Sachtouris
361 c0fbf04c Stavros Sachtouris
    def test_finish(self):
362 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
363 c0fbf04c Stavros Sachtouris
        pba.value = None
364 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.finish(), None)
365 c0fbf04c Stavros Sachtouris
        pba.bar = argument.KamakiProgressBar()
366 c0fbf04c Stavros Sachtouris
        with patch('kamaki.cli.argument.KamakiProgressBar.finish') as finish:
367 c0fbf04c Stavros Sachtouris
            pba.finish()
368 c0fbf04c Stavros Sachtouris
            finish.assert_called_once()
369 c0fbf04c Stavros Sachtouris
370 c0fbf04c Stavros Sachtouris
371 5286e2c3 Stavros Sachtouris
if __name__ == '__main__':
372 5286e2c3 Stavros Sachtouris
    from sys import argv
373 5286e2c3 Stavros Sachtouris
    from kamaki.cli.test import runTestCase
374 5286e2c3 Stavros Sachtouris
    runTestCase(Argument, 'Argument', argv[1:])
375 a7aacf12 Stavros Sachtouris
    runTestCase(ConfigArgument, 'ConfigArgument', argv[1:])
376 1bd4f765 Stavros Sachtouris
    runTestCase(RuntimeConfigArgument, 'RuntimeConfigArgument', argv[1:])
377 3a5b1ceb Stavros Sachtouris
    runTestCase(FlagArgument, 'FlagArgument', argv[1:])
378 3a5b1ceb Stavros Sachtouris
    runTestCase(FlagArgument, 'ValueArgument', argv[1:])
379 02987e9c Stavros Sachtouris
    runTestCase(IntArgument, 'IntArgument', argv[1:])
380 b7ff6e0c Stavros Sachtouris
    runTestCase(DateArgument, 'DateArgument', argv[1:])
381 8d427cb9 Stavros Sachtouris
    runTestCase(VersionArgument, 'VersionArgument', argv[1:])
382 8d427cb9 Stavros Sachtouris
    runTestCase(KeyValueArgument, 'KeyValueArgument', argv[1:])
383 c0fbf04c Stavros Sachtouris
    runTestCase(ProgressBarArgument, 'ProgressBarArgument', argv[1:])