Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / argument / test.py @ 38a79780

History | View | Annotate | Download (21 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 b57eaeb0 Stavros Sachtouris
arg_path = 'kamaki.cli.argument'
55 c89d5f34 Stavros Sachtouris
56 c89d5f34 Stavros Sachtouris
57 5286e2c3 Stavros Sachtouris
class Argument(TestCase):
58 5286e2c3 Stavros Sachtouris
59 5286e2c3 Stavros Sachtouris
    def test___init__(self):
60 5286e2c3 Stavros Sachtouris
        self.assertRaises(ValueError, argument.Argument, 'non-integer')
61 5286e2c3 Stavros Sachtouris
        self.assertRaises(AssertionError, argument.Argument, 1)
62 f17d6cb5 Stavros Sachtouris
        self.assertRaises(AssertionError, argument.Argument, 0, 'noname')
63 f17d6cb5 Stavros Sachtouris
        self.assertRaises(AssertionError, argument.Argument, 0, '--no name')
64 f17d6cb5 Stavros Sachtouris
        self.assertRaises(AssertionError, argument.Argument, 0, ['-n', 'n m'])
65 5286e2c3 Stavros Sachtouris
        for arity, help, parsed_name, default in (
66 5286e2c3 Stavros Sachtouris
                (0, 'help 0', '--zero', None),
67 5286e2c3 Stavros Sachtouris
                (1, 'help 1', ['--one', '-o'], 'lala'),
68 5286e2c3 Stavros Sachtouris
                (-1, 'help -1', ['--help', '--or', '--more'], 0),
69 5286e2c3 Stavros Sachtouris
                (0, 'help 0 again', ['--again', ], True)):
70 5286e2c3 Stavros Sachtouris
            a = argument.Argument(arity, help, parsed_name, default)
71 5286e2c3 Stavros Sachtouris
            if arity:
72 5286e2c3 Stavros Sachtouris
                self.assertEqual(arity, a.arity)
73 5286e2c3 Stavros Sachtouris
            self.assertEqual(help, a.help)
74 5286e2c3 Stavros Sachtouris
75 5286e2c3 Stavros Sachtouris
            exp_name = parsed_name if (
76 5286e2c3 Stavros Sachtouris
                isinstance(parsed_name, list)) else [parsed_name, ]
77 5286e2c3 Stavros Sachtouris
            self.assertEqual(exp_name, a.parsed_name)
78 5286e2c3 Stavros Sachtouris
79 f52b39db Stavros Sachtouris
            exp_default = default if (default or arity) else False
80 5286e2c3 Stavros Sachtouris
            self.assertEqual(exp_default, a.default)
81 5286e2c3 Stavros Sachtouris
82 f17d6cb5 Stavros Sachtouris
    def test_value(self):
83 f17d6cb5 Stavros Sachtouris
        a = argument.Argument(1, parsed_name='--value')
84 f17d6cb5 Stavros Sachtouris
        for value in (None, '', 0, 0.1, -12, [1, 'a', 2.8], (3, 'lala'), 'pi'):
85 f17d6cb5 Stavros Sachtouris
            a.value = value
86 f17d6cb5 Stavros Sachtouris
            self.assertEqual(value, a.value)
87 f17d6cb5 Stavros Sachtouris
88 f17d6cb5 Stavros Sachtouris
    def test_update_parser(self):
89 f17d6cb5 Stavros Sachtouris
        for i, arity in enumerate((-1, 0, 1)):
90 f17d6cb5 Stavros Sachtouris
            arp = argument.ArgumentParser()
91 f17d6cb5 Stavros Sachtouris
            pname, aname = '--pname%s' % i, 'a_name_%s' % i
92 f17d6cb5 Stavros Sachtouris
            a = argument.Argument(arity, 'args', pname, 42)
93 f17d6cb5 Stavros Sachtouris
            a.update_parser(arp, aname)
94 f17d6cb5 Stavros Sachtouris
95 f17d6cb5 Stavros Sachtouris
            f = StringIO()
96 f17d6cb5 Stavros Sachtouris
            arp.print_usage(file=f), f.seek(0)
97 f17d6cb5 Stavros Sachtouris
            usage, exp = f.readline(), '[%s%s]\n' % (
98 f17d6cb5 Stavros Sachtouris
                pname, (' %s' % aname.upper()) if arity else '')
99 f17d6cb5 Stavros Sachtouris
            self.assertEqual(usage[-len(exp):], exp)
100 f17d6cb5 Stavros Sachtouris
            del arp
101 f17d6cb5 Stavros Sachtouris
102 5286e2c3 Stavros Sachtouris
103 a7aacf12 Stavros Sachtouris
class ConfigArgument(TestCase):
104 a7aacf12 Stavros Sachtouris
105 a7aacf12 Stavros Sachtouris
    def setUp(self):
106 a7aacf12 Stavros Sachtouris
        argument._config_arg = argument.ConfigArgument('Recovered Path')
107 a7aacf12 Stavros Sachtouris
108 a7aacf12 Stavros Sachtouris
    def test_value(self):
109 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
110 a7aacf12 Stavros Sachtouris
        self.assertEqual(c.value, None)
111 a7aacf12 Stavros Sachtouris
        exp = '/some/random/path'
112 a7aacf12 Stavros Sachtouris
        c.value = exp
113 a7aacf12 Stavros Sachtouris
        self.assertTrue(isinstance(c.value, Config))
114 a7aacf12 Stavros Sachtouris
        self.assertEqual(c.file_path, exp)
115 a7aacf12 Stavros Sachtouris
        self.assertEqual(c.value.path, exp)
116 a7aacf12 Stavros Sachtouris
117 a7aacf12 Stavros Sachtouris
    def test_get(self):
118 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
119 a7aacf12 Stavros Sachtouris
        c.value = None
120 c89d5f34 Stavros Sachtouris
        with patch('%s.get' % cnf_path, return_value='config') as get:
121 c89d5f34 Stavros Sachtouris
            self.assertEqual(c.value.get('global', 'config_cli'), 'config')
122 c89d5f34 Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call('global', 'config_cli'))
123 a7aacf12 Stavros Sachtouris
124 c89d5f34 Stavros Sachtouris
    @patch('%s.keys' % cnf_path, return_value=(
125 c89d5f34 Stavros Sachtouris
        'image_cli', 'config_cli', 'history_cli', 'file'))
