Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (20.3 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 ca5528f1 Stavros Sachtouris
class RepeatableArgument(TestCase):
295 ca5528f1 Stavros Sachtouris
296 ca5528f1 Stavros Sachtouris
    @patch('%s.Argument.__init__' % arg_path)
297 ca5528f1 Stavros Sachtouris
    def test___init__(self, init):
298 ca5528f1 Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
299 ca5528f1 Stavros Sachtouris
        kva = argument.RepeatableArgument(help, pname, default)
300 ca5528f1 Stavros Sachtouris
        self.assertTrue(isinstance(kva, argument.RepeatableArgument))
301 ca5528f1 Stavros Sachtouris
        self.assertEqual(init.mock_calls[-1], call(-1, help, pname, default))
302 ca5528f1 Stavros Sachtouris
303 ca5528f1 Stavros Sachtouris
304 8d427cb9 Stavros Sachtouris
class KeyValueArgument(TestCase):
305 8d427cb9 Stavros Sachtouris
306 b57eaeb0 Stavros Sachtouris
    @patch('%s.Argument.__init__' % arg_path)
307 8d427cb9 Stavros Sachtouris
    def test___init__(self, init):
308 8d427cb9 Stavros Sachtouris
        help, pname, default = 'help', 'pname', 'default'
309 8d427cb9 Stavros Sachtouris
        kva = argument.KeyValueArgument(help, pname, default)
310 8d427cb9 Stavros Sachtouris
        self.assertTrue(isinstance(kva, argument.KeyValueArgument))
311 8d427cb9 Stavros Sachtouris
        self.assertEqual(init.mock_calls[-1], call(-1, help, pname, default))
312 8d427cb9 Stavros Sachtouris
313 8d427cb9 Stavros Sachtouris
    def test_value(self):
314 8d427cb9 Stavros Sachtouris
        kva = argument.KeyValueArgument(parsed_name='--keyval')
315 2d1202ee Stavros Sachtouris
        self.assertEqual(kva.value, [])
316 8d427cb9 Stavros Sachtouris
        for kvpairs in (
317 8d427cb9 Stavros Sachtouris
                'strval', 'key=val', 2.8, 42, None,
318 8d427cb9 Stavros Sachtouris
                ('key', 'val'), ('key val'), ['=val', 'key=val'],
319 8d427cb9 Stavros Sachtouris
                ['key1=val1', 'key2 val2'], ('key1 = val1', )):
320 f52b39db Stavros Sachtouris
            try:
321 f52b39db Stavros Sachtouris
                kva.value = kvpairs
322 f52b39db Stavros Sachtouris
            except Exception as e:
323 f52b39db Stavros Sachtouris
                self.assertTrue(isinstance(e, errors.CLIError))
324 2d1202ee Stavros Sachtouris
        old = dict()
325 2d1202ee Stavros Sachtouris
        kva = argument.KeyValueArgument(parsed_name='--keyval')
326 8d427cb9 Stavros Sachtouris
        for kvpairs, exp in (
327 8d427cb9 Stavros Sachtouris
                (('key=val', ), {'key': 'val'}),
328 8d427cb9 Stavros Sachtouris
                (['key1=val1', 'key2=val2'], {'key1': 'val1', 'key2': 'val2'}),
329 8d427cb9 Stavros Sachtouris
                (
330 8d427cb9 Stavros Sachtouris
                    ('k1=v1 v2', 'k3=', 'k 4=v4'),
331 8d427cb9 Stavros Sachtouris
                    {'k1': 'v1 v2', 'k3': '', 'k 4': 'v4'}),
332 8d427cb9 Stavros Sachtouris
                (('k=v1', 'k=v2', 'k=v3'), {'k': 'v3'})
333 8d427cb9 Stavros Sachtouris
            ):
334 8d427cb9 Stavros Sachtouris
            kva.value = kvpairs
335 2d1202ee Stavros Sachtouris
            old.update(exp)
336 2d1202ee Stavros Sachtouris
            assert_dicts_are_equal(self, kva.value, old)
337 8d427cb9 Stavros Sachtouris
338 8d427cb9 Stavros Sachtouris
339 c0fbf04c Stavros Sachtouris
class ProgressBarArgument(TestCase):
340 c0fbf04c Stavros Sachtouris
341 c0fbf04c Stavros Sachtouris
    class PseudoBar(object):
342 c0fbf04c Stavros Sachtouris
            message = ''
343 c0fbf04c Stavros Sachtouris
            suffix = ''
344 c0fbf04c Stavros Sachtouris
345 c0fbf04c Stavros Sachtouris
            def start():
346 c0fbf04c Stavros Sachtouris
                pass
347 c0fbf04c Stavros Sachtouris
348 b57eaeb0 Stavros Sachtouris
    @patch('%s.FlagArgument.__init__' % arg_path)
349 c0fbf04c Stavros Sachtouris
    def test___init__(self, init):
350 c0fbf04c Stavros Sachtouris
        help, pname, default = 'help', '--progress', 'default'
351 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(help, pname, default)
352 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba, argument.ProgressBarArgument))
353 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.suffix, '%(percent)d%%')
354 c0fbf04c Stavros Sachtouris
        init.assert_called_once(help, pname, default)
