Completed
Branch master (6e6000)
by Fabio
01:45
created

tests.test_parse_dict   A

Complexity

Total Complexity 40

Size/Duplication

Total Lines 493
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 40
eloc 381
dl 0
loc 493
rs 9.2
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like tests.test_parse_dict often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
# -*- coding: utf-8 -*-
2
3
from benedict.dicts.parse import ParseDict
4
5
from datetime import datetime
6
from decimal import Decimal
7
from six import PY2, PY3
8
9
import time
10
import unittest
11
12
13
class parse_dict_test_case(unittest.TestCase):
14
15
    def test_get_bool_default(self):
16
        d = {
17
            'n': None,
18
        }
19
        b = ParseDict(d)
20
        self.assertTrue(b.get_bool('n', True))
21
        self.assertFalse(b.get_bool('n', False))
22
        self.assertTrue(b.get_bool('d1', True))
23
        self.assertFalse(b.get_bool('d2', False))
24
25
    def test_get_bool_with_bool_values(self):
26
        d = {
27
            'b1': True,
28
            'b2': False,
29
        }
30
        b = ParseDict(d)
31
        self.assertTrue(b.get_bool('b1'))
32
        self.assertFalse(b.get_bool('b2'))
33
34
    def test_get_bool_with_int_values(self):
35
        d = {
36
            'i0': 0,
37
            'i1': 1,
38
            'i2': 2,
39
        }
40
        b = ParseDict(d)
41
        self.assertFalse(b.get_bool('i0'))
42
        self.assertTrue(b.get_bool('i1'))
43
        self.assertTrue(b.get_bool('i2', True))
44
        self.assertFalse(b.get_bool('i2', False))
45
46
    def test_get_bool_with_str_values(self):
47
        d = {
48
            't1': '1',
49
            't2': 'YES',
50
            't3': 'True',
51
            'f1': '0',
52
            'f2': 'NO',
53
            'f3': 'False',
54
        }
55
        b = ParseDict(d)
56
        self.assertTrue(b.get_bool('t1'))
57
        self.assertTrue(b.get_bool('t2'))
58
        self.assertTrue(b.get_bool('t3'))
59
        self.assertFalse(b.get_bool('f1'))
60
        self.assertFalse(b.get_bool('f2'))
61
        self.assertFalse(b.get_bool('f3'))
62
63
    def test_get_bool_list(self):
64
        d = {
65
            'a': '1,YES,True,0,NO,False,XXX',
66
            'b': '1;YES;True;0;NO;False;XXX',
67
            'c': ['1', 'YES', True, 0, 'NO', 'False', 'XXX']
68
        }
69
        b = ParseDict(d)
70
        self.assertEqual(b.get_bool_list('a'), [True, True, True, False, False, False, None])
71
        self.assertEqual(b.get_bool_list('b'), [None])
72
        self.assertEqual(b.get_bool_list('b', separator=';'), [True, True, True, False, False, False, None])
73
        self.assertEqual(b.get_bool_list('c'), [True, True, True, False, False, False, None])
74
        self.assertEqual(b.get_bool_list('d', default=[False]), [False])
75
76
    def test_get_datetime_default(self):
77
        now = datetime.now()
78
        d = {
79
            'a': None,
80
        }
81
        b = ParseDict(d)
82
        self.assertEqual(b.get_datetime('a', now), now)
83
        self.assertEqual(b.get_datetime('b', now), now)
84
85
    def test_get_datetime_with_datetime_value(self):
86
        now = datetime.now()
87
        d = {
88
            'a': now,
89
        }
90
        b = ParseDict(d)
91
        self.assertEqual(b.get_datetime('a'), now)
92
93
    def test_get_datetime_with_timestamp_int(self):
94
        now = datetime.now()
95
        ts = time.mktime(now.timetuple()) if PY2 else datetime.timestamp(now)
96
        d = {
97
            'a': ts,
98
        }
99
        b = ParseDict(d)
100
        self.assertEqual(b.get_datetime('a'), datetime.fromtimestamp(ts))
101
102
    def test_get_datetime_with_timestamp_string(self):
103
        now = datetime.now()
104
        ts = time.mktime(now.timetuple()) if PY2 else datetime.timestamp(now)
105
        d = {
106
            'a': str(ts),
107
        }
108
        b = ParseDict(d)
109
        self.assertEqual(b.get_datetime('a'), datetime.fromtimestamp(ts))