126 c89d5f34 Stavros Sachtouris
    def test_groups(self, keys):
127 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
128 a7aacf12 Stavros Sachtouris
        c.value = None
129 c89d5f34 Stavros Sachtouris
        cset = set(c.groups)
130 c89d5f34 Stavros Sachtouris
        self.assertTrue(cset.issuperset(['image', 'config', 'history']))
131 c89d5f34 Stavros Sachtouris
        self.assertEqual(keys.mock_calls[-1], call('global'))
132 c89d5f34 Stavros Sachtouris
        self.assertFalse('file' in cset)
133 c89d5f34 Stavros Sachtouris
        self.assertEqual(keys.mock_calls[-1], call('global'))
134 c89d5f34 Stavros Sachtouris
135 c89d5f34 Stavros Sachtouris
    @patch('%s.items' % cnf_path, return_value=(
136 c89d5f34 Stavros Sachtouris
        ('image_cli', 'image'), ('file', 'pithos'),
137 c89d5f34 Stavros Sachtouris
        ('config_cli', 'config'), ('history_cli', 'history')))
138 c89d5f34 Stavros Sachtouris
    def test_cli_specs(self, items):
139 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
140 a7aacf12 Stavros Sachtouris
        c.value = None
141 c89d5f34 Stavros Sachtouris
        cset = set(c.cli_specs)
142 c89d5f34 Stavros Sachtouris
        self.assertTrue(cset.issuperset([
143 a7aacf12 Stavros Sachtouris
            ('image', 'image'), ('config', 'config'), ('history', 'history')]))
144 c89d5f34 Stavros Sachtouris
        self.assertEqual(items.mock_calls[-1], call('global'))
145 c89d5f34 Stavros Sachtouris
        self.assertFalse(cset.issuperset([('file', 'pithos'), ]))
146 c89d5f34 Stavros Sachtouris
        self.assertEqual(items.mock_calls[-1], call('global'))
147 a7aacf12 Stavros Sachtouris
148 a7aacf12 Stavros Sachtouris
    def test_get_global(self):
149 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
150 a7aacf12 Stavros Sachtouris
        c.value = None
151 a7aacf12 Stavros Sachtouris
        for k, v in (
152 a7aacf12 Stavros Sachtouris
                ('config_cli', 'config'),
153 a7aacf12 Stavros Sachtouris
                ('image_cli', 'image'),
154 a7aacf12 Stavros Sachtouris
                ('history_cli', 'history')):
155 534e7bbb Stavros Sachtouris
            with patch('%s.get' % cnf_path, return_value=v) as gg:
156 c89d5f34 Stavros Sachtouris
                self.assertEqual(c.get_global(k), v)
157 534e7bbb Stavros Sachtouris
                self.assertEqual(gg.mock_calls[-1], call('global', k))
158 a7aacf12 Stavros Sachtouris
159 a7aacf12 Stavros Sachtouris
    def test_get_cloud(self):
160 a7aacf12 Stavros Sachtouris
        c = argument._config_arg
161 a7aacf12 Stavros Sachtouris
        c.value = None
162 c89d5f34 Stavros Sachtouris
        with patch(
163 c89d5f34 Stavros Sachtouris
                '%s.get_cloud' % cnf_path,
164 c89d5f34 Stavros Sachtouris
                return_value='http://cloud') as get_cloud:
165 c89d5f34 Stavros Sachtouris
            self.assertTrue(len(c.get_cloud('mycloud', 'url')) > 0)
166 c89d5f34 Stavros Sachtouris
            self.assertEqual(get_cloud.mock_calls[-1],  call('mycloud', 'url'))