355 c0fbf04c Stavros Sachtouris
356 c0fbf04c Stavros Sachtouris
    def test_clone(self):
357 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
358 c0fbf04c Stavros Sachtouris
        pba.value = None
359 c0fbf04c Stavros Sachtouris
        pba_clone = pba.clone()
360 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba, argument.ProgressBarArgument))
361 c0fbf04c Stavros Sachtouris
        self.assertTrue(isinstance(pba_clone, argument.ProgressBarArgument))
362 c0fbf04c Stavros Sachtouris
        self.assertNotEqual(pba, pba_clone)
363 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.parsed_name, pba_clone.parsed_name)
364 c0fbf04c Stavros Sachtouris
365 c0fbf04c Stavros Sachtouris
    def test_get_generator(self):
366 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
367 c0fbf04c Stavros Sachtouris
        pba.value = None
368 c0fbf04c Stavros Sachtouris
        msg, msg_len = 'message', 40
369 b57eaeb0 Stavros Sachtouris
        with patch('%s.KamakiProgressBar.start' % arg_path) as start:
370 c0fbf04c Stavros Sachtouris
            pba.get_generator(msg, msg_len)
371 c0fbf04c Stavros Sachtouris
            self.assertTrue(isinstance(pba.bar, argument.KamakiProgressBar))
372 c0fbf04c Stavros Sachtouris
            self.assertNotEqual(pba.bar.message, msg)
373 c0fbf04c Stavros Sachtouris
            self.assertEqual(
374 c0fbf04c Stavros Sachtouris
                pba.bar.message, '%s%s' % (msg, ' ' * (msg_len - len(msg))))
375 c0fbf04c Stavros Sachtouris
            self.assertEqual(pba.bar.suffix, '%(percent)d%% - %(eta)ds')
376 c0fbf04c Stavros Sachtouris
            start.assert_called_once()
377 c0fbf04c Stavros Sachtouris
378 c0fbf04c Stavros Sachtouris
    def test_finish(self):
379 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
380 c0fbf04c Stavros Sachtouris
        pba.value = None
381 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.finish(), None)
382 c0fbf04c Stavros Sachtouris
        pba.bar = argument.KamakiProgressBar()
383 b57eaeb0 Stavros Sachtouris
        with patch('%s.KamakiProgressBar.finish' % arg_path) as finish:
384 c0fbf04c Stavros Sachtouris
            pba.finish()
385 c0fbf04c Stavros Sachtouris
            finish.assert_called_once()
386 c0fbf04c Stavros Sachtouris
387 c0fbf04c Stavros Sachtouris
388 631b7c35 Stavros Sachtouris
class ArgumentParseManager(TestCase):
389 631b7c35 Stavros Sachtouris
390 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
391 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.update_parser' % arg_path)
392 631b7c35 Stavros Sachtouris
    def test___init__(self, parse, update_parser):
393 631b7c35 Stavros Sachtouris
        for arguments in (None, {'k1': 'v1', 'k2': 'v2'}):
394 631b7c35 Stavros Sachtouris
            apm = argument.ArgumentParseManager('exe', arguments)
395 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(apm, argument.ArgumentParseManager))
396 631b7c35 Stavros Sachtouris
397 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(apm.parser, argument.ArgumentParser))
398 631b7c35 Stavros Sachtouris
            self.assertFalse(apm.parser.add_help)
399 631b7c35 Stavros Sachtouris
            self.assertEqual(
400 631b7c35 Stavros Sachtouris
                apm.parser.formatter_class,
401 631b7c35 Stavros Sachtouris
                argument.RawDescriptionHelpFormatter)