110
111
    def test_get_datetime_with_valid_format(self):
112
        d = {
113
            'a': '2019-05-01',
114
        }
115
        b = ParseDict(d)
116
        r = datetime(2019, 5, 1, 0, 0)
117
        self.assertEqual(b.get_datetime('a', format='%Y-%m-%d'), r)
118
119
    def test_get_datetime_with_invalid_format(self):
120
        now = datetime.now()
121
        d = {
122
            'a': '2019-05-01',
123
        }
124
        b = ParseDict(d)
125
        self.assertEqual(b.get_datetime('a', format='%Y/%m/%d'), None)
126
        self.assertEqual(b.get_datetime('a', now, format='%Y/%m/%d',), now)
127
128
    def test_get_datetime_without_format(self):
129
        d = {
130
            'a': '2019-05-01',
131
        }
132
        b = ParseDict(d)
133
        r = datetime(2019, 5, 1, 0, 0)
134
        self.assertEqual(b.get_datetime('a'), r)
135
136
    def test_get_datetime_list(self):
137
        d = {
138
            'a': ['2019-05-01', '2018-12-31', 'Hello World'],
139
            'b': '2019-05-01,2018-12-31',
140
        }
141
        b = ParseDict(d)
142
        self.assertEqual(b.get_datetime_list('a'), [datetime(2019, 5, 1, 0, 0), datetime(2018, 12, 31, 0, 0), None])
143
        self.assertEqual(b.get_datetime_list('b'), [datetime(2019, 5, 1, 0, 0), datetime(2018, 12, 31, 0, 0)])
144
145
    def test_get_decimal(self):
146
        d = {
147
            'a': 1,
148
            'b': True,
149
            'c': Decimal('4.25'),
150
        }
151
        b = ParseDict(d)
152
        self.assertEqual(b.get_decimal('a'), Decimal('1.0'))
153
        self.assertEqual(b.get_decimal('b'), Decimal('0.0'))
154
        self.assertEqual(b.get_decimal('b', Decimal('2.5')), Decimal('2.5'))
155
        self.assertEqual(b.get_decimal('c'), Decimal('4.25'))
156
157
    def test_get_decimal_with_options(self):
158
        d = {
159
            'a': Decimal('0.25'),
160
            'b': Decimal('0.35'),
161
        }
162
        b = ParseDict(d)
163
        o = [Decimal('0.0'), Decimal('0.25'), Decimal('0.5'), Decimal('0.75'), Decimal('1.0')]
164
        self.assertEqual(b.get_decimal('a', Decimal('0.5'), options=o), Decimal('0.25'))
165
        self.assertEqual(b.get_decimal('b', Decimal('0.5'), options=o), Decimal('0.5'))
166
167
    def test_get_decimal_list(self):
168
        d = {
169
            'a': ['0.0', '0.5', '1.0', 'Hello World'],
170
            'b': '0.0,0.5,1.0',
171
        }
172
        b = ParseDict(d)
173
        self.assertEqual(b.get_decimal_list('a'), [Decimal('0.0'), Decimal('0.5'), Decimal('1.0'), None])
174
        self.assertEqual(b.get_decimal_list('b'), [Decimal('0.0'), Decimal('0.5'), Decimal('1.0')])
175
176
    def test_get_dict(self):
177
        d = {
178
            'a': { 'x':1, 'y':2 },
179
            'b': {},
180
        }
181
        b = ParseDict(d)
182
        self.assertEqual(b.get_dict('a'), { 'x':1, 'y':2 })
183
        self.assertEqual(b.get_dict('b'), {})
184
        self.assertEqual(b.get_dict('b', { 'default':True }), {})
185
        self.assertEqual(b.get_dict('c'), {})
186
        self.assertEqual(b.get_dict('c', { 'default':True }), { 'default':True })
187
188
    def test_get_dict_from_json(self):
189
        d = {
190
            'a': '{"numbers": ["0", "1", "2", "3", "4"], "letters": ["a", "b", "c", "d", "e"]}',
191
            'b': '["0", "1", "2", "3", "4"]',
192
            'c': '{}',
193
            'd': '[]',
194
            'e': '',
195
            'f': '{"invalid::json"}'
196
        }
197
        b = ParseDict(d)
198
        self.assertEqual(b.get_dict('a'), { 'numbers': ['0', '1', '2', '3', '4'], 'letters': ['a', 'b', 'c', 'd', 'e'] })