167 c89d5f34 Stavros Sachtouris
        with patch(
168 c89d5f34 Stavros Sachtouris
                '%s.get_cloud' % cnf_path,
169 c89d5f34 Stavros Sachtouris
                side_effect=KeyError('no token')) as get_cloud:
170 c89d5f34 Stavros Sachtouris
            self.assertRaises(KeyError, c.get_cloud, 'mycloud', 'token')
171 c89d5f34 Stavros Sachtouris
        invalidcloud = 'PLEASE_DO_NOT_EVER_NAME_YOUR_CLOUD_LIKE_THIS111'
172 c89d5f34 Stavros Sachtouris
        self.assertRaises(KeyError, c.get_cloud, invalidcloud, 'url')
173 a7aacf12 Stavros Sachtouris
174 a7aacf12 Stavros Sachtouris
175 1bd4f765 Stavros Sachtouris
class RuntimeConfigArgument(TestCase):
176 1bd4f765 Stavros Sachtouris
177 1bd4f765 Stavros Sachtouris
    def setUp(self):
178 1bd4f765 Stavros Sachtouris
        argument._config_arg = argument.ConfigArgument('Recovered Path')
179 1bd4f765 Stavros Sachtouris
180 b57eaeb0 Stavros Sachtouris
    @patch('%s.Argument.__init__' % arg_path)
181 1bd4f765 Stavros Sachtouris
    def test___init__(self, arg):
182 1bd4f765 Stavros Sachtouris
        config, help, pname, default = 'config', 'help', 'pname', 'default'
183 1bd4f765 Stavros Sachtouris
        rca = argument.RuntimeConfigArgument(config, help, pname, default)
184 1bd4f765 Stavros Sachtouris
        self.assertTrue(isinstance(rca, argument.RuntimeConfigArgument))
185 1bd4f765 Stavros Sachtouris
        self.assertEqual(rca._config_arg, config)
186 1bd4f765 Stavros Sachtouris
        self.assertEqual(arg.mock_calls[-1], call(1, help, pname, default))
187 1bd4f765 Stavros Sachtouris
188 34c480f2 Stavros Sachtouris
    @patch('%s.override' % cnf_path)
189 34c480f2 Stavros Sachtouris
    def test_value(self, override):
190 34c480f2 Stavros Sachtouris
        config, help, pname, default = argument._config_arg, 'help', '-n', 'df'
191 34c480f2 Stavros Sachtouris
        config.value = None
192 34c480f2 Stavros Sachtouris
        rca = argument.RuntimeConfigArgument(config, help, pname, default)
193 34c480f2 Stavros Sachtouris
        self.assertEqual(rca.value, default)
194 34c480f2 Stavros Sachtouris
195 34c480f2 Stavros Sachtouris
        for options in ('grp', 'grp.opt', 'k v', '=nokey', 2.8, None, 42, ''):
196 34c480f2 Stavros Sachtouris
            self.assertRaises(TypeError, rca.value, options)
197 34c480f2 Stavros Sachtouris
198 34c480f2 Stavros Sachtouris
        for options in ('key=val', 'grp.key=val', 'dotted.opt.key=val'):
199 34c480f2 Stavros Sachtouris
            rca.value = options
200 34c480f2 Stavros Sachtouris
            option, sep, val = options.partition('=')
201 34c480f2 Stavros Sachtouris
            grp, sep, key = option.partition('.')
202 34c480f2 Stavros Sachtouris
            grp, key = (grp, key) if key else ('global', grp)
203 34c480f2 Stavros Sachtouris
            self.assertEqual(override.mock_calls[-1], call(grp, key, val))
204 1bd4f765 Stavros Sachtouris
205 3a5b1ceb Stavros Sachtouris
206 3a5b1ceb Stavros Sachtouris
class FlagArgument(TestCase):
207 3a5b1ceb Stavros Sachtouris
208 b57eaeb0 Stavros Sachtouris
    @patch('%s.Argument.__init__' % arg_path)
209 3a5b1ceb Stavros Sachtouris
    def test___init__(self, arg):
210 3a5b1ceb Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
211 3a5b1ceb Stavros Sachtouris
        fa = argument.FlagArgument(help, pname, default)
212 3a5b1ceb Stavros Sachtouris
        self.assertTrue(isinstance(fa, argument.FlagArgument))
213 3a5b1ceb Stavros Sachtouris
        arg.assert_called_once(0, help, pname, default)
214 3a5b1ceb Stavros Sachtouris
215 3a5b1ceb Stavros Sachtouris
216 3a5b1ceb Stavros Sachtouris
class ValueArgument(TestCase):
217 3a5b1ceb Stavros Sachtouris
218 b57eaeb0 Stavros Sachtouris
    @patch('%s.Argument.__init__' % arg_path)
219 3a5b1ceb Stavros Sachtouris
    def test___init__(self, arg):
220 3a5b1ceb Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
221 3a5b1ceb Stavros Sachtouris
        fa = argument.ValueArgument(help, pname, default)