402 631b7c35 Stavros Sachtouris
403 631b7c35 Stavros Sachtouris
            self.assertEqual(
404 631b7c35 Stavros Sachtouris
                apm.syntax, 'exe <cmd_group> [<cmd_subbroup> ...] <cmd>')
405 631b7c35 Stavros Sachtouris
            assert_dicts_are_equal(
406 631b7c35 Stavros Sachtouris
                self, apm.arguments,
407 631b7c35 Stavros Sachtouris
                arguments or argument._arguments)
408 631b7c35 Stavros Sachtouris
            self.assertFalse(apm._parser_modified)
409 631b7c35 Stavros Sachtouris
            self.assertEqual(apm._parsed, None)
410 631b7c35 Stavros Sachtouris
            self.assertEqual(apm._unparsed, None)
411 631b7c35 Stavros Sachtouris
            self.assertEqual(parse.mock_calls[-1], call())
412 631b7c35 Stavros Sachtouris
            if arguments:
413 631b7c35 Stavros Sachtouris
                update_parser.assert_called_once()
414 631b7c35 Stavros Sachtouris
415 631b7c35 Stavros Sachtouris
    def test_syntax(self):
416 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
417 631b7c35 Stavros Sachtouris
        self.assertEqual(
418 631b7c35 Stavros Sachtouris
            apm.syntax, 'exe <cmd_group> [<cmd_subbroup> ...] <cmd>')
419 631b7c35 Stavros Sachtouris
        apm.syntax = 'some syntax'
420 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.syntax, 'some syntax')
421 631b7c35 Stavros Sachtouris
422 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.update_parser' % arg_path)
423 631b7c35 Stavros Sachtouris
    def test_arguments(self, update_parser):
424 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
425 631b7c35 Stavros Sachtouris
        assert_dicts_are_equal(self, apm.arguments, argument._arguments)
426 631b7c35 Stavros Sachtouris
        update_parser.assert_called_once()
427 631b7c35 Stavros Sachtouris
        exp = {'k1': 'v1', 'k2': 'v2'}
428 631b7c35 Stavros Sachtouris
        apm.arguments = exp
429 631b7c35 Stavros Sachtouris
        assert_dicts_are_equal(self, apm.arguments, exp)
430 631b7c35 Stavros Sachtouris
        self.assertEqual(update_parser.mock_calls[-1], call())
431 631b7c35 Stavros Sachtouris
        try:
432 631b7c35 Stavros Sachtouris
            apm.arguments = None
433 631b7c35 Stavros Sachtouris
        except Exception as e:
434 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(e, AssertionError))
435 631b7c35 Stavros Sachtouris
436 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
437 631b7c35 Stavros Sachtouris
    def test_parsed(self, parse):
438 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
439 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, None)
440 631b7c35 Stavros Sachtouris
        exp = 'you have been parsed'
441 631b7c35 Stavros Sachtouris
        apm._parsed = exp
442 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, exp)
443 631b7c35 Stavros Sachtouris
        apm._parser_modified = True
444 631b7c35 Stavros Sachtouris
        apm._parsed = exp + ' v2'
445 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, exp + ' v2')
446 631b7c35 Stavros Sachtouris
        self.assertEqual(parse.mock_calls, [call(), call()])
447 631b7c35 Stavros Sachtouris
448 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
449 631b7c35 Stavros Sachtouris
    def test_unparsed(self, parse):
450 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
451 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, None)
452 631b7c35 Stavros Sachtouris
        exp = 'you have been unparsed'
453 631b7c35 Stavros Sachtouris
        apm._unparsed = exp
454 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, exp)
455 631b7c35 Stavros Sachtouris
        apm._parser_modified = True
456 631b7c35 Stavros Sachtouris
        apm._unparsed = exp + ' v2'
457 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, exp + ' v2')
458 631b7c35 Stavros Sachtouris
        self.assertEqual(parse.mock_calls, [call(), call()])
459 631b7c35 Stavros Sachtouris
460 b57eaeb0 Stavros Sachtouris
    @patch('%s.Argument.update_parser' % arg_path
461 b57eaeb0 Stavros Sachtouris
        )
462 631b7c35 Stavros Sachtouris
    def test_update_parser(self, update_parser):
