Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / argument / test.py @ 4a25486d

History | View | Annotate | Download (20.4 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 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 c0fbf04c Stavros Sachtouris
            pba.get_generator(msg, msg_len)
373 c0fbf04c Stavros Sachtouris
            self.assertTrue(isinstance(pba.bar, argument.KamakiProgressBar))
374 c0fbf04c Stavros Sachtouris
            self.assertNotEqual(pba.bar.message, msg)
375 c0fbf04c Stavros Sachtouris
            self.assertEqual(
376 c0fbf04c Stavros Sachtouris
                pba.bar.message, '%s%s' % (msg, ' ' * (msg_len - len(msg))))
377 c0fbf04c Stavros Sachtouris
            self.assertEqual(pba.bar.suffix, '%(percent)d%% - %(eta)ds')
378 c0fbf04c Stavros Sachtouris
            start.assert_called_once()
379 c0fbf04c Stavros Sachtouris
380 c0fbf04c Stavros Sachtouris
    def test_finish(self):
381 c0fbf04c Stavros Sachtouris
        pba = argument.ProgressBarArgument(parsed_name='--progress')
382 c0fbf04c Stavros Sachtouris
        pba.value = None
383 c0fbf04c Stavros Sachtouris
        self.assertEqual(pba.finish(), None)
384 c0fbf04c Stavros Sachtouris
        pba.bar = argument.KamakiProgressBar()
385 b57eaeb0 Stavros Sachtouris
        with patch('%s.KamakiProgressBar.finish' % arg_path) as finish:
386 c0fbf04c Stavros Sachtouris
            pba.finish()
387 c0fbf04c Stavros Sachtouris
            finish.assert_called_once()
388 c0fbf04c Stavros Sachtouris
389 c0fbf04c Stavros Sachtouris
390 631b7c35 Stavros Sachtouris
class ArgumentParseManager(TestCase):
391 631b7c35 Stavros Sachtouris
392 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
393 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.update_parser' % arg_path)
394 631b7c35 Stavros Sachtouris
    def test___init__(self, parse, update_parser):
395 631b7c35 Stavros Sachtouris
        for arguments in (None, {'k1': 'v1', 'k2': 'v2'}):
396 631b7c35 Stavros Sachtouris
            apm = argument.ArgumentParseManager('exe', arguments)
397 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(apm, argument.ArgumentParseManager))
398 631b7c35 Stavros Sachtouris
399 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(apm.parser, argument.ArgumentParser))
400 631b7c35 Stavros Sachtouris
            self.assertFalse(apm.parser.add_help)
401 631b7c35 Stavros Sachtouris
            self.assertEqual(
402 631b7c35 Stavros Sachtouris
                apm.parser.formatter_class,
403 631b7c35 Stavros Sachtouris
                argument.RawDescriptionHelpFormatter)
404 631b7c35 Stavros Sachtouris
405 631b7c35 Stavros Sachtouris
            self.assertEqual(
406 631b7c35 Stavros Sachtouris
                apm.syntax, 'exe <cmd_group> [<cmd_subbroup> ...] <cmd>')
407 631b7c35 Stavros Sachtouris
            assert_dicts_are_equal(
408 631b7c35 Stavros Sachtouris
                self, apm.arguments,
409 631b7c35 Stavros Sachtouris
                arguments or argument._arguments)
410 631b7c35 Stavros Sachtouris
            self.assertFalse(apm._parser_modified)
411 631b7c35 Stavros Sachtouris
            self.assertEqual(apm._parsed, None)
412 631b7c35 Stavros Sachtouris
            self.assertEqual(apm._unparsed, None)
413 631b7c35 Stavros Sachtouris
            self.assertEqual(parse.mock_calls[-1], call())
414 631b7c35 Stavros Sachtouris
            if arguments:
415 631b7c35 Stavros Sachtouris
                update_parser.assert_called_once()
416 631b7c35 Stavros Sachtouris
417 631b7c35 Stavros Sachtouris
    def test_syntax(self):
