Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / utils / test.py @ 12be2bd2

History | View | Annotate | Download (20.4 kB)

1 b3cb58c2 Stavros Sachtouris
# Copyright 2013 GRNET S.A. All rights reserved.
2 b3cb58c2 Stavros Sachtouris
#
3 b3cb58c2 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 b3cb58c2 Stavros Sachtouris
# without modification, are permitted provided that the following
5 b3cb58c2 Stavros Sachtouris
# conditions are met:
6 b3cb58c2 Stavros Sachtouris
#
7 b3cb58c2 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 b3cb58c2 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 b3cb58c2 Stavros Sachtouris
#      disclaimer.
10 b3cb58c2 Stavros Sachtouris
#
11 b3cb58c2 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 b3cb58c2 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 b3cb58c2 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 b3cb58c2 Stavros Sachtouris
#      provided with the distribution.
15 b3cb58c2 Stavros Sachtouris
#
16 b3cb58c2 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 b3cb58c2 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 b3cb58c2 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 b3cb58c2 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 b3cb58c2 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 b3cb58c2 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 b3cb58c2 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 b3cb58c2 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 b3cb58c2 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 b3cb58c2 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 b3cb58c2 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 b3cb58c2 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 b3cb58c2 Stavros Sachtouris
#
29 b3cb58c2 Stavros Sachtouris
# The views and conclusions contained in the software and
30 b3cb58c2 Stavros Sachtouris
# documentation are those of the authors and should not be
31 b3cb58c2 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 b3cb58c2 Stavros Sachtouris
# or implied, of GRNET S.A.
33 b3cb58c2 Stavros Sachtouris
34 b3cb58c2 Stavros Sachtouris
from unittest import TestCase
35 23963422 Stavros Sachtouris
from tempfile import NamedTemporaryFile
36 0f383dcc Stavros Sachtouris
from mock import patch, call
37 b3cb58c2 Stavros Sachtouris
from itertools import product
38 fa9c0c38 Stavros Sachtouris
from io import StringIO
39 b3cb58c2 Stavros Sachtouris
40 b3cb58c2 Stavros Sachtouris
41 b3cb58c2 Stavros Sachtouris
class UtilsMethods(TestCase):
42 b3cb58c2 Stavros Sachtouris
43 b3cb58c2 Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
44 b3cb58c2 Stavros Sachtouris
        for k, v in d1.items():
45 b3cb58c2 Stavros Sachtouris
            self.assertTrue(k in d2)
46 b3cb58c2 Stavros Sachtouris
            if isinstance(v, dict):
47 b3cb58c2 Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
48 b3cb58c2 Stavros Sachtouris
            else:
49 b3cb58c2 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
50 b3cb58c2 Stavros Sachtouris
51 b3cb58c2 Stavros Sachtouris
    def test_guess_mime_type(self):
52 b3cb58c2 Stavros Sachtouris
        from kamaki.cli.utils import guess_mime_type
53 b3cb58c2 Stavros Sachtouris
        from mimetypes import guess_type
54 b3cb58c2 Stavros Sachtouris
        for args in product(
55 b3cb58c2 Stavros Sachtouris
                ('file.txt', 'file.png', 'file.zip', 'file.gz', None, 'X'),
56 b3cb58c2 Stavros Sachtouris
                ('a type', None),
57 b3cb58c2 Stavros Sachtouris
                ('an/encoding', None)):
58 b3cb58c2 Stavros Sachtouris
            filename, ctype, cencoding = args
59 b3cb58c2 Stavros Sachtouris
            if filename:
60 b3cb58c2 Stavros Sachtouris
                exp_type, exp_enc = guess_type(filename)
61 b3cb58c2 Stavros Sachtouris
                self.assertEqual(
62 b3cb58c2 Stavros Sachtouris
                    guess_mime_type(*args),
63 b3cb58c2 Stavros Sachtouris
                    (exp_type or ctype, exp_enc or cencoding))
64 b3cb58c2 Stavros Sachtouris
            else:
65 b3cb58c2 Stavros Sachtouris
                self.assertRaises(AssertionError, guess_mime_type, *args)
66 b3cb58c2 Stavros Sachtouris
67 0f383dcc Stavros Sachtouris
    @patch('kamaki.cli.utils.dumps', return_value='(dumps output)')
68 fa9c0c38 Stavros Sachtouris
    def test_print_json(self, JD):
69 0f383dcc Stavros Sachtouris
        from kamaki.cli.utils import print_json, INDENT_TAB
70 fa9c0c38 Stavros Sachtouris
        out = StringIO()
71 fa9c0c38 Stavros Sachtouris
        print_json('some data', out)
72 0f383dcc Stavros Sachtouris
        JD.assert_called_once_with('some data', indent=INDENT_TAB)
73 fa9c0c38 Stavros Sachtouris
        self.assertEqual(out.getvalue(), u'(dumps output)\n')