199
        self.assertEqual(b.get_dict('b'), {})
200
        self.assertEqual(b.get_dict('c'), {})
201
        self.assertEqual(b.get_dict('c', { 'default':True }), {})
202
        self.assertEqual(b.get_dict('d', { 'default':True }), { 'default':True })
203
        self.assertEqual(b.get_dict('e'), {})
204
        self.assertEqual(b.get_dict('f'), {})
205
        self.assertEqual(b.get_dict('g', { 'default':True }), { 'default':True })
206
207
    def test_get_float(self):
208
        d = {
209
            'a': 1.0,
210
            'b': True,
211
            'c': float(4.25),
212
        }
213
        b = ParseDict(d)
214
        self.assertEqual(b.get_float('a'), float(1.0))
215
        self.assertEqual(b.get_float('b'), float(0.0))
216
        self.assertEqual(b.get_float('b', float(2.5)), float(2.5))
217
        self.assertEqual(b.get_float('c'), float(4.25))
218
219
    def test_get_float_with_options(self):
220
        d = {
221
            'a': float(0.25),
222
            'b': float(0.35),
223
        }
224
        b = ParseDict(d)
225
        o = [float(0.0), float(0.25), float(0.5), float(0.75), float(1.0)]
226
        self.assertEqual(b.get_float('a', float(0.5), options=o), float(0.25))
227
        self.assertEqual(b.get_float('b', float(0.5), options=o), float(0.5))
228
229
    def test_get_float_list(self):
230
        d = {
231
            'a': ['0.0', '0.5', '1.0', 'Hello World'],
232
            'b': '0.0,0.5,1.0',
233
        }
234
        b = ParseDict(d)
235
        self.assertEqual(b.get_float_list('a'), [0.0, 0.5, 1.0, None])
236
        self.assertEqual(b.get_float_list('b'), [0.0, 0.5, 1.0])
237
238
    def test_get_email(self):
239
        d = {
240
            'a': '[email protected]',
241
            'b': 'fabio@@caccamo.com',
242
            'c': '[email protected]',
243
            'd': '',
244
        }
245
        b = ParseDict(d)
246
        # valid
247
        self.assertEqual(b.get_email('a'), d.get('a'))
248
        # valid (don't check blacklist)
249
        self.assertEqual(b.get_email('a', check_blacklist=False), d.get('a'))
250
        # invalid
251
        self.assertEqual(b.get_email('b'), '')
252
        # invalid (don't check blacklist)
253
        self.assertEqual(b.get_email('b', check_blacklist=False), '')
254
        # valid but disposable
255
        self.assertEqual(b.get_email('c'), '')
256
        # valid but disposable (don't check blacklist)
257
        self.assertEqual(b.get_email('c', check_blacklist=False), d.get('c'))
258
        # invalid email (empty)
259
        self.assertEqual(b.get_email('d'), '')
260
        # invalid key
261
        self.assertEqual(b.get_email('e'), '')
262
263
    def test_get_int(self):
264
        d = {
265
            'a': 1,
266
            'b': None,
267
            'c': int(4),
268
            'd': True,
269
            'e': False,
270
            'f': '3',
271
            'g': '3.5',
272
        }
273
        b = ParseDict(d)
274
        self.assertEqual(b.get_int('a'), 1)
275
        self.assertEqual(b.get_int('b'), 0)
276
        self.assertEqual(b.get_int('b', 2), 2)
277
        self.assertEqual(b.get_int('c'), 4)
278
        self.assertEqual(b.get_int('d', 2), 1)
279
        self.assertEqual(b.get_int('e', 2), 0)
280
        self.assertEqual(b.get_int('f', 2), 3)
281
        self.assertEqual(b.get_int('g', 2), 2)
282
283
    def test_get_int_with_options(self):
284
        d = {
285
            'a': 25,
286
            'b': 35,
287
        }
288
        b = ParseDict(d)
289
        o = [0, 25, 50, 75, 100]
290
        self.assertEqual(b.get_int('a', 50, options=o), 25)
291
        self.assertEqual(b.get_int('b', 50, options=o), 50)
292
293
    def test_get_int_list(self):
294
        d = {
295
            'a': ['0', '1', '2', 'Hello World'],
296
            'b': '0,1,2',
297
        }
298
        b = ParseDict(d)