418 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
419 631b7c35 Stavros Sachtouris
        self.assertEqual(
420 631b7c35 Stavros Sachtouris
            apm.syntax, 'exe <cmd_group> [<cmd_subbroup> ...] <cmd>')
421 631b7c35 Stavros Sachtouris
        apm.syntax = 'some syntax'
422 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.syntax, 'some syntax')
423 631b7c35 Stavros Sachtouris
424 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.update_parser' % arg_path)
425 631b7c35 Stavros Sachtouris
    def test_arguments(self, update_parser):
426 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
427 631b7c35 Stavros Sachtouris
        assert_dicts_are_equal(self, apm.arguments, argument._arguments)
428 631b7c35 Stavros Sachtouris
        update_parser.assert_called_once()
429 631b7c35 Stavros Sachtouris
        exp = {'k1': 'v1', 'k2': 'v2'}
430 631b7c35 Stavros Sachtouris
        apm.arguments = exp
431 631b7c35 Stavros Sachtouris
        assert_dicts_are_equal(self, apm.arguments, exp)
432 631b7c35 Stavros Sachtouris
        self.assertEqual(update_parser.mock_calls[-1], call())
433 631b7c35 Stavros Sachtouris
        try:
434 631b7c35 Stavros Sachtouris
            apm.arguments = None
435 631b7c35 Stavros Sachtouris
        except Exception as e:
436 631b7c35 Stavros Sachtouris
            self.assertTrue(isinstance(e, AssertionError))
437 631b7c35 Stavros Sachtouris
438 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
439 631b7c35 Stavros Sachtouris
    def test_parsed(self, parse):
440 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
441 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, None)
442 631b7c35 Stavros Sachtouris
        exp = 'you have been parsed'
443 631b7c35 Stavros Sachtouris
        apm._parsed = exp
444 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, exp)
445 631b7c35 Stavros Sachtouris
        apm._parser_modified = True
446 631b7c35 Stavros Sachtouris
        apm._parsed = exp + ' v2'
447 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.parsed, exp + ' v2')
448 631b7c35 Stavros Sachtouris
        self.assertEqual(parse.mock_calls, [call(), call()])
449 631b7c35 Stavros Sachtouris
450 b57eaeb0 Stavros Sachtouris
    @patch('%s.ArgumentParseManager.parse' % arg_path)
451 631b7c35 Stavros Sachtouris
    def test_unparsed(self, parse):
452 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
453 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, None)
454 631b7c35 Stavros Sachtouris
        exp = 'you have been unparsed'
455 631b7c35 Stavros Sachtouris
        apm._unparsed = exp
456 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, exp)
457 631b7c35 Stavros Sachtouris
        apm._parser_modified = True
458 631b7c35 Stavros Sachtouris
        apm._unparsed = exp + ' v2'
459 631b7c35 Stavros Sachtouris
        self.assertEqual(apm.unparsed, exp + ' v2')
460 631b7c35 Stavros Sachtouris
        self.assertEqual(parse.mock_calls, [call(), call()])
461 631b7c35 Stavros Sachtouris
462 b57eaeb0 Stavros Sachtouris
    @patch('%s.Argument.update_parser' % arg_path
463 b57eaeb0 Stavros Sachtouris
        )
464 631b7c35 Stavros Sachtouris
    def test_update_parser(self, update_parser):
465 631b7c35 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
466 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
467 631b7c35 Stavros Sachtouris
        exp = len(argument._arguments)
468 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp)
469 631b7c35 Stavros Sachtouris
        apm.update_parser()
470 631b7c35 Stavros Sachtouris
        exp = len(apm.arguments) + body_count
471 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
472 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp)
473 631b7c35 Stavros Sachtouris
        expd = dict(
474 631b7c35 Stavros Sachtouris
            k1=argument.Argument(0, parsed_name='-a'),
475 631b7c35 Stavros Sachtouris
            k2=argument.Argument(0, parsed_name='-b'))