74 0f383dcc Stavros Sachtouris
75 fa9c0c38 Stavros Sachtouris
    def test_print_dict(self):
76 0f383dcc Stavros Sachtouris
        from kamaki.cli.utils import print_dict, INDENT_TAB
77 fa9c0c38 Stavros Sachtouris
        out = StringIO()
78 0f383dcc Stavros Sachtouris
        self.assertRaises(AssertionError, print_dict, 'non-dict think')
79 0f383dcc Stavros Sachtouris
        self.assertRaises(AssertionError, print_dict, {}, indent=-10)
80 0f383dcc Stavros Sachtouris
        for args in product(
81 b3cb58c2 Stavros Sachtouris
                (
82 0f383dcc Stavros Sachtouris
                    {'k1': 'v1'},
83 0f383dcc Stavros Sachtouris
                    {'k1': 'v1', 'k2': 'v2'},
84 0f383dcc Stavros Sachtouris
                    {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'},
85 0f383dcc Stavros Sachtouris
                    {'k1': 'v1', 'k2': {'k1': 'v1', 'k2': 'v2'}, 'k3': 'v3'},
86 b3cb58c2 Stavros Sachtouris
                    {
87 0f383dcc Stavros Sachtouris
                        'k1': {'k1': 'v1', 'k2': 'v2'},
88 0f383dcc Stavros Sachtouris
                        'k2': [1, 2, 3],
89 0f383dcc Stavros Sachtouris
                        'k3': 'v3'},
90 0f383dcc Stavros Sachtouris
                    {
91 0f383dcc Stavros Sachtouris
                        'k1': {'k1': 'v1', 'k2': 'v2'},
92 0f383dcc Stavros Sachtouris
                        'k2': 42,
93 0f383dcc Stavros Sachtouris
                        'k3': {'k1': 1, 'k2': [1, 2, 3]}},
94 b3cb58c2 Stavros Sachtouris
                    {
95 0f383dcc Stavros Sachtouris
                        'k1': {
96 0f383dcc Stavros Sachtouris
                            'k1': 'v1',
97 0f383dcc Stavros Sachtouris
                            'k2': [1, 2, 3],
98 0f383dcc Stavros Sachtouris
                            'k3': {'k1': [(1, 2)]}},
99 0f383dcc Stavros Sachtouris
                        'k2': (3, 4, 5),
100 0f383dcc Stavros Sachtouris
                        'k3': {'k1': 1, 'k2': [1, 2, 3]}}),
101 0f383dcc Stavros Sachtouris
                (tuple(), ('k1', ), ('k1', 'k2')),
102 0f383dcc Stavros Sachtouris
                (0, 1, 2, 9), (False, True), (False, True)):
103 0f383dcc Stavros Sachtouris
            d, exclude, indent, with_enumeration, recursive_enumeration = args
104 0f383dcc Stavros Sachtouris
            with patch('kamaki.cli.utils.print_dict') as PD:
105 0f383dcc Stavros Sachtouris
                with patch('kamaki.cli.utils.print_list') as PL:
106 0f383dcc Stavros Sachtouris
                    pd_calls, pl_calls = 0, 0
107 fa9c0c38 Stavros Sachtouris
                    print_dict(*args, out=out)
108 fa9c0c38 Stavros Sachtouris
                    exp_calls = u''
109 0f383dcc Stavros Sachtouris
                    for i, (k, v) in enumerate(d.items()):
110 0f383dcc Stavros Sachtouris
                        if k in exclude:
111 0f383dcc Stavros Sachtouris
                            continue
112 fa9c0c38 Stavros Sachtouris
                        str_k = u' ' * indent
113 fa9c0c38 Stavros Sachtouris
                        str_k += u'%s.' % (i + 1) if with_enumeration else u''
114 fa9c0c38 Stavros Sachtouris
                        str_k += u'%s:' % k
115 0f383dcc Stavros Sachtouris
                        if isinstance(v, dict):
116 0f383dcc Stavros Sachtouris
                            self.assertEqual(
117 0f383dcc Stavros Sachtouris
                                PD.mock_calls[pd_calls],
118 0f383dcc Stavros Sachtouris
                                call(
119 0f383dcc Stavros Sachtouris
                                    v,
120 0f383dcc Stavros Sachtouris
                                    exclude,
121 0f383dcc Stavros Sachtouris
                                    indent + INDENT_TAB,
122 0f383dcc Stavros Sachtouris
                                    recursive_enumeration,
123 fa9c0c38 Stavros Sachtouris
                                    recursive_enumeration,
124 fa9c0c38 Stavros Sachtouris
                                    out))
125 0f383dcc Stavros Sachtouris
                            pd_calls += 1
126 fa9c0c38 Stavros Sachtouris
                            exp_calls += str_k + '\n'
127 0f383dcc Stavros Sachtouris
                        elif isinstance(v, list) or isinstance(v, tuple):
128 0f383dcc Stavros Sachtouris
                            self.assertEqual(
129 0f383dcc Stavros Sachtouris
                                PL.mock_calls[pl_calls],
130 0f383dcc Stavros Sachtouris
                                call(
131 0f383dcc Stavros Sachtouris
                                    v,
132 0f383dcc Stavros Sachtouris
                                    exclude,
133 0f383dcc Stavros Sachtouris
                                    indent + INDENT_TAB,
134 0f383dcc Stavros Sachtouris
                                    recursive_enumeration,
135 fa9c0c38 Stavros Sachtouris
                                    recursive_enumeration,
136 fa9c0c38 Stavros Sachtouris
                                    out))
137 0f383dcc Stavros Sachtouris
                            pl_calls += 1
138 fa9c0c38 Stavros Sachtouris
                            exp_calls += str_k + '\n'
139 0f383dcc Stavros Sachtouris
                        else:
140 fa9c0c38 Stavros Sachtouris
                            exp_calls += u'%s %s\n' % (str_k, v)
141 fa9c0c38 Stavros Sachtouris
                    self.assertEqual(exp_calls, out.getvalue())
142 fa9c0c38 Stavros Sachtouris
                    out = StringIO()
143 0f383dcc Stavros Sachtouris
144 fa9c0c38 Stavros Sachtouris
    def test_print_list(self):
145 0f383dcc Stavros Sachtouris
        from kamaki.cli.utils import print_list, INDENT_TAB
146 fa9c0c38 Stavros Sachtouris
        out = StringIO()
147 0f383dcc Stavros Sachtouris
        self.assertRaises(AssertionError, print_list, 'non-list non-tuple')
148 0f383dcc Stavros Sachtouris
        self.assertRaises(AssertionError, print_list, {}, indent=-10)
149 0f383dcc Stavros Sachtouris
        for args in product(
150 0f383dcc Stavros Sachtouris
                (
151 0f383dcc Stavros Sachtouris
                    ['v1', ],
152 0f383dcc Stavros Sachtouris
                    ('v2', 'v3'),
153 0f383dcc Stavros Sachtouris
                    [1, '2', 'v3'],
154 0f383dcc Stavros Sachtouris
                    ({'k1': 'v1'}, 2, 'v3'),
155 0f383dcc Stavros Sachtouris
                    [(1, 2), 'v2', [(3, 4), {'k3': [5, 6], 'k4': 7}]]),
156 0f383dcc Stavros Sachtouris
                (tuple(), ('v1', ), ('v1', 1), ('v1', 'k3')),
157 0f383dcc Stavros Sachtouris
                (0, 1, 2, 9), (False, True), (False, True)):
158 0f383dcc Stavros Sachtouris
            l, exclude, indent, with_enumeration, recursive_enumeration = args
159 0f383dcc Stavros Sachtouris
            with patch('kamaki.cli.utils.print_dict') as PD:
160 0f383dcc Stavros Sachtouris
                with patch('kamaki.cli.utils.print_list') as PL:
161 0f383dcc Stavros Sachtouris
                    pd_calls, pl_calls = 0, 0
162 fa9c0c38 Stavros Sachtouris
                    print_list(*args, out=out)
163 fa9c0c38 Stavros Sachtouris
                    exp_calls = ''
164 0f383dcc Stavros Sachtouris
                    for i, v in enumerate(l):
165 fa9c0c38 Stavros Sachtouris
                        str_v = u' ' * indent
166 fa9c0c38 Stavros Sachtouris
                        str_v += u'%s.' % (i + 1) if with_enumeration else u''
167 0f383dcc Stavros Sachtouris
                        if isinstance(v, dict):
168 0f383dcc Stavros Sachtouris
                            if with_enumeration:
169 fa9c0c38 Stavros Sachtouris
                                exp_calls += str_v + '\n'
170 0f383dcc Stavros Sachtouris
                            elif i and i < len(l):
171 fa9c0c38 Stavros Sachtouris
                                exp_calls += u'\n'
172 0f383dcc Stavros Sachtouris
                            self.assertEqual(
173 0f383dcc Stavros Sachtouris
                                PD.mock_calls[pd_calls],
174 0f383dcc Stavros Sachtouris
                                call(
175 0f383dcc Stavros Sachtouris
                                    v,
176 0f383dcc Stavros Sachtouris
                                    exclude,
177 0f383dcc Stavros Sachtouris
                                    indent + (
178 0f383dcc Stavros Sachtouris
                                        INDENT_TAB if with_enumeration else 0),
179 0f383dcc Stavros Sachtouris
                                    recursive_enumeration,
180 fa9c0c38 Stavros Sachtouris
                                    recursive_enumeration,
181 fa9c0c38 Stavros Sachtouris
                                    out))
182 0f383dcc Stavros Sachtouris
                            pd_calls += 1
183 0f383dcc Stavros Sachtouris
                        elif isinstance(v, list) or isinstance(v, tuple):
184 0f383dcc Stavros Sachtouris
                            if with_enumeration:
185 fa9c0c38 Stavros Sachtouris
                                exp_calls += str_v + '\n'
186 0f383dcc Stavros Sachtouris
                            elif i and i < len(l):
187 fa9c0c38 Stavros Sachtouris
                                exp_calls += u'\n'
188 0f383dcc Stavros Sachtouris
                            self.assertEqual(
189 0f383dcc Stavros Sachtouris
                                PL.mock_calls[pl_calls],
190 0f383dcc Stavros Sachtouris
                                call(
191 0f383dcc Stavros Sachtouris
                                    v,
192 0f383dcc Stavros Sachtouris
                                    exclude,
193 0f383dcc Stavros Sachtouris
                                    indent + INDENT_TAB,
194 0f383dcc Stavros Sachtouris
                                    recursive_enumeration,
195 fa9c0c38 Stavros Sachtouris
                                    recursive_enumeration,
196 fa9c0c38 Stavros Sachtouris
                                    out))
197 0f383dcc Stavros Sachtouris
                            pl_calls += 1
198 0f383dcc Stavros Sachtouris
                        elif ('%s' % v) in exclude:
199 0f383dcc Stavros Sachtouris
                            continue
200 0f383dcc Stavros Sachtouris
                        else:
201 fa9c0c38 Stavros Sachtouris
                            exp_calls += u'%s%s\n' % (str_v, v)
202 fa9c0c38 Stavros Sachtouris
                    self.assertEqual(out.getvalue(), exp_calls)
203 fa9c0c38 Stavros Sachtouris
                    out = StringIO()
204 46d130c9 Stavros Sachtouris
205 46d130c9 Stavros Sachtouris
    @patch('kamaki.cli.utils.print_dict')
206 46d130c9 Stavros Sachtouris
    @patch('kamaki.cli.utils.print_list')
207 46d130c9 Stavros Sachtouris
    @patch('kamaki.cli.utils.bold', return_value='bold')
208 fa9c0c38 Stavros Sachtouris
    def test_print_items(self, bold, PL, PD):
209 46d130c9 Stavros Sachtouris
        from kamaki.cli.utils import print_items, INDENT_TAB
210 46d130c9 Stavros Sachtouris
        for args in product(
211 46d130c9 Stavros Sachtouris
                (
212 46d130c9 Stavros Sachtouris
                    42, None, 'simple outputs',
213 46d130c9 Stavros Sachtouris
                    [1, 2, 3], {1: 1, 2: 2}, (3, 4),
214 46d130c9 Stavros Sachtouris
                    ({'k': 1, 'id': 2}, [5, 6, 7], (8, 9), '10')),
215 46d130c9 Stavros Sachtouris
                (('id', 'name'), ('something', 2), ('lala', )),
216 46d130c9 Stavros Sachtouris
                (False, True),
217 fa9c0c38 Stavros Sachtouris
                (False, True)):
218 fa9c0c38 Stavros Sachtouris
            items, title, with_enumeration, with_redundancy = args
219 46d130c9 Stavros Sachtouris
            pl_counter, pd_counter = len(PL.mock_calls), len(PD.mock_calls)
220 fa9c0c38 Stavros Sachtouris
            bold_counter, out_counter = len(bold.mock_calls), 0
221 fa9c0c38 Stavros Sachtouris
            out = StringIO()
222 fa9c0c38 Stavros Sachtouris
            print_items(*args, out=out)
223 fa9c0c38 Stavros Sachtouris
            out.seek(0)
224 46d130c9 Stavros Sachtouris
            if not (isinstance(items, dict) or isinstance(
225 46d130c9 Stavros Sachtouris
                    items, list) or isinstance(items, tuple)):
226 2d1202ee Stavros Sachtouris
                if items:
227 fa9c0c38 Stavros Sachtouris
                    self.assertEqual(out.getvalue(), '%s\n' % items)
228 46d130c9 Stavros Sachtouris
            else:
229 46d130c9 Stavros Sachtouris
                for i, item in enumerate(items):
230 46d130c9 Stavros Sachtouris
                    if with_enumeration:
231 fa9c0c38 Stavros Sachtouris
                        exp_str = '%s. ' % (i + 1)
232 fa9c0c38 Stavros Sachtouris
                        self.assertEqual(out.read(len(exp_str)), exp_str)
233 46d130c9 Stavros Sachtouris
                    if isinstance(item, dict):
234 46d130c9 Stavros Sachtouris
                        title = sorted(set(title).intersection(item))
235 46d130c9 Stavros Sachtouris
                        pick = item.get if with_redundancy else item.pop
236 46d130c9 Stavros Sachtouris
                        header = ' '.join('%s' % pick(key) for key in title)
237 12be2bd2 Stavros Sachtouris
                        if header:
238 12be2bd2 Stavros Sachtouris
                            self.assertEqual(
239 12be2bd2 Stavros Sachtouris
                                bold.mock_calls[bold_counter], call(header))
240 12be2bd2 Stavros Sachtouris
                            self.assertEqual(out.read(5), 'bold\n')
241 12be2bd2 Stavros Sachtouris
                            bold_counter += 1
242 46d130c9 Stavros Sachtouris
                        self.assertEqual(
243 46d130c9 Stavros Sachtouris
                            PD.mock_calls[pd_counter],
244 fa9c0c38 Stavros Sachtouris
                            call(item, indent=INDENT_TAB, out=out))
245 46d130c9 Stavros Sachtouris
                        pd_counter += 1
246 46d130c9 Stavros Sachtouris
                    elif isinstance(item, list) or isinstance(item, tuple):
247 46d130c9 Stavros Sachtouris
                        self.assertEqual(
248 46d130c9 Stavros Sachtouris
                            PL.mock_calls[pl_counter],
249 fa9c0c38 Stavros Sachtouris
                            call(item, indent=INDENT_TAB, out=out))
250 46d130c9 Stavros Sachtouris
                        pl_counter += 1
251 46d130c9 Stavros Sachtouris
                    else:
252 fa9c0c38 Stavros Sachtouris
                        exp_str = u' %s\n' % item
253 fa9c0c38 Stavros Sachtouris
                        self.assertEqual(out.read(len(exp_str)), exp_str)
254 46d130c9 Stavros Sachtouris
255 23963422 Stavros Sachtouris
    def test_format_size(self):
256 23963422 Stavros Sachtouris
        from kamaki.cli.utils import format_size
257 23963422 Stavros Sachtouris
        from kamaki.cli import CLIError
258 23963422 Stavros Sachtouris
        for v in ('wrong', {1: '1', 2: '2'}, ('tuples', 'not OK'), [1, 2]):
259 23963422 Stavros Sachtouris
            self.assertRaises(CLIError, format_size, v)
260 23963422 Stavros Sachtouris
        for step, B, K, M, G, T in (
261 23963422 Stavros Sachtouris
                (1000, 'B', 'KB', 'MB', 'GB', 'TB'),
262 23963422 Stavros Sachtouris
                (1024, 'B', 'KiB', 'MiB', 'GiB', 'TiB')):
263 23963422 Stavros Sachtouris
            Ki, Mi, Gi = step, step * step, step * step * step
264 23963422 Stavros Sachtouris
            for before, after in (
265 23963422 Stavros Sachtouris
                    (0, '0' + B), (512, '512' + B), (
266 23963422 Stavros Sachtouris
                        Ki - 1, '%s%s' % (step - 1, B)),
267 23963422 Stavros Sachtouris
                    (Ki, '1' + K), (42 * Ki, '42' + K), (
268 23963422 Stavros Sachtouris
                        Mi - 1, '%s.99%s' % (step - 1, K)),
269 23963422 Stavros Sachtouris
                    (Mi, '1' + M), (42 * Mi, '42' + M), (
270 23963422 Stavros Sachtouris
                        Ki * Mi - 1, '%s.99%s' % (step - 1, M)),
271 23963422 Stavros Sachtouris
                    (Gi, '1' + G), (42 * Gi, '42' + G), (
272 23963422 Stavros Sachtouris
                        Mi * Mi - 1, '%s.99%s' % (step - 1, G)),
273 23963422 Stavros Sachtouris
                    (Mi * Mi, '1' + T), (42 * Mi * Mi, '42' + T), (
274 23963422 Stavros Sachtouris
                        Mi * Gi - 1, '%s.99%s' % (step - 1, T)), (
275 23963422 Stavros Sachtouris
                        42 * Mi * Gi, '%s%s' % (42 * Ki, T))):
276 23963422 Stavros Sachtouris
                self.assertEqual(format_size(before, step == 1000), after)
277 23963422 Stavros Sachtouris
278 23963422 Stavros Sachtouris
    def test_to_bytes(self):
279 23963422 Stavros Sachtouris
        from kamaki.cli.utils import to_bytes
280 23963422 Stavros Sachtouris
        for v in ('wrong', 'KABUM', 'kbps', 'kibps'):
281 23963422 Stavros Sachtouris
            self.assertRaises(ValueError, to_bytes, v, 'B')
282 23963422 Stavros Sachtouris
            self.assertRaises(ValueError, to_bytes, 42, v)
283 23963422 Stavros Sachtouris
        for v in ([1, 2, 3], ('kb', 'mb'), {'kb': 1, 'byte': 2}):
284 23963422 Stavros Sachtouris
            self.assertRaises(TypeError, to_bytes, v, 'B')
285 23963422 Stavros Sachtouris
            self.assertRaises(AttributeError, to_bytes, 42, v)
286 23963422 Stavros Sachtouris
        kl, ki = 1000, 1024
287 23963422 Stavros Sachtouris
        for size, (unit, factor) in product(
288 23963422 Stavros Sachtouris
                (0, 42, 3.14, 1023, 10000),
289 23963422 Stavros Sachtouris
                (
290 23963422 Stavros Sachtouris
                    ('B', 1), ('b', 1),
291 23963422 Stavros Sachtouris
                    ('KB', kl), ('KiB', ki),
292 23963422 Stavros Sachtouris
                    ('mb', kl * kl), ('mIb', ki * ki),
293 23963422 Stavros Sachtouris
                    ('gB', kl * kl * kl), ('GIB', ki * ki * ki),
294 23963422 Stavros Sachtouris
                    ('TB', kl * kl * kl * kl), ('tiB', ki * ki * ki * ki))):
295 23963422 Stavros Sachtouris
            self.assertEqual(to_bytes(size, unit), int(size * factor))
296 23963422 Stavros Sachtouris
297 23963422 Stavros Sachtouris
    def test_dict2file(self):
298 23963422 Stavros Sachtouris
        from kamaki.cli.utils import dict2file, INDENT_TAB
299 23963422 Stavros Sachtouris
        for d, depth in product((
300 23963422 Stavros Sachtouris
                    {'k': 42},
301 23963422 Stavros Sachtouris
                    {'k1': 'v1', 'k2': [1, 2, 3], 'k3': {'k': 'v'}},
302 23963422 Stavros Sachtouris
                    {'k1': {
303 23963422 Stavros Sachtouris
                        'k1.1': 'v1.1',
304 23963422 Stavros Sachtouris
                        'k1.2': [1, 2, 3],
305 23963422 Stavros Sachtouris
                        'k1.3': {'k': 'v'}}}),
306 23963422 Stavros Sachtouris
                (-42, 0, 42)):
307 23963422 Stavros Sachtouris
            exp = ''
308 23963422 Stavros Sachtouris
            exp_d = []
309 23963422 Stavros Sachtouris
            exp_l = []
310 23963422 Stavros Sachtouris
            exp, exp_d, exp_l = '', [], []
311 23963422 Stavros Sachtouris
            with NamedTemporaryFile() as f:
312 23963422 Stavros Sachtouris
                for k, v in d.items():
313 23963422 Stavros Sachtouris
                    sfx = '\n'
314 23963422 Stavros Sachtouris
                    if isinstance(v, dict):
315 23963422 Stavros Sachtouris
                        exp_d.append(call(v, f, depth + 1))
316 23963422 Stavros Sachtouris
                    elif isinstance(v, tuple) or isinstance(v, list):
317 23963422 Stavros Sachtouris
                        exp_l.append(call(v, f, depth + 1))
318 23963422 Stavros Sachtouris
                    else:
319 23963422 Stavros Sachtouris
                        sfx = '%s\n' % v
320 23963422 Stavros Sachtouris
                    exp += '%s%s: %s' % (
321 23963422 Stavros Sachtouris
                        ' ' * (depth * INDENT_TAB), k, sfx)
322 23963422 Stavros Sachtouris
                with patch('kamaki.cli.utils.dict2file') as D2F:
323 23963422 Stavros Sachtouris
                    with patch('kamaki.cli.utils.list2file') as L2F:
324 23963422 Stavros Sachtouris
                        dict2file(d, f, depth)
325 23963422 Stavros Sachtouris
                        f.seek(0)
326 23963422 Stavros Sachtouris
                        self.assertEqual(f.read(), exp)
327 23963422 Stavros Sachtouris
                        self.assertEqual(L2F.mock_calls, exp_l)
328 23963422 Stavros Sachtouris
                        self.assertEqual(D2F.mock_calls, exp_d)
329 23963422 Stavros Sachtouris
330 23963422 Stavros Sachtouris
    def test_list2file(self):
331 23963422 Stavros Sachtouris
        from kamaki.cli.utils import list2file, INDENT_TAB
332 23963422 Stavros Sachtouris
        for l, depth in product(
333 23963422 Stavros Sachtouris
                (
334 23963422 Stavros Sachtouris
                    (1, 2, 3),
335 23963422 Stavros Sachtouris
                    [1, 2, 3],
336 23963422 Stavros Sachtouris
                    ('v', [1, 2, 3], (1, 2, 3), {'1': 1, 2: '2', 3: 3}),
337 23963422 Stavros Sachtouris
                    ['v', {'k1': 'v1', 'k2': [1, 2, 3], 'k3': {1: '1'}}]),
338 23963422 Stavros Sachtouris
                (-42, 0, 42)):
339 23963422 Stavros Sachtouris
            with NamedTemporaryFile() as f:
340 23963422 Stavros Sachtouris
                exp, exp_d, exp_l = '', [], []
341 23963422 Stavros Sachtouris
                for v in l:
342 23963422 Stavros Sachtouris
                    if isinstance(v, dict):
343 23963422 Stavros Sachtouris
                        exp_d.append(call(v, f, depth + 1))
344 23963422 Stavros Sachtouris
                    elif isinstance(v, list) or isinstance(v, tuple):
345 23963422 Stavros Sachtouris
                        exp_l.append(call(v, f, depth + 1))
346 23963422 Stavros Sachtouris
                    else:
347 23963422 Stavros Sachtouris
                        exp += '%s%s\n' % (' ' * INDENT_TAB * depth, v)
348 23963422 Stavros Sachtouris
                with patch('kamaki.cli.utils.dict2file') as D2F:
349 23963422 Stavros Sachtouris
                    with patch('kamaki.cli.utils.list2file') as L2F:
350 23963422 Stavros Sachtouris
                        list2file(l, f, depth)
351 23963422 Stavros Sachtouris
                        f.seek(0)
352 23963422 Stavros Sachtouris
                        self.assertEqual(f.read(), exp)
353 23963422 Stavros Sachtouris
                        self.assertEqual(L2F.mock_calls, exp_l)
354 23963422 Stavros Sachtouris
                        self.assertEqual(D2F.mock_calls, exp_d)
355 23963422 Stavros Sachtouris
356 23963422 Stavros Sachtouris
    def test__parse_with_regex(self):
357 23963422 Stavros Sachtouris
        from re import compile as r_compile
358 23963422 Stavros Sachtouris
        from kamaki.cli.utils import _parse_with_regex
359 23963422 Stavros Sachtouris
        for args in product(
360 23963422 Stavros Sachtouris
                (
361 23963422 Stavros Sachtouris
                    'this is a line',
362 23963422 Stavros Sachtouris
                    'this_is_also_a_line',
363 23963422 Stavros Sachtouris
                    'This "text" is quoted',
364 23963422 Stavros Sachtouris
                    'This "quoted" "text" is more "complicated"',
365 23963422 Stavros Sachtouris
                    'Is this \'quoted\' text "double \'quoted\' or not?"',
366 23963422 Stavros Sachtouris
                    '"What \'about\' the" oposite?',
367 23963422 Stavros Sachtouris
                    ' Try with a " single double quote',
368 23963422 Stavros Sachtouris
                    'Go "down \'deep " deeper \'bottom \' up" go\' up" !'),
369 23963422 Stavros Sachtouris
                (
370 23963422 Stavros Sachtouris
                    '\'.*?\'|".*?"|^[\S]*$',
371 23963422 Stavros Sachtouris
                    r'"([A-Za-z0-9_\./\\-]*)"',
372 23963422 Stavros Sachtouris
                    r'\"(.+?)\"',
373 23963422 Stavros Sachtouris
                    '\\^a\\.\\*\\$')):
374 23963422 Stavros Sachtouris
            r_parser = r_compile(args[1])
375 23963422 Stavros Sachtouris
            self.assertEqual(
376 23963422 Stavros Sachtouris
                _parse_with_regex(*args),
377 23963422 Stavros Sachtouris
                (r_parser.split(args[0]), r_parser.findall(args[0])))
378 23963422 Stavros Sachtouris
379 23963422 Stavros Sachtouris
    def test_split_input(self):
380 23963422 Stavros Sachtouris
        from kamaki.cli.utils import split_input
381 23963422 Stavros Sachtouris
        for line, expected in (
382 89ea97e1 Stavros Sachtouris
                ('set key="v1"', ['set', 'key=v1']),
383 23963422 Stavros Sachtouris
                ('unparsable', ['unparsable']),
384 23963422 Stavros Sachtouris
                ('"parsable"', ['parsable']),
385 23963422 Stavros Sachtouris
                ('"parse" out', ['parse', 'out']),
386 23963422 Stavros Sachtouris
                ('"one', ['"one']),
387 b9eebf2a Stavros Sachtouris
                ('two" or" more"', ['two or', 'more"']),
388 23963422 Stavros Sachtouris
                ('Go "down \'deep " deeper \'bottom \' up" go\' up" !', [
389 23963422 Stavros Sachtouris
                    'Go', "down 'deep ", 'deeper', 'bottom ',
390 b9eebf2a Stavros Sachtouris
                    'up go\' up', '!']),
391 23963422 Stavros Sachtouris
                ('Is "this" a \'parsed\' string?', [
392 23963422 Stavros Sachtouris
                    'Is', 'this', 'a', 'parsed', 'string?'])):
393 23963422 Stavros Sachtouris
            self.assertEqual(split_input(line), expected)
394 23963422 Stavros Sachtouris
395 fa9c0c38 Stavros Sachtouris
    def test_ask_user(self):
396 23963422 Stavros Sachtouris
        from kamaki.cli.utils import ask_user
397 fa9c0c38 Stavros Sachtouris
        msg = u'some question'
398 fa9c0c38 Stavros Sachtouris
        out = StringIO()
399 fa9c0c38 Stavros Sachtouris
        user_in = StringIO(u'n')
400 fa9c0c38 Stavros Sachtouris
        self.assertFalse(ask_user(msg, out=out, user_in=user_in))
401 fa9c0c38 Stavros Sachtouris
        self.assertEqual(out.getvalue(), u'%s [y/N]: ' % msg)
402 23963422 Stavros Sachtouris
403 fa9c0c38 Stavros Sachtouris
        user_in.seek(0)
404 fa9c0c38 Stavros Sachtouris
        out.seek(0)
405 fa9c0c38 Stavros Sachtouris
        self.assertTrue(ask_user(msg, ('n', ), out=out, user_in=user_in))
406 fa9c0c38 Stavros Sachtouris
        self.assertEqual(out.getvalue(), u'%s [n/<not n>]: ' % msg)
407 23963422 Stavros Sachtouris
408 fa9c0c38 Stavros Sachtouris
        user_in = StringIO(unicode('N'))
409 fa9c0c38 Stavros Sachtouris
        out.seek(0)
410 fa9c0c38 Stavros Sachtouris
        self.assertTrue(ask_user(msg, ('r', 'N'), out=out, user_in=user_in))
411 fa9c0c38 Stavros Sachtouris
        self.assertEqual(out.getvalue(), u'%s [r, N/<not r, N>]: ' % msg)
412 23963422 Stavros Sachtouris
413 23963422 Stavros Sachtouris
    def test_remove_from_items(self):
414 23963422 Stavros Sachtouris
        from kamaki.cli.utils import remove_from_items
415 23963422 Stavros Sachtouris
        for v in ('wrong', [1, 2, 3], [{}, 2, {}]):
416 23963422 Stavros Sachtouris
            self.assertRaises(AssertionError, remove_from_items, v, 'none')
417 23963422 Stavros Sachtouris
        d = dict(k1=1, k2=dict(k2=2, k3=3), k3=3, k4=4)
418 23963422 Stavros Sachtouris
        for k in (d.keys() + ['kN']):
419 23963422 Stavros Sachtouris
            tmp1, tmp2 = dict(d), dict(d)
420 23963422 Stavros Sachtouris
            remove_from_items([tmp1, ], k)
421 23963422 Stavros Sachtouris
            tmp1.pop(k, None)
422 23963422 Stavros Sachtouris
            self.assert_dicts_are_equal(tmp1, tmp2)
423 23963422 Stavros Sachtouris
        for k in (d.keys() + ['kN']):
424 23963422 Stavros Sachtouris
            tmp1, tmp2 = dict(d), dict(d)
425 23963422 Stavros Sachtouris
            remove_from_items([tmp1, tmp2], k)
426 23963422 Stavros Sachtouris
            self.assert_dicts_are_equal(tmp1, tmp2)
427 23963422 Stavros Sachtouris
428 1716a15d Stavros Sachtouris
    def test_filter_dicts_by_dict(self):
429 1716a15d Stavros Sachtouris
        from kamaki.cli.utils import filter_dicts_by_dict
430 1716a15d Stavros Sachtouris
431 1716a15d Stavros Sachtouris
        dlist = [
432 1716a15d Stavros Sachtouris
            dict(k1='v1', k2='v2', k3='v3'),
433 1716a15d Stavros Sachtouris
            dict(k1='v1'),
434 1716a15d Stavros Sachtouris
            dict(k2='v2', k3='v3'),
435 1716a15d Stavros Sachtouris
            dict(k1='V1', k3='V3'),
436 1716a15d Stavros Sachtouris
            dict()]
437 1716a15d Stavros Sachtouris
        for l, f, em, cs, exp in (
438 1716a15d Stavros Sachtouris
                (dlist, dlist[2], True, False, dlist[0:1] + dlist[2:3]),
439 1716a15d Stavros Sachtouris
                (dlist, dlist[1], True, False, dlist[0:2] + dlist[3:4]),
440 1716a15d Stavros Sachtouris
                (dlist, dlist[1], True, True, dlist[0:2]),
441 1716a15d Stavros Sachtouris
                (dlist, {'k3': 'v'}, True, False, []),
442 1716a15d Stavros Sachtouris
                (dlist, {'k3': 'v'}, False, False, dlist[0:1] + dlist[2:4]),
443 1716a15d Stavros Sachtouris
                (dlist, {'k3': 'v'}, False, True, dlist[0:1] + dlist[2:3]),
444 1716a15d Stavros Sachtouris
                (dlist, {'k3': 'v'}, True, True, []),
445 854222c7 Stavros Sachtouris
                (dlist, dlist[4], True, False, dlist),
446 1716a15d Stavros Sachtouris
                ):
447 1716a15d Stavros Sachtouris
            self.assertEqual(exp, filter_dicts_by_dict(l, f, em, cs))
448 1716a15d Stavros Sachtouris
449 b3cb58c2 Stavros Sachtouris
450 b3cb58c2 Stavros Sachtouris
if __name__ == '__main__':
451 b3cb58c2 Stavros Sachtouris
    from sys import argv
452 b3cb58c2 Stavros Sachtouris
    from kamaki.cli.test import runTestCase
453 b3cb58c2 Stavros Sachtouris
    runTestCase(UtilsMethods, 'UtilsMethods', argv[1:])