222 3a5b1ceb Stavros Sachtouris
        self.assertTrue(isinstance(fa, argument.ValueArgument))
223 3a5b1ceb Stavros Sachtouris
        arg.assert_called_once(1, help, pname, default)
224 3a5b1ceb Stavros Sachtouris
225 3a5b1ceb Stavros Sachtouris
226 02987e9c Stavros Sachtouris
class IntArgument(TestCase):
227 02987e9c Stavros Sachtouris
228 02987e9c Stavros Sachtouris
    def test_value(self):
229 02987e9c Stavros Sachtouris
        ia = argument.IntArgument(parsed_name='--ia')
230 02987e9c Stavros Sachtouris
        self.assertEqual(ia.value, None)
231 4a25486d Stavros Sachtouris
        for v in (1, 0, -1):
232 02987e9c Stavros Sachtouris
            ia.value = v
233 02987e9c Stavros Sachtouris
            self.assertEqual(ia.value, v)
234 4a25486d Stavros Sachtouris
        for v in ('1', '-1'):
235 02987e9c Stavros Sachtouris
            ia.value = v
236 02987e9c Stavros Sachtouris
            self.assertEqual(ia.value, int(v))
237 02987e9c Stavros Sachtouris
        for v, err in (
238 02987e9c Stavros Sachtouris
                ('invalid', errors.CLIError),
239 4a25486d Stavros Sachtouris
                (2.8, errors.CLIError),
240 4a25486d Stavros Sachtouris
                (923455555555555555555555555555555, errors.CLIError),
241 02987e9c Stavros Sachtouris
                (None, TypeError), (False, TypeError), ([1, 2, 3], TypeError)):
242 02987e9c Stavros Sachtouris
            try:
243 02987e9c Stavros Sachtouris
                ia.value = v
244 02987e9c Stavros Sachtouris
            except Exception as e:
245 02987e9c Stavros Sachtouris
                self.assertTrue(isinstance(e, err))
246 02987e9c Stavros Sachtouris
247 02987e9c Stavros Sachtouris
248 b7ff6e0c Stavros Sachtouris
class DateArgument(TestCase):
249 b7ff6e0c Stavros Sachtouris
250 b7ff6e0c Stavros Sachtouris
    def test_timestamp(self):
251 b7ff6e0c Stavros Sachtouris
        da = argument.DateArgument(parsed_name='--date')
252 b7ff6e0c Stavros Sachtouris
        self.assertEqual(da.timestamp, None)
253 b7ff6e0c Stavros Sachtouris
        date, format, exp = '24-10-1917', '%d-%m-%Y', -1646964000.0
254 b7ff6e0c Stavros Sachtouris
        da._value = argument.dtm.strptime(date, format)
255 b7ff6e0c Stavros Sachtouris
        self.assertEqual(da.timestamp, exp)
256 b7ff6e0c Stavros Sachtouris
257 b7ff6e0c Stavros Sachtouris
    def test_formated(self):
258 b7ff6e0c Stavros Sachtouris
        da = argument.DateArgument(parsed_name='--date')
259 b7ff6e0c Stavros Sachtouris
        self.assertEqual(da.formated, None)
260 b7ff6e0c Stavros Sachtouris
        date, format, exp = (
261 b7ff6e0c Stavros Sachtouris
            '24-10-1917', '%d-%m-%Y', 'Wed Oct 24 00:00:00 1917')
262 b7ff6e0c Stavros Sachtouris
        da._value = argument.dtm.strptime(date, format)
263 b7ff6e0c Stavros Sachtouris
        self.assertEqual(da.formated, exp)
264 b7ff6e0c Stavros Sachtouris
265 b57eaeb0 Stavros Sachtouris
    @patch('%s.DateArgument.timestamp' % arg_path)
266 b57eaeb0 Stavros Sachtouris
    @patch('%s.DateArgument.format_date' % arg_path)
267 b7ff6e0c Stavros Sachtouris
    def test_value(self, format_date, timestamp):
268 b7ff6e0c Stavros Sachtouris
        da = argument.DateArgument(parsed_name='--date')
269 b7ff6e0c Stavros Sachtouris
        self.assertTrue(isinstance(da.value, MagicMock))
270 b7ff6e0c Stavros Sachtouris
        da.value = 'Something'
271 b7ff6e0c Stavros Sachtouris
        format_date.assert_called_once(call('Something'))
272 b7ff6e0c Stavros Sachtouris
273 b7ff6e0c Stavros Sachtouris
    def test_format_date(self):
274 b7ff6e0c Stavros Sachtouris
        da = argument.DateArgument(parsed_name='--date')
275 b7ff6e0c Stavros Sachtouris
        for datestr, exp in (
276 b7ff6e0c Stavros Sachtouris
                ('Wed Oct 24 01:02:03 1917', datetime(1917, 10, 24, 1, 2, 3)),
277 b7ff6e0c Stavros Sachtouris
                ('24-10-1917', datetime(1917, 10, 24)),
278 b7ff6e0c Stavros Sachtouris
                ('01:02:03 24-10-1917', datetime(1917, 10, 24, 1, 2, 3))):