463 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
464 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
465 631b7c35 Stavros Sachtouris
        exp = len(argument._arguments)
466 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp)
467 631b7c35 Stavros Sachtouris
        apm.update_parser()
468 631b7c35 Stavros Sachtouris
        exp = len(apm.arguments) + body_count
469 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
470 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp)
471 631b7c35 Stavros Sachtouris
        expd = dict(
472 631b7c35 Stavros Sachtouris
            k1=argument.Argument(0, parsed_name='-a'),
473 631b7c35 Stavros Sachtouris
            k2=argument.Argument(0, parsed_name='-b'))
474 631b7c35 Stavros Sachtouris
        apm.update_parser(expd)
475 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
476 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp + 2)
477 631b7c35 Stavros Sachtouris
478 b57eaeb0 Stavros Sachtouris
    def test_update_arguments(self):
479 b57eaeb0 Stavros Sachtouris
        (inp, cor, exp) = (
480 b57eaeb0 Stavros Sachtouris
            {'k1': 'v1', 'k2': 'v3'}, {'k2': 'v2'}, {'k1': 'v1', 'k2': 'v2'})
481 b57eaeb0 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
482 b57eaeb0 Stavros Sachtouris
        with patch(
483 b57eaeb0 Stavros Sachtouris
                '%s.ArgumentParseManager.update_parser' % arg_path) as UP:
484 b57eaeb0 Stavros Sachtouris
            apm.update_arguments(None)
485 b57eaeb0 Stavros Sachtouris
            self.assertEqual(len(UP.mock_calls), 0)
486 b57eaeb0 Stavros Sachtouris
            apm._arguments = inp
487 b57eaeb0 Stavros Sachtouris
            apm.update_arguments(cor)
488 b57eaeb0 Stavros Sachtouris
            assert_dicts_are_equal(self, apm.arguments, exp)
489 b57eaeb0 Stavros Sachtouris
            UP.assert_called_once_with()
490 b57eaeb0 Stavros Sachtouris
491 b57eaeb0 Stavros Sachtouris
    def test_parse(self):
492 264847a7 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
493 264847a7 Stavros Sachtouris
        parsed, unparsed = apm.parser.parse_known_args()
494 264847a7 Stavros Sachtouris
        apm.parse()
495 264847a7 Stavros Sachtouris
        self.assertEqual(apm._parsed, parsed)
496 264847a7 Stavros Sachtouris
        self.assertEqual(apm.unparsed, unparsed)
497 b57eaeb0 Stavros Sachtouris
498 b57eaeb0 Stavros Sachtouris
499 5286e2c3 Stavros Sachtouris
if __name__ == '__main__':
500 5286e2c3 Stavros Sachtouris
    from sys import argv
501 5286e2c3 Stavros Sachtouris
    from kamaki.cli.test import runTestCase
502 5286e2c3 Stavros Sachtouris
    runTestCase(Argument, 'Argument', argv[1:])
503 a7aacf12 Stavros Sachtouris
    runTestCase(ConfigArgument, 'ConfigArgument', argv[1:])
504 1bd4f765 Stavros Sachtouris
    runTestCase(RuntimeConfigArgument, 'RuntimeConfigArgument', argv[1:])
505 3a5b1ceb Stavros Sachtouris
    runTestCase(FlagArgument, 'FlagArgument', argv[1:])
506 3a5b1ceb Stavros Sachtouris
    runTestCase(FlagArgument, 'ValueArgument', argv[1:])
507 02987e9c Stavros Sachtouris
    runTestCase(IntArgument, 'IntArgument', argv[1:])
508 b7ff6e0c Stavros Sachtouris
    runTestCase(DateArgument, 'DateArgument', argv[1:])
509 8d427cb9 Stavros Sachtouris
    runTestCase(VersionArgument, 'VersionArgument', argv[1:])
510 ca5528f1 Stavros Sachtouris
    runTestCase(RepeatableArgument, 'RepeatableArgument', argv[1:])
511 8d427cb9 Stavros Sachtouris
    runTestCase(KeyValueArgument, 'KeyValueArgument', argv[1:])
512 c0fbf04c Stavros Sachtouris
    runTestCase(ProgressBarArgument, 'ProgressBarArgument', argv[1:])
513 631b7c35 Stavros Sachtouris
    runTestCase(ArgumentParseManager, 'ArgumentParseManager', argv[1:])