299
        self.assertEqual(b.get_int_list('a'), [0, 1, 2, None])
300
        self.assertEqual(b.get_int_list('b'), [0, 1, 2])
301
302
    def test_get_list(self):
303
        d = {
304
            'a': (0, 1, 2, 3, ),
305
            'b': [0, 1, 2, 3],
306
            'c': [],
307
            'd': '{}',
308
            'e': '[]',
309
            'f': '',
310
        }
311
        b = ParseDict(d)
312
        self.assertEqual(b.get_list('a'), [0, 1, 2, 3])
313
        self.assertEqual(b.get_list('b'), [0, 1, 2, 3])
314
        self.assertEqual(b.get_list('c'), [])
315
        self.assertEqual(b.get_list('c', [0]), [])
316
        self.assertEqual(b.get_list('d'), [])
317
        self.assertEqual(b.get_list('e'), [])
318
        self.assertEqual(b.get_list('f'), [])
319
        self.assertEqual(b.get_list('g', [0]), [0])
320
321
    def test_get_list_from_json(self):
322
        d = {
323
            'a': '{"numbers": ["0", "1", "2", "3", "4"], "letters": ["a", "b", "c", "d", "e"]}',
324
            'b': '["0", "1", "2", "3", "4"]',
325
            'c': '[]',
326
        }
327
        b = ParseDict(d)
328
        self.assertEqual(b.get_list('a'), [])
329
        self.assertEqual(b.get_list('b'), ['0', '1', '2', '3', '4'])
330
        self.assertEqual(b.get_list('c'), [])
331
        self.assertEqual(b.get_list('c', [0]), [])
332
        self.assertEqual(b.get_list('d', [0]), [0])
333
334
    def test_get_list_with_separator(self):
335
        d = {
336
            'a': '0,1,2,3,4',
337
            'b': '5|6|7|8|9',
338
            'c': '',
339
        }
340
        b = ParseDict(d)
341
        self.assertEqual(b.get_list('a', separator=','), ['0', '1', '2', '3', '4'])
342
        self.assertEqual(b.get_list('b', separator='|'), ['5', '6', '7', '8', '9'])
343
        self.assertEqual(b.get_list('b'), ['5|6|7|8|9'])
344
        self.assertEqual(b.get_list('c', separator=','), [])
345
        self.assertEqual(b.get_list('d', separator=','), [])
346
        self.assertEqual(b.get_list('e', [0], separator=','), [0])
347
348
    def test_get_list_item(self):
349
        d = {
350
            'a': (1, 2, 3, 4, 5, ),
351
            'b': [6, 7, 8, 9, 0],
352
            'c': {},
353
        }
354
        b = ParseDict(d)
355
        self.assertEqual(b.get_list_item('a'), 1)
356
        self.assertEqual(b.get_list_item('a', index=1), 2)
357
        self.assertEqual(b.get_list_item('a', index=-1), 5)
358
        self.assertEqual(b.get_list_item('a', index=10), None)
359
        self.assertEqual(b.get_list_item('b'), 6)
360
        self.assertEqual(b.get_list_item('b', index=1), 7)
361
        self.assertEqual(b.get_list_item('b', index=-1), 0)
362
        self.assertEqual(b.get_list_item('b', index=10), None)
363
        self.assertEqual(b.get_list_item('c', index=1), None)
364
365
    def test_get_phonenumber(self):
366
        d = {
367
            'b': ' (0039) 3334445566 ', # valid phone number with 00 prefix
368
            'c': '+393334445566  ', # valid phone number with + prefix
369
            'd': '+39333444556677889900', # invalid phone number
370
            'e': '3334445566', # valid phone number without prefix
371
            'y': '',
372
        }
373
        r = {
374
            'e164': '+393334445566',
375
            'international': '+39 333 444 5566',
376
            'national': '333 444 5566',
377
        }
378
        b = ParseDict(d)
379
380
        # valid phone number with 00 prefix
381
        p = b.get_phonenumber('b')
382
        self.assertEqual(p, r)
383
384
        # valid phone number with + prefix
385
        p = b.get_phonenumber('c')
386
        self.assertEqual(p, r)
387
388
        # invalid phone number
389
        p = b.get_phonenumber('d')
390
        self.assertEqual(p, {})
391
392
        # valid phone number without prefix, without country code
393
        p = b.get_phonenumber('e')