279 b7ff6e0c Stavros Sachtouris
            self.assertEqual(da.format_date(datestr), exp)
280 b7ff6e0c Stavros Sachtouris
        for datestr, err in (
281 b7ff6e0c Stavros Sachtouris
                ('32-40-20134', errors.CLIError),
282 b7ff6e0c Stavros Sachtouris
                ('Wednesday, 24 Oct 2017', errors.CLIError),
283 b7ff6e0c Stavros Sachtouris
                (None, TypeError), (0.8, TypeError)):
284 b7ff6e0c Stavros Sachtouris
            self.assertRaises(err, da.format_date, datestr)
285 b7ff6e0c Stavros Sachtouris
286 b7ff6e0c Stavros Sachtouris
287 8d427cb9 Stavros Sachtouris
class VersionArgument(TestCase):
288 8d427cb9 Stavros Sachtouris
289 8d427cb9 Stavros Sachtouris
    def test_value(self):
290 8d427cb9 Stavros Sachtouris
        va = argument.VersionArgument(parsed_name='--version')
291 8d427cb9 Stavros Sachtouris
        self.assertTrue(va, argument.VersionArgument)
292 8d427cb9 Stavros Sachtouris
        va.value = 'some value'
293 8d427cb9 Stavros Sachtouris
        self.assertEqual(va.value, 'some value')
294 8d427cb9 Stavros Sachtouris
295 8d427cb9 Stavros Sachtouris
296 ca5528f1 Stavros Sachtouris
class RepeatableArgument(TestCase):
297 ca5528f1 Stavros Sachtouris
298 ca5528f1 Stavros Sachtouris
    @patch('%s.Argument.__init__' % arg_path)
299 ca5528f1 Stavros Sachtouris
    def test___init__(self, init):
300 ca5528f1 Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
301 ca5528f1 Stavros Sachtouris
        kva = argument.RepeatableArgument(help, pname, default)
302 ca5528f1 Stavros Sachtouris
        self.assertTrue(isinstance(kva, argument.RepeatableArgument))
303 ca5528f1 Stavros Sachtouris
        self.assertEqual(init.mock_calls[-1], call(-1, help, pname, default))
304 ca5528f1 Stavros Sachtouris
305 ca5528f1 Stavros Sachtouris
306 8d427cb9 Stavros Sachtouris
class KeyValueArgument(TestCase):
307 8d427cb9 Stavros Sachtouris
308 b57eaeb0 Stavros Sachtouris
    @patch('%s.Argument.__init__' % arg_path)
309 8d427cb9 Stavros Sachtouris
    def test___init__(self, init):
310 8d427cb9 Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
311 8d427cb9 Stavros Sachtouris
        kva = argument.KeyValueArgument(help, pname, default)
312 8d427cb9 Stavros Sachtouris
        self.assertTrue(isinstance(kva, argument.KeyValueArgument))
313 8d427cb9 Stavros Sachtouris
        self.assertEqual(init.mock_calls[-1], call(-1, help, pname, default))
314 8d427cb9 Stavros Sachtouris
315 8d427cb9 Stavros Sachtouris
    def test_value(self):
316 8d427cb9 Stavros Sachtouris
        kva = argument.KeyValueArgument(parsed_name='--keyval')
317 2d1202ee Stavros Sachtouris
        self.assertEqual(kva.value, [])
318 8d427cb9 Stavros Sachtouris
        for kvpairs in (
319 8d427cb9 Stavros Sachtouris
                'strval', 'key=val', 2.8, 42, None,
320 8d427cb9 Stavros Sachtouris
                ('key', 'val'), ('key val'), ['=val', 'key=val'],
321 8d427cb9 Stavros Sachtouris
                ['key1=val1', 'key2 val2'], ('key1 = val1', )):
322 f52b39db Stavros Sachtouris
            try:
323 f52b39db Stavros Sachtouris
                kva.value = kvpairs
324 f52b39db Stavros Sachtouris
            except Exception as e:
325 f52b39db Stavros Sachtouris
                self.assertTrue(isinstance(e, errors.CLIError))
326 2d1202ee Stavros Sachtouris
        old = dict()
327 2d1202ee Stavros Sachtouris
        kva = argument.KeyValueArgument(parsed_name='--keyval')
328 8d427cb9 Stavros Sachtouris
        for kvpairs, exp in (
329 8d427cb9 Stavros Sachtouris
                (('key=val', ), {'key': 'val'}),
330 8d427cb9 Stavros Sachtouris
                (['key1=val1', 'key2=val2'], {'key1': 'val1', 'key2': 'val2'}),
331 8d427cb9 Stavros Sachtouris
                (
332 8d427cb9 Stavros Sachtouris
                    ('k1=v1 v2', 'k3=', 'k 4=v4'),
333 8d427cb9 Stavros Sachtouris
                    {'k1': 'v1 v2', 'k3': '', 'k 4': 'v4'}),
334 8d427cb9 Stavros Sachtouris
                (('k=v1', 'k=v2', 'k=v3'), {'k': 'v3'})
335 8d427cb9 Stavros Sachtouris
            ):
