root / kamaki / cli / argument / test.py @ 2d1202ee
History | View | Annotate | Download (19.9 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 | c89d5f34 | Stavros Sachtouris | with patch('%s.get_global' % cnf_path, return_value=v) as gg: |
156 | c89d5f34 | Stavros Sachtouris | self.assertEqual(c.get_global(k), v)
|
157 | c89d5f34 | Stavros Sachtouris | self.assertEqual(gg.mock_calls[-1], call(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 | 02987e9c | Stavros Sachtouris | for v in (1, 0, -1, 923455555555555555555555555555555): |
232 | 02987e9c | Stavros Sachtouris | ia.value = v |
233 | 02987e9c | Stavros Sachtouris | self.assertEqual(ia.value, v)
|
234 | 02987e9c | Stavros Sachtouris | for v in ('1', '-1', 2.8): |
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 | 02987e9c | Stavros Sachtouris | (None, TypeError), (False, TypeError), ([1, 2, 3], TypeError)): |
240 | 02987e9c | Stavros Sachtouris | try:
|
241 | 02987e9c | Stavros Sachtouris | ia.value = v |
242 | 02987e9c | Stavros Sachtouris | except Exception as e: |
243 | 02987e9c | Stavros Sachtouris | self.assertTrue(isinstance(e, err)) |
244 | 02987e9c | Stavros Sachtouris | |
245 | 02987e9c | Stavros Sachtouris | |
246 | b7ff6e0c | Stavros Sachtouris | class DateArgument(TestCase): |
247 | b7ff6e0c | Stavros Sachtouris | |
248 | b7ff6e0c | Stavros Sachtouris | def test_timestamp(self): |
249 | b7ff6e0c | Stavros Sachtouris | da = argument.DateArgument(parsed_name='--date')
|
250 | b7ff6e0c | Stavros Sachtouris | self.assertEqual(da.timestamp, None) |
251 | b7ff6e0c | Stavros Sachtouris | date, format, exp = '24-10-1917', '%d-%m-%Y', -1646964000.0 |
252 | b7ff6e0c | Stavros Sachtouris | da._value = argument.dtm.strptime(date, format) |
253 | b7ff6e0c | Stavros Sachtouris | self.assertEqual(da.timestamp, exp)
|
254 | b7ff6e0c | Stavros Sachtouris | |
255 | b7ff6e0c | Stavros Sachtouris | def test_formated(self): |
256 | b7ff6e0c | Stavros Sachtouris | da = argument.DateArgument(parsed_name='--date')
|
257 | b7ff6e0c | Stavros Sachtouris | self.assertEqual(da.formated, None) |
258 | b7ff6e0c | Stavros Sachtouris | date, format, exp = ( |
259 | b7ff6e0c | Stavros Sachtouris | '24-10-1917', '%d-%m-%Y', 'Wed Oct 24 00:00:00 1917') |
260 | b7ff6e0c | Stavros Sachtouris | da._value = argument.dtm.strptime(date, format) |
261 | b7ff6e0c | Stavros Sachtouris | self.assertEqual(da.formated, exp)
|
262 | b7ff6e0c | Stavros Sachtouris | |
263 | b57eaeb0 | Stavros Sachtouris | @patch('%s.DateArgument.timestamp' % arg_path) |
264 | b57eaeb0 | Stavros Sachtouris | @patch('%s.DateArgument.format_date' % arg_path) |
265 | b7ff6e0c | Stavros Sachtouris | def test_value(self, format_date, timestamp): |
266 | b7ff6e0c | Stavros Sachtouris | da = argument.DateArgument(parsed_name='--date')
|
267 | b7ff6e0c | Stavros Sachtouris | self.assertTrue(isinstance(da.value, MagicMock)) |
268 | b7ff6e0c | Stavros Sachtouris | da.value = 'Something'
|
269 | b7ff6e0c | Stavros Sachtouris | format_date.assert_called_once(call('Something'))
|
270 | b7ff6e0c | Stavros Sachtouris | |
271 | b7ff6e0c | Stavros Sachtouris | def test_format_date(self): |
272 | b7ff6e0c | Stavros Sachtouris | da = argument.DateArgument(parsed_name='--date')
|
273 | b7ff6e0c | Stavros Sachtouris | for datestr, exp in ( |
274 | b7ff6e0c | Stavros Sachtouris | ('Wed Oct 24 01:02:03 1917', datetime(1917, 10, 24, 1, 2, 3)), |
275 | b7ff6e0c | Stavros Sachtouris | ('24-10-1917', datetime(1917, 10, 24)), |
276 | b7ff6e0c | Stavros Sachtouris | ('01:02:03 24-10-1917', datetime(1917, 10, 24, 1, 2, 3))): |
277 | b7ff6e0c | Stavros Sachtouris | self.assertEqual(da.format_date(datestr), exp)
|
278 | b7ff6e0c | Stavros Sachtouris | for datestr, err in ( |
279 | b7ff6e0c | Stavros Sachtouris | ('32-40-20134', errors.CLIError),
|
280 | b7ff6e0c | Stavros Sachtouris | ('Wednesday, 24 Oct 2017', errors.CLIError),
|
281 | b7ff6e0c | Stavros Sachtouris | (None, TypeError), (0.8, TypeError)): |
282 | b7ff6e0c | Stavros Sachtouris | self.assertRaises(err, da.format_date, datestr)
|
283 | b7ff6e0c | Stavros Sachtouris | |
284 | b7ff6e0c | Stavros Sachtouris | |
285 | 8d427cb9 | Stavros Sachtouris | class VersionArgument(TestCase): |
286 | 8d427cb9 | Stavros Sachtouris | |
287 | 8d427cb9 | Stavros Sachtouris | def test_value(self): |
288 | 8d427cb9 | Stavros Sachtouris | va = argument.VersionArgument(parsed_name='--version')
|
289 | 8d427cb9 | Stavros Sachtouris | self.assertTrue(va, argument.VersionArgument)
|
290 | 8d427cb9 | Stavros Sachtouris | va.value = 'some value'
|
291 | 8d427cb9 | Stavros Sachtouris | self.assertEqual(va.value, 'some value') |
292 | 8d427cb9 | Stavros Sachtouris | |
293 | 8d427cb9 | Stavros Sachtouris | |
294 | 8d427cb9 | Stavros Sachtouris | class KeyValueArgument(TestCase): |
295 | 8d427cb9 | Stavros Sachtouris | |
296 | b57eaeb0 | Stavros Sachtouris | @patch('%s.Argument.__init__' % arg_path) |
297 | 8d427cb9 | Stavros Sachtouris | def test___init__(self, init): |
298 | 8d427cb9 | Stavros Sachtouris | help, pname, default = 'help', 'pname', 'default' |
299 | 8d427cb9 | Stavros Sachtouris | kva = argument.KeyValueArgument(help, pname, default) |
300 | 8d427cb9 | Stavros Sachtouris | self.assertTrue(isinstance(kva, argument.KeyValueArgument)) |
301 | 8d427cb9 | Stavros Sachtouris | self.assertEqual(init.mock_calls[-1], call(-1, help, pname, default)) |
302 | 8d427cb9 | Stavros Sachtouris | |
303 | 8d427cb9 | Stavros Sachtouris | def test_value(self): |
304 | 8d427cb9 | Stavros Sachtouris | kva = argument.KeyValueArgument(parsed_name='--keyval')
|
305 | 2d1202ee | Stavros Sachtouris | self.assertEqual(kva.value, [])
|
306 | 8d427cb9 | Stavros Sachtouris | for kvpairs in ( |
307 | 8d427cb9 | Stavros Sachtouris | 'strval', 'key=val', 2.8, 42, None, |
308 | 8d427cb9 | Stavros Sachtouris | ('key', 'val'), ('key val'), ['=val', 'key=val'], |
309 | 8d427cb9 | Stavros Sachtouris | ['key1=val1', 'key2 val2'], ('key1 = val1', )): |
310 | f52b39db | Stavros Sachtouris | try:
|
311 | f52b39db | Stavros Sachtouris | kva.value = kvpairs |
312 | f52b39db | Stavros Sachtouris | except Exception as e: |
313 | f52b39db | Stavros Sachtouris | self.assertTrue(isinstance(e, errors.CLIError)) |
314 | 2d1202ee | Stavros Sachtouris | old = dict()
|
315 | 2d1202ee | Stavros Sachtouris | kva = argument.KeyValueArgument(parsed_name='--keyval')
|
316 | 8d427cb9 | Stavros Sachtouris | for kvpairs, exp in ( |
317 | 8d427cb9 | Stavros Sachtouris | (('key=val', ), {'key': 'val'}), |
318 | 8d427cb9 | Stavros Sachtouris | (['key1=val1', 'key2=val2'], {'key1': 'val1', 'key2': 'val2'}), |
319 | 8d427cb9 | Stavros Sachtouris | ( |
320 | 8d427cb9 | Stavros Sachtouris | ('k1=v1 v2', 'k3=', 'k 4=v4'), |
321 | 8d427cb9 | Stavros Sachtouris | {'k1': 'v1 v2', 'k3': '', 'k 4': 'v4'}), |
322 | 8d427cb9 | Stavros Sachtouris | (('k=v1', 'k=v2', 'k=v3'), {'k': 'v3'}) |
323 | 8d427cb9 | Stavros Sachtouris | ): |
324 | 8d427cb9 | Stavros Sachtouris | kva.value = kvpairs |
325 | 2d1202ee | Stavros Sachtouris | old.update(exp) |
326 | 2d1202ee | Stavros Sachtouris | assert_dicts_are_equal(self, kva.value, old)
|
327 | 8d427cb9 | Stavros Sachtouris | |
328 | 8d427cb9 | Stavros Sachtouris | |
329 | c0fbf04c | Stavros Sachtouris | class ProgressBarArgument(TestCase): |
330 | c0fbf04c | Stavros Sachtouris | |
331 | c0fbf04c | Stavros Sachtouris | class PseudoBar(object): |
332 | c0fbf04c | Stavros Sachtouris | message = ''
|
333 | c0fbf04c | Stavros Sachtouris | suffix = ''
|
334 | c0fbf04c | Stavros Sachtouris | |
335 | c0fbf04c | Stavros Sachtouris | def start(): |
336 | c0fbf04c | Stavros Sachtouris | pass
|
337 | c0fbf04c | Stavros Sachtouris | |
338 | b57eaeb0 | Stavros Sachtouris | @patch('%s.FlagArgument.__init__' % arg_path) |
339 | c0fbf04c | Stavros Sachtouris | def test___init__(self, init): |
340 | c0fbf04c | Stavros Sachtouris | help, pname, default = 'help', '--progress', 'default' |
341 | c0fbf04c | Stavros Sachtouris | pba = argument.ProgressBarArgument(help, pname, default) |
342 | c0fbf04c | Stavros Sachtouris | self.assertTrue(isinstance(pba, argument.ProgressBarArgument)) |
343 | c0fbf04c | Stavros Sachtouris | self.assertEqual(pba.suffix, '%(percent)d%%') |
344 | c0fbf04c | Stavros Sachtouris | init.assert_called_once(help, pname, default) |
345 | c0fbf04c | Stavros Sachtouris | |
346 | c0fbf04c | Stavros Sachtouris | def test_clone(self): |
347 | c0fbf04c | Stavros Sachtouris | pba = argument.ProgressBarArgument(parsed_name='--progress')
|
348 | c0fbf04c | Stavros Sachtouris | pba.value = None
|
349 | c0fbf04c | Stavros Sachtouris | pba_clone = pba.clone() |
350 | c0fbf04c | Stavros Sachtouris | self.assertTrue(isinstance(pba, argument.ProgressBarArgument)) |
351 | c0fbf04c | Stavros Sachtouris | self.assertTrue(isinstance(pba_clone, argument.ProgressBarArgument)) |
352 | c0fbf04c | Stavros Sachtouris | self.assertNotEqual(pba, pba_clone)
|
353 | c0fbf04c | Stavros Sachtouris | self.assertEqual(pba.parsed_name, pba_clone.parsed_name)
|
354 | c0fbf04c | Stavros Sachtouris | |
355 | c0fbf04c | Stavros Sachtouris | def test_get_generator(self): |
356 | c0fbf04c | Stavros Sachtouris | pba = argument.ProgressBarArgument(parsed_name='--progress')
|
357 | c0fbf04c | Stavros Sachtouris | pba.value = None
|
358 | c0fbf04c | Stavros Sachtouris | msg, msg_len = 'message', 40 |
359 | b57eaeb0 | Stavros Sachtouris | with patch('%s.KamakiProgressBar.start' % arg_path) as start: |
360 | c0fbf04c | Stavros Sachtouris | pba.get_generator(msg, msg_len) |
361 | c0fbf04c | Stavros Sachtouris | self.assertTrue(isinstance(pba.bar, argument.KamakiProgressBar)) |
362 | c0fbf04c | Stavros Sachtouris | self.assertNotEqual(pba.bar.message, msg)
|
363 | c0fbf04c | Stavros Sachtouris | self.assertEqual(
|
364 | c0fbf04c | Stavros Sachtouris | pba.bar.message, '%s%s' % (msg, ' ' * (msg_len - len(msg)))) |
365 | c0fbf04c | Stavros Sachtouris | self.assertEqual(pba.bar.suffix, '%(percent)d%% - %(eta)ds') |
366 | c0fbf04c | Stavros Sachtouris | start.assert_called_once() |
367 | c0fbf04c | Stavros Sachtouris | |
368 | c0fbf04c | Stavros Sachtouris | def test_finish(self): |
369 | c0fbf04c | Stavros Sachtouris | pba = argument.ProgressBarArgument(parsed_name='--progress')
|
370 | c0fbf04c | Stavros Sachtouris | pba.value = None
|
371 | c0fbf04c | Stavros Sachtouris | self.assertEqual(pba.finish(), None) |
372 | c0fbf04c | Stavros Sachtouris | pba.bar = argument.KamakiProgressBar() |
373 | b57eaeb0 | Stavros Sachtouris | with patch('%s.KamakiProgressBar.finish' % arg_path) as finish: |
374 | c0fbf04c | Stavros Sachtouris | pba.finish() |
375 | c0fbf04c | Stavros Sachtouris | finish.assert_called_once() |
376 | c0fbf04c | Stavros Sachtouris | |
377 | c0fbf04c | Stavros Sachtouris | |
378 | 631b7c35 | Stavros Sachtouris | class ArgumentParseManager(TestCase): |
379 | 631b7c35 | Stavros Sachtouris | |
380 | b57eaeb0 | Stavros Sachtouris | @patch('%s.ArgumentParseManager.parse' % arg_path) |
381 | b57eaeb0 | Stavros Sachtouris | @patch('%s.ArgumentParseManager.update_parser' % arg_path) |
382 | 631b7c35 | Stavros Sachtouris | def test___init__(self, parse, update_parser): |
383 | 631b7c35 | Stavros Sachtouris | for arguments in (None, {'k1': 'v1', 'k2': 'v2'}): |
384 | 631b7c35 | Stavros Sachtouris | apm = argument.ArgumentParseManager('exe', arguments)
|
385 | 631b7c35 | Stavros Sachtouris | self.assertTrue(isinstance(apm, argument.ArgumentParseManager)) |
386 | 631b7c35 | Stavros Sachtouris | |
387 | 631b7c35 | Stavros Sachtouris | self.assertTrue(isinstance(apm.parser, argument.ArgumentParser)) |
388 | 631b7c35 | Stavros Sachtouris | self.assertFalse(apm.parser.add_help)
|
389 | 631b7c35 | Stavros Sachtouris | self.assertEqual(
|
390 | 631b7c35 | Stavros Sachtouris | apm.parser.formatter_class, |
391 | 631b7c35 | Stavros Sachtouris | argument.RawDescriptionHelpFormatter) |
392 | 631b7c35 | Stavros Sachtouris | |
393 | 631b7c35 | Stavros Sachtouris | self.assertEqual(
|
394 | 631b7c35 | Stavros Sachtouris | apm.syntax, 'exe <cmd_group> [<cmd_subbroup> ...] <cmd>')
|
395 | 631b7c35 | Stavros Sachtouris | assert_dicts_are_equal( |
396 | 631b7c35 | Stavros Sachtouris | self, apm.arguments,
|
397 | 631b7c35 | Stavros Sachtouris | arguments or argument._arguments)
|
398 | 631b7c35 | Stavros Sachtouris | self.assertFalse(apm._parser_modified)
|
399 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm._parsed, None) |
400 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm._unparsed, None) |
401 | 631b7c35 | Stavros Sachtouris | self.assertEqual(parse.mock_calls[-1], call()) |
402 | 631b7c35 | Stavros Sachtouris | if arguments:
|
403 | 631b7c35 | Stavros Sachtouris | update_parser.assert_called_once() |
404 | 631b7c35 | Stavros Sachtouris | |
405 | 631b7c35 | Stavros Sachtouris | def test_syntax(self): |
406 | 631b7c35 | Stavros Sachtouris | apm = argument.ArgumentParseManager('exe')
|
407 | 631b7c35 | Stavros Sachtouris | self.assertEqual(
|
408 | 631b7c35 | Stavros Sachtouris | apm.syntax, 'exe <cmd_group> [<cmd_subbroup> ...] <cmd>')
|
409 | 631b7c35 | Stavros Sachtouris | apm.syntax = 'some syntax'
|
410 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm.syntax, 'some syntax') |
411 | 631b7c35 | Stavros Sachtouris | |
412 | b57eaeb0 | Stavros Sachtouris | @patch('%s.ArgumentParseManager.update_parser' % arg_path) |
413 | 631b7c35 | Stavros Sachtouris | def test_arguments(self, update_parser): |
414 | 631b7c35 | Stavros Sachtouris | apm = argument.ArgumentParseManager('exe')
|
415 | 631b7c35 | Stavros Sachtouris | assert_dicts_are_equal(self, apm.arguments, argument._arguments)
|
416 | 631b7c35 | Stavros Sachtouris | update_parser.assert_called_once() |
417 | 631b7c35 | Stavros Sachtouris | exp = {'k1': 'v1', 'k2': 'v2'} |
418 | 631b7c35 | Stavros Sachtouris | apm.arguments = exp |
419 | 631b7c35 | Stavros Sachtouris | assert_dicts_are_equal(self, apm.arguments, exp)
|
420 | 631b7c35 | Stavros Sachtouris | self.assertEqual(update_parser.mock_calls[-1], call()) |
421 | 631b7c35 | Stavros Sachtouris | try:
|
422 | 631b7c35 | Stavros Sachtouris | apm.arguments = None
|
423 | 631b7c35 | Stavros Sachtouris | except Exception as e: |
424 | 631b7c35 | Stavros Sachtouris | self.assertTrue(isinstance(e, AssertionError)) |
425 | 631b7c35 | Stavros Sachtouris | |
426 | b57eaeb0 | Stavros Sachtouris | @patch('%s.ArgumentParseManager.parse' % arg_path) |
427 | 631b7c35 | Stavros Sachtouris | def test_parsed(self, parse): |
428 | 631b7c35 | Stavros Sachtouris | apm = argument.ArgumentParseManager('exe')
|
429 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm.parsed, None) |
430 | 631b7c35 | Stavros Sachtouris | exp = 'you have been parsed'
|
431 | 631b7c35 | Stavros Sachtouris | apm._parsed = exp |
432 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm.parsed, exp)
|
433 | 631b7c35 | Stavros Sachtouris | apm._parser_modified = True
|
434 | 631b7c35 | Stavros Sachtouris | apm._parsed = exp + ' v2'
|
435 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm.parsed, exp + ' v2') |
436 | 631b7c35 | Stavros Sachtouris | self.assertEqual(parse.mock_calls, [call(), call()])
|
437 | 631b7c35 | Stavros Sachtouris | |
438 | b57eaeb0 | Stavros Sachtouris | @patch('%s.ArgumentParseManager.parse' % arg_path) |
439 | 631b7c35 | Stavros Sachtouris | def test_unparsed(self, parse): |
440 | 631b7c35 | Stavros Sachtouris | apm = argument.ArgumentParseManager('exe')
|
441 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm.unparsed, None) |
442 | 631b7c35 | Stavros Sachtouris | exp = 'you have been unparsed'
|
443 | 631b7c35 | Stavros Sachtouris | apm._unparsed = exp |
444 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm.unparsed, exp)
|
445 | 631b7c35 | Stavros Sachtouris | apm._parser_modified = True
|
446 | 631b7c35 | Stavros Sachtouris | apm._unparsed = exp + ' v2'
|
447 | 631b7c35 | Stavros Sachtouris | self.assertEqual(apm.unparsed, exp + ' v2') |
448 | 631b7c35 | Stavros Sachtouris | self.assertEqual(parse.mock_calls, [call(), call()])
|
449 | 631b7c35 | Stavros Sachtouris | |
450 | b57eaeb0 | Stavros Sachtouris | @patch('%s.Argument.update_parser' % arg_path |
451 | b57eaeb0 | Stavros Sachtouris | ) |
452 | 631b7c35 | Stavros Sachtouris | def test_update_parser(self, update_parser): |
453 | 631b7c35 | Stavros Sachtouris | apm = argument.ArgumentParseManager('exe')
|
454 | 631b7c35 | Stavros Sachtouris | body_count = len(update_parser.mock_calls)
|
455 | 631b7c35 | Stavros Sachtouris | exp = len(argument._arguments)
|
456 | 631b7c35 | Stavros Sachtouris | self.assertEqual(body_count, exp)
|
457 | 631b7c35 | Stavros Sachtouris | apm.update_parser() |
458 | 631b7c35 | Stavros Sachtouris | exp = len(apm.arguments) + body_count
|
459 | 631b7c35 | Stavros Sachtouris | body_count = len(update_parser.mock_calls)
|
460 | 631b7c35 | Stavros Sachtouris | self.assertEqual(body_count, exp)
|
461 | 631b7c35 | Stavros Sachtouris | expd = dict(
|
462 | 631b7c35 | Stavros Sachtouris | k1=argument.Argument(0, parsed_name='-a'), |
463 | 631b7c35 | Stavros Sachtouris | k2=argument.Argument(0, parsed_name='-b')) |
464 | 631b7c35 | Stavros Sachtouris | apm.update_parser(expd) |
465 | 631b7c35 | Stavros Sachtouris | body_count = len(update_parser.mock_calls)
|
466 | 631b7c35 | Stavros Sachtouris | self.assertEqual(body_count, exp + 2) |
467 | 631b7c35 | Stavros Sachtouris | |
468 | b57eaeb0 | Stavros Sachtouris | def test_update_arguments(self): |
469 | b57eaeb0 | Stavros Sachtouris | (inp, cor, exp) = ( |
470 | b57eaeb0 | Stavros Sachtouris | {'k1': 'v1', 'k2': 'v3'}, {'k2': 'v2'}, {'k1': 'v1', 'k2': 'v2'}) |
471 | b57eaeb0 | Stavros Sachtouris | apm = argument.ArgumentParseManager('exe')
|
472 | b57eaeb0 | Stavros Sachtouris | with patch(
|
473 | b57eaeb0 | Stavros Sachtouris | '%s.ArgumentParseManager.update_parser' % arg_path) as UP: |
474 | b57eaeb0 | Stavros Sachtouris | apm.update_arguments(None)
|
475 | b57eaeb0 | Stavros Sachtouris | self.assertEqual(len(UP.mock_calls), 0) |
476 | b57eaeb0 | Stavros Sachtouris | apm._arguments = inp |
477 | b57eaeb0 | Stavros Sachtouris | apm.update_arguments(cor) |
478 | b57eaeb0 | Stavros Sachtouris | assert_dicts_are_equal(self, apm.arguments, exp)
|
479 | b57eaeb0 | Stavros Sachtouris | UP.assert_called_once_with() |
480 | b57eaeb0 | Stavros Sachtouris | |
481 | b57eaeb0 | Stavros Sachtouris | def test_parse(self): |
482 | 264847a7 | Stavros Sachtouris | apm = argument.ArgumentParseManager('exe')
|
483 | 264847a7 | Stavros Sachtouris | parsed, unparsed = apm.parser.parse_known_args() |
484 | 264847a7 | Stavros Sachtouris | apm.parse() |
485 | 264847a7 | Stavros Sachtouris | self.assertEqual(apm._parsed, parsed)
|
486 | 264847a7 | Stavros Sachtouris | self.assertEqual(apm.unparsed, unparsed)
|
487 | b57eaeb0 | Stavros Sachtouris | |
488 | b57eaeb0 | Stavros Sachtouris | |
489 | 5286e2c3 | Stavros Sachtouris | if __name__ == '__main__': |
490 | 5286e2c3 | Stavros Sachtouris | from sys import argv |
491 | 5286e2c3 | Stavros Sachtouris | from kamaki.cli.test import runTestCase |
492 | 5286e2c3 | Stavros Sachtouris | runTestCase(Argument, 'Argument', argv[1:]) |
493 | a7aacf12 | Stavros Sachtouris | runTestCase(ConfigArgument, 'ConfigArgument', argv[1:]) |
494 | 1bd4f765 | Stavros Sachtouris | runTestCase(RuntimeConfigArgument, 'RuntimeConfigArgument', argv[1:]) |
495 | 3a5b1ceb | Stavros Sachtouris | runTestCase(FlagArgument, 'FlagArgument', argv[1:]) |
496 | 3a5b1ceb | Stavros Sachtouris | runTestCase(FlagArgument, 'ValueArgument', argv[1:]) |
497 | 02987e9c | Stavros Sachtouris | runTestCase(IntArgument, 'IntArgument', argv[1:]) |
498 | b7ff6e0c | Stavros Sachtouris | runTestCase(DateArgument, 'DateArgument', argv[1:]) |
499 | 8d427cb9 | Stavros Sachtouris | runTestCase(VersionArgument, 'VersionArgument', argv[1:]) |
500 | 8d427cb9 | Stavros Sachtouris | runTestCase(KeyValueArgument, 'KeyValueArgument', argv[1:]) |
501 | c0fbf04c | Stavros Sachtouris | runTestCase(ProgressBarArgument, 'ProgressBarArgument', argv[1:]) |
502 | 631b7c35 | Stavros Sachtouris | runTestCase(ArgumentParseManager, 'ArgumentParseManager', argv[1:]) |