394
        self.assertEqual(p, {})
395
396
        # valid phone number without prefix, with lowercase alpha_2 country code
397
        p = b.get_phonenumber('e', country_code='it')
398
        self.assertEqual(p, r)
399
400
        # valid phone number without prefix, with uppercase alpha_2 uppercase
401
        p = b.get_phonenumber('e', country_code='IT')
402
        self.assertEqual(p, r)
403
404
        # valid phone number without prefix, with lowercase alpha_3 country code
405
        p = b.get_phonenumber('e', country_code='ita')
406
        self.assertEqual(p, r)
407
408
        # valid phone number without prefix, with uppercase alpha_3 uppercase
409
        p = b.get_phonenumber('e', country_code='ITA')
410
        self.assertEqual(p, r)
411
412
        # valid phone number without prefix, with wrong country code
413
        p = b.get_phonenumber('e', country_code='fr')
414
        self.assertEqual(p, {})
415
416
        # invalid phone number (empty)
417
        p = b.get_phonenumber('y')
418
        self.assertEqual(p, {})
419
420
        # invalid phone number dict key
421
        p = b.get_phonenumber('z')
422
        self.assertEqual(p, {})
423
424
    def test_get_slug(self):
425
        d = {
426
            'a': ' Hello World ',
427
            'b': 1,
428
        }
429
        b = ParseDict(d)
430
        self.assertEqual(b.get_slug('a'), 'hello-world')
431
        self.assertEqual(b.get_slug('b', 'none'), '1')
432
        self.assertEqual(b.get_slug('c', 'none'), 'none')
433
434
    def test_get_slug_with_options(self):
435
        d = {
436
            'a': 'Sunday',
437
            'b': 'Noneday',
438
        }
439
        b = ParseDict(d)
440
        self.assertEqual(b.get_slug('a', options=['sunday', 'saturday']), 'sunday')
441
        self.assertEqual(b.get_slug('b', options=['sunday', 'saturday'], default='saturday'), 'saturday')
442
        self.assertEqual(b.get_slug('c', options=['sunday', 'saturday'], default='saturday'), 'saturday')
443
444
    def test_get_slug_list(self):
445
        d = {
446
            'a': ['Hello World', ' See you later ', 99.9],
447
            'b': 'Hello World, See you later, 99.9',
448
        }
449
        b = ParseDict(d)
450
        self.assertEqual(b.get_slug_list('a'), ['hello-world', 'see-you-later', '99-9'])
451
        self.assertEqual(b.get_slug_list('b'), ['hello-world', 'see-you-later', '99-9'])
452
453
    def test_get_str(self):
454
        d = {
455
            'a': 'Hello World',
456
            'b': 'Hello  World',
457
            'c': 1,
458
        }
459
        b = ParseDict(d)
460
        self.assertEqual(b.get_str('a'), 'Hello World')
461
        self.assertEqual(b.get_str('b'), 'Hello World')
462
        self.assertEqual(b.get_str('c'), '1')
463
464
    def test_get_str_fix_encoding(self):
465
        d = {
466
            'a': 'Sexâ\x80\x99n Drug',
467
            'b': 'Localit\xe0',
468
        }
469
        b = ParseDict(d)
470
        # only python 3
471
        if PY3:
472
            self.assertEqual(b.get_str('a'), 'Sex\'n Drug')
473
            self.assertEqual(b.get_str('b'), 'Località')
474
475
    def test_get_str_list(self):
476
        d = {
477
            'a': ['Hello World', 'See you later', 99.9],
478
            'b': 'Hello World,See you later,99.9',
479
        }
480
        b = ParseDict(d)
481
        self.assertEqual(b.get_str_list('a'), ['Hello World', 'See you later', '99.9'])
482
        self.assertEqual(b.get_str_list('b'), ['Hello World', 'See you later', '99.9'])
483
484
    def test_get_str_with_options(self):
485
        d = {
486
            'a': 'Sunday',
487
            'b': 'Noneday',
488
        }
489
        b = ParseDict(d)
490
        self.assertEqual(b.get_str('a', options=['Sunday', 'Saturday']), 'Sunday')
491
        self.assertEqual(b.get_str('b', options=['Sunday', 'Saturday'], default='Saturday'), 'Saturday')
492
        self.assertEqual(b.get_str('c', options=['Sunday', 'Saturday'], default='Saturday'), 'Saturday')
493