336 8d427cb9 Stavros Sachtouris
            kva.value = kvpairs
337 2d1202ee Stavros Sachtouris
            old.update(exp)
338 2d1202ee Stavros Sachtouris
            assert_dicts_are_equal(self, kva.value, old)
339 8d427cb9 Stavros Sachtouris
340 8d427cb9 Stavros Sachtouris
341 c0fbf04c Stavros Sachtouris
class ProgressBarArgument(TestCase):
342 c0fbf04c Stavros Sachtouris
343 c0fbf04c Stavros Sachtouris
    class PseudoBar(object):
344 c0fbf04c Stavros Sachtouris
            message = ''
345 c0fbf04c Stavros Sachtouris
            suffix = ''
346 c0fbf04c Stavros Sachtouris
347 c0fbf04c Stavros Sachtouris
            def start():
348 c0fbf04c Stavros Sachtouris
                pass
349 c0fbf04c Stavros Sachtouris
350 b57eaeb0 Stavros Sachtouris
    @patch('%s.FlagArgument.__init__' % arg_path)
351 c0fbf04c Stavros Sachtouris
    def test___init__(self, init):
352 c0fbf04c Stavros Sachtouris
        help, pname, default = 'help', '--progress', 'default'
353 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(help, pname, default)
354 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba, argument.ProgressBarArgument))
355 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.suffix, '%(percent)d%%')
356 c0fbf04c Stavros Sachtouris
        init.assert_called_once(help, pname, default)
357 c0fbf04c Stavros Sachtouris
358 c0fbf04c Stavros Sachtouris
    def test_clone(self):
359 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
360 c0fbf04c Stavros Sachtouris
        pba.value = None
361 c0fbf04c Stavros Sachtouris
        pba_clone = pba.clone()
362 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba, argument.ProgressBarArgument))
363 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba_clone, argument.ProgressBarArgument))
364 c0fbf04c Stavros Sachtouris
        self.assertNotEqual(pba, pba_clone)
365 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.parsed_name, pba_clone.parsed_name)
366 c0fbf04c Stavros Sachtouris
367 c0fbf04c Stavros Sachtouris
    def test_get_generator(self):
368 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
369 c0fbf04c Stavros Sachtouris
        pba.value = None
370 c0fbf04c Stavros Sachtouris
        msg, msg_len = 'message', 40
371 b57eaeb0 Stavros Sachtouris
        with patch('%s.KamakiProgressBar.start' % arg_path) as start:
372 e9c73313 Stavros Sachtouris
            try:
373 e9c73313 Stavros Sachtouris
                pba.get_generator(msg, msg_len)
374 e9c73313 Stavros Sachtouris
                self.assertTrue(
375 e9c73313 Stavros Sachtouris
                    isinstance(pba.bar, argument.KamakiProgressBar))
376 e9c73313 Stavros Sachtouris
                self.assertNotEqual(pba.bar.message, msg)
377 e9c73313 Stavros Sachtouris
                self.assertEqual(pba.bar.message, '%s%s' % (
378 e9c73313 Stavros Sachtouris
                    msg, ' ' * (msg_len - len(msg))))
379 e9c73313 Stavros Sachtouris
                self.assertEqual(pba.bar.suffix, '%(percent)d%% - %(eta)ds')
380 e9c73313 Stavros Sachtouris
                start.assert_called_once()
381 e9c73313 Stavros Sachtouris
382 8547cd19 Stavros Sachtouris
                pba.get_generator(msg, msg_len, countdown=True)
383 e9c73313 Stavros Sachtouris
                self.assertTrue(
384 e9c73313 Stavros Sachtouris
                    isinstance(pba.bar, argument.KamakiProgressBar))
385 e9c73313 Stavros Sachtouris
                self.assertNotEqual(pba.bar.message, msg)
386 e9c73313 Stavros Sachtouris
                self.assertEqual(pba.bar.message, '%s%s' % (
387 e9c73313 Stavros Sachtouris
                    msg, ' ' * (msg_len - len(msg))))
388 8547cd19 Stavros Sachtouris
                self.assertEqual(pba.bar.suffix, '%(remaining)ds to timeout')
389 e9c73313 Stavros Sachtouris
            finally:
390 e9c73313 Stavros Sachtouris
                try:
391 e9c73313 Stavros Sachtouris
                    pba.finish()
392 e9c73313 Stavros Sachtouris
                except Exception:
393 e9c73313 Stavros Sachtouris
                    pass
394 c0fbf04c Stavros Sachtouris
395 c0fbf04c Stavros Sachtouris
    def test_finish(self):
396 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
397 c0fbf04c Stavros Sachtouris
        pba.value = None
398 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.finish(), None)
399 c0fbf04c Stavros Sachtouris
        pba.bar = argument.KamakiProgressBar()