476 631b7c35 Stavros Sachtouris
        apm.update_parser(expd)
477 631b7c35 Stavros Sachtouris
        body_count = len(update_parser.mock_calls)
478 631b7c35 Stavros Sachtouris
        self.assertEqual(body_count, exp + 2)
479 631b7c35 Stavros Sachtouris
480 b57eaeb0 Stavros Sachtouris
    def test_update_arguments(self):
481 b57eaeb0 Stavros Sachtouris
        (inp, cor, exp) = (
482 b57eaeb0 Stavros Sachtouris
            {'k1': 'v1', 'k2': 'v3'}, {'k2': 'v2'}, {'k1': 'v1', 'k2': 'v2'})
483 b57eaeb0 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
484 b57eaeb0 Stavros Sachtouris
        with patch(
485 b57eaeb0 Stavros Sachtouris
                '%s.ArgumentParseManager.update_parser' % arg_path) as UP:
486 b57eaeb0 Stavros Sachtouris
            apm.update_arguments(None)
487 b57eaeb0 Stavros Sachtouris
            self.assertEqual(len(UP.mock_calls), 0)
488 b57eaeb0 Stavros Sachtouris
            apm._arguments = inp
489 b57eaeb0 Stavros Sachtouris
            apm.update_arguments(cor)
490 b57eaeb0 Stavros Sachtouris
            assert_dicts_are_equal(self, apm.arguments, exp)
491 b57eaeb0 Stavros Sachtouris
            UP.assert_called_once_with()
492 b57eaeb0 Stavros Sachtouris
493 b57eaeb0 Stavros Sachtouris
    def test_parse(self):
494 264847a7 Stavros Sachtouris
        apm = argument.ArgumentParseManager('exe')
495 264847a7 Stavros Sachtouris
        parsed, unparsed = apm.parser.parse_known_args()
496 264847a7 Stavros Sachtouris
        apm.parse()
497 264847a7 Stavros Sachtouris
        self.assertEqual(apm._parsed, parsed)
498 264847a7 Stavros Sachtouris
        self.assertEqual(apm.unparsed, unparsed)
499 b57eaeb0 Stavros Sachtouris
500 b57eaeb0 Stavros Sachtouris
501 5286e2c3 Stavros Sachtouris
if __name__ == '__main__':
502 5286e2c3 Stavros Sachtouris
    from sys import argv
503 5286e2c3 Stavros Sachtouris
    from kamaki.cli.test import runTestCase
504 5286e2c3 Stavros Sachtouris
    runTestCase(Argument, 'Argument', argv[1:])
505 a7aacf12 Stavros Sachtouris
    runTestCase(ConfigArgument, 'ConfigArgument', argv[1:])
506 1bd4f765 Stavros Sachtouris
    runTestCase(RuntimeConfigArgument, 'RuntimeConfigArgument', argv[1:])
507 3a5b1ceb Stavros Sachtouris
    runTestCase(FlagArgument, 'FlagArgument', argv[1:])
508 3a5b1ceb Stavros Sachtouris
    runTestCase(FlagArgument, 'ValueArgument', argv[1:])
509 02987e9c Stavros Sachtouris
    runTestCase(IntArgument, 'IntArgument', argv[1:])
510 b7ff6e0c Stavros Sachtouris
    runTestCase(DateArgument, 'DateArgument', argv[1:])
511 8d427cb9 Stavros Sachtouris
    runTestCase(VersionArgument, 'VersionArgument', argv[1:])
512 ca5528f1 Stavros Sachtouris
    runTestCase(RepeatableArgument, 'RepeatableArgument', argv[1:])
513 8d427cb9 Stavros Sachtouris
    runTestCase(KeyValueArgument, 'KeyValueArgument', argv[1:])
514 c0fbf04c Stavros Sachtouris
    runTestCase(ProgressBarArgument, 'ProgressBarArgument', argv[1:])
515 631b7c35 Stavros Sachtouris
    runTestCase(ArgumentParseManager, 'ArgumentParseManager', argv[1:])