400 b57eaeb0 Stavros Sachtouris
        with patch('%s.KamakiProgressBar.finish' % arg_path) as finish:
401 c0fbf04c Stavros Sachtouris
            pba.finish()
402 c0fbf04c Stavros Sachtouris
            finish.assert_called_once()
403 c0fbf04c Stavros Sachtouris
404 c0fbf04c Stavros Sachtouris
405 631b7c35 Stavros Sachtouris
class ArgumentParseManager(TestCase):
406 631b7c35 Stavros Sachtouris
407 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
408 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.update_parser' % arg_path)
409 631b7c35 Stavros Sachtouris
    def test___init__(self, parse, update_parser):
410 631b7c35 Stavros Sachtouris
        for arguments in (None, {'k1': 'v1', 'k2': 'v2'}):
411 631b7c35 Stavros Sachtouris
            apm = argument.ArgumentParseManager('exe', arguments)
412 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(apm, argument.ArgumentParseManager))
413 631b7c35 Stavros Sachtouris
414 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(apm.parser, argument.ArgumentParser))
415 631b7c35 Stavros Sachtouris
            self.assertFalse(apm.parser.add_help)
416 631b7c35 Stavros Sachtouris
            self.assertEqual(
417 631b7c35 Stavros Sachtouris
                apm.parser.formatter_class,
418 631b7c35 Stavros Sachtouris
                argument.RawDescriptionHelpFormatter)
419 631b7c35 Stavros Sachtouris
420 631b7c35 Stavros Sachtouris
            self.assertEqual(
421 631b7c35 Stavros Sachtouris
                apm.syntax, 'exe <cmd_group> [<cmd_subbroup> ...] <cmd>')
422 631b7c35 Stavros Sachtouris
            assert_dicts_are_equal(
423 631b7c35 Stavros Sachtouris
                self, apm.arguments,
424 631b7c35 Stavros Sachtouris
                arguments or argument._arguments)
425 631b7c35 Stavros Sachtouris
            self.assertFalse(apm._parser_modified)
426 631b7c35 Stavros Sachtouris
            self.assertEqual(apm._parsed, None)
427 631b7c35 Stavros Sachtouris
            self.assertEqual(apm._unparsed, None)
428 631b7c35 Stavros Sachtouris
            self.assertEqual(parse.mock_calls[-1], call())
429 631b7c35 Stavros Sachtouris
            if arguments:
430 631b7c35 Stavros Sachtouris
                update_parser.assert_called_once()
431 631b7c35 Stavros Sachtouris
432 631b7c35 Stavros Sachtouris
    def test_syntax(self):
433 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
434 631b7c35 Stavros Sachtouris
        self.assertEqual(
435 631b7c35 Stavros Sachtouris
            apm.syntax, 'exe <cmd_group> [<cmd_subbroup> ...] <cmd>')
436 631b7c35 Stavros Sachtouris
        apm.syntax = 'some syntax'
437 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.syntax, 'some syntax')
438 631b7c35 Stavros Sachtouris
439 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.update_parser' % arg_path)
440 631b7c35 Stavros Sachtouris
    def test_arguments(self, update_parser):
441 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
442 631b7c35 Stavros Sachtouris
        assert_dicts_are_equal(self, apm.arguments, argument._arguments)
443 631b7c35 Stavros Sachtouris
        update_parser.assert_called_once()
444 631b7c35 Stavros Sachtouris
        exp = {'k1': 'v1', 'k2': 'v2'}
445 631b7c35 Stavros Sachtouris
        apm.arguments = exp
446 631b7c35 Stavros Sachtouris
        assert_dicts_are_equal(self, apm.arguments, exp)
447 631b7c35 Stavros Sachtouris
        self.assertEqual(update_parser.mock_calls[-1], call())
448 631b7c35 Stavros Sachtouris
        try:
449 631b7c35 Stavros Sachtouris
            apm.arguments = None
450 631b7c35 Stavros Sachtouris
        except Exception as e:
451 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(e, AssertionError))
452 631b7c35 Stavros Sachtouris
453 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
454 631b7c35 Stavros Sachtouris
    def test_parsed(self, parse):
455 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
456 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, None)
457 631b7c35 Stavros Sachtouris
        exp = 'you have been parsed'
458 631b7c35 Stavros Sachtouris
        apm._parsed = exp
459 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, exp)
460 631b7c35 Stavros Sachtouris
        apm._parser_modified = True
461 631b7c35 Stavros Sachtouris
        apm._parsed = exp + ' v2'
462 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, exp + ' v2')
463 631b7c35 Stavros Sachtouris
        self.assertEqual(parse.mock_calls, [call(), call()])
464 631b7c35 Stavros Sachtouris
465 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
466 631b7c35 Stavros Sachtouris
    def test_unparsed(self, parse):
467 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
468 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, None)
469 631b7c35 Stavros Sachtouris
        exp = 'you have been unparsed'
470 631b7c35 Stavros Sachtouris
        apm._unparsed = exp
471 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, exp)
472 631b7c35 Stavros Sachtouris
        apm._parser_modified = True
473 631b7c35 Stavros Sachtouris
        apm._unparsed = exp + ' v2'
474 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, exp + ' v2')
475 631b7c35 Stavros Sachtouris
        self.assertEqual(parse.mock_calls, [call(), call()])
476 631b7c35 Stavros Sachtouris
477 b57eaeb0 Stavros Sachtouris
    @patch('%s.Argument.update_parser' % arg_path
478 b57eaeb0 Stavros Sachtouris
        )
479 631b7c35 Stavros Sachtouris
    def test_update_parser(self, update_parser):
480 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
481 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
482 631b7c35 Stavros Sachtouris
        exp = len(argument._arguments)
483 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp)
484 631b7c35 Stavros Sachtouris
        apm.update_parser()
485 631b7c35 Stavros Sachtouris
        exp = len(apm.arguments) + body_count
486 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
487 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp)
488 631b7c35 Stavros Sachtouris
        expd = dict(
489 631b7c35 Stavros Sachtouris
            k1=argument.Argument(0, parsed_name='-a'),
490 631b7c35 Stavros Sachtouris
            k2=argument.Argument(0, parsed_name='-b'))
491 631b7c35 Stavros Sachtouris
        apm.update_parser(expd)
492 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
493 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp + 2)
494 631b7c35 Stavros Sachtouris
495 b57eaeb0 Stavros Sachtouris
    def test_update_arguments(self):
496 b57eaeb0 Stavros Sachtouris
        (inp, cor, exp) = (
497 b57eaeb0 Stavros Sachtouris
            {'k1': 'v1', 'k2': 'v3'}, {'k2': 'v2'}, {'k1': 'v1', 'k2': 'v2'})
498 b57eaeb0 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
499 b57eaeb0 Stavros Sachtouris
        with patch(
500 b57eaeb0 Stavros Sachtouris
                '%s.ArgumentParseManager.update_parser' % arg_path) as UP:
501 b57eaeb0 Stavros Sachtouris
            apm.update_arguments(None)
502 b57eaeb0 Stavros Sachtouris
            self.assertEqual(len(UP.mock_calls), 0)
503 b57eaeb0 Stavros Sachtouris
            apm._arguments = inp
504 b57eaeb0 Stavros Sachtouris
            apm.update_arguments(cor)
505 b57eaeb0 Stavros Sachtouris
            assert_dicts_are_equal(self, apm.arguments, exp)
506 b57eaeb0 Stavros Sachtouris
            UP.assert_called_once_with()
507 b57eaeb0 Stavros Sachtouris
508 b57eaeb0 Stavros Sachtouris
    def test_parse(self):
509 264847a7 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
510 264847a7 Stavros Sachtouris
        parsed, unparsed = apm.parser.parse_known_args()
511 264847a7 Stavros Sachtouris
        apm.parse()
512 264847a7 Stavros Sachtouris
        self.assertEqual(apm._parsed, parsed)
513 264847a7 Stavros Sachtouris
        self.assertEqual(apm.unparsed, unparsed)
514 b57eaeb0 Stavros Sachtouris
515 b57eaeb0 Stavros Sachtouris
516 5286e2c3 Stavros Sachtouris
if __name__ == '__main__':
517 5286e2c3 Stavros Sachtouris
    from sys import argv
518 5286e2c3 Stavros Sachtouris
    from kamaki.cli.test import runTestCase
519 5286e2c3 Stavros Sachtouris
    runTestCase(Argument, 'Argument', argv[1:])
520 a7aacf12 Stavros Sachtouris
    runTestCase(ConfigArgument, 'ConfigArgument', argv[1:])
521 1bd4f765 Stavros Sachtouris
    runTestCase(RuntimeConfigArgument, 'RuntimeConfigArgument', argv[1:])
522 3a5b1ceb Stavros Sachtouris
    runTestCase(FlagArgument, 'FlagArgument', argv[1:])
523 3a5b1ceb Stavros Sachtouris
    runTestCase(FlagArgument, 'ValueArgument', argv[1:])
524 02987e9c Stavros Sachtouris
    runTestCase(IntArgument, 'IntArgument', argv[1:])
525 b7ff6e0c Stavros Sachtouris
    runTestCase(DateArgument, 'DateArgument', argv[1:])
526 8d427cb9 Stavros Sachtouris
    runTestCase(VersionArgument, 'VersionArgument', argv[1:])
527 ca5528f1 Stavros Sachtouris
    runTestCase(RepeatableArgument, 'RepeatableArgument', argv[1:])
528 8d427cb9 Stavros Sachtouris
    runTestCase(KeyValueArgument, 'KeyValueArgument', argv[1:])
529 c0fbf04c Stavros Sachtouris
    runTestCase(ProgressBarArgument, 'ProgressBarArgument', argv[1:])
530 631b7c35 Stavros Sachtouris
    runTestCase(ArgumentParseManager, 'ArgumentParseManager', argv[1:])