Skip to content

Commit 9f80e36

Browse files
committed
validation functions testing/fixes
1 parent ad86767 commit 9f80e36

2 files changed

Lines changed: 68 additions & 20 deletions

File tree

datapath/_base.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
)
2424

2525
_key_pattern = '(?P<part>[^[.]+)'
26-
_number_pattern = r'-?[0-9]'
27-
_range_parts_pattern = '(?::' + _number_pattern + '*){0,2}'
28-
_index_pattern = r'(?P<part>\[' + _number_pattern + r'*' + _range_parts_pattern + r'\])'
26+
_number_pattern = r'-?[0-9]*'
27+
_range_parts_pattern = '(?::' + _number_pattern + '){0,2}'
28+
_index_pattern = r'(?P<part>\[' + _number_pattern + _range_parts_pattern + r'\])'
2929
_key_with_index_pattern = _key_pattern + _index_pattern + '?'
3030
_part_pattern = _key_with_index_pattern + '|' + _index_pattern
3131
_path_re = re.compile('^(?:' + _part_pattern + r')(?:\.' + _part_pattern + ')*$')
@@ -50,14 +50,15 @@ def is_path(path: str, iterable: bool = True) -> bool:
5050
if path == '':
5151
return True
5252
match = _path_re.match(path)
53+
if not match:
54+
return False
5355
if iterable:
54-
return bool(match)
55-
else:
56-
try:
57-
_split_match(match, iterable=False)
58-
return True
59-
except ValidationError:
60-
return False
56+
return True
57+
try:
58+
_split_match(match, iterable=False)
59+
return True
60+
except ValidationError:
61+
return False
6162

6263

6364
def validate_path(path: str, iterable: bool = True) -> None:

test/test_datapath.py

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,76 @@
1818
'1234567[1]',
1919
'[0]',
2020
'[5]',
21+
'[-1]',
2122
'',
2223
)
2324

25+
valid_iterable_paths = (
26+
'test[]',
27+
'[]',
28+
'test.*',
29+
'test.*wild*card*',
30+
'*',
31+
'[::2]',
32+
'[2::3]',
33+
'[-1:-10:-1]',
34+
'[].*[5:].test',
35+
)
36+
37+
invalid_paths = (
38+
'[1'
39+
'test[1',
40+
'[1[2]',
41+
'[,%$^%^!@#$%[1]',
42+
)
43+
44+
2445
class TestDatapath(unittest.TestCase):
25-
def test_validate_path_valid_cases(self):
46+
def test_validate_path_valid_cases_iterable_false(self):
2647
for valid_path in valid_paths:
2748
with self.subTest(msg=f'valid path `{valid_path}`'):
2849
try:
29-
datapath.validate_path(valid_path)
50+
datapath.validate_path(valid_path, iterable=False)
3051
except datapath.ValidationError:
3152
self.fail(f'valid path `{valid_path}` was found invalid')
3253

54+
def test_validate_path_valid_cases_iterable_true(self):
55+
for valid_path in valid_paths + valid_iterable_paths:
56+
with self.subTest(msg=f'valid path `{valid_path}`'):
57+
try:
58+
datapath.validate_path(valid_path, iterable=True)
59+
except datapath.ValidationError:
60+
self.fail(f'valid path `{valid_path}` was found invalid')
3361

34-
def test_validate_path_invalid_cases(self):
35-
invalid_paths = (
36-
'[1'
37-
'test[1',
38-
'[1[2]',
39-
'[,%$^%^!@#$%[1]',
40-
)
62+
def test_validate_path_invalid_cases_iterable_false(self):
63+
for invalid_path in invalid_paths + valid_iterable_paths:
64+
with self.subTest(msg=f'invalid path `{invalid_path}`'), self.assertRaises(datapath.ValidationError):
65+
datapath.validate_path(invalid_path, iterable=False)
66+
67+
def test_validate_path_invalid_cases_iterable_true(self):
4168
for invalid_path in invalid_paths:
4269
with self.subTest(msg=f'invalid path `{invalid_path}`'), self.assertRaises(datapath.ValidationError):
43-
datapath.validate_path(invalid_path)
70+
datapath.validate_path(invalid_path, iterable=True)
71+
72+
def test_is_path_valid_cases_iterable_false(self):
73+
for valid_path in valid_paths:
74+
with self.subTest(msg=f'valid path `{valid_path}`'):
75+
self.assertTrue(datapath.is_path(valid_path, iterable=False))
76+
77+
def test_is_path_valid_cases_iterable_true(self):
78+
for valid_path in valid_paths + valid_iterable_paths:
79+
with self.subTest(msg=f'valid path `{valid_path}`'):
80+
self.assertTrue(datapath.is_path(valid_path, iterable=True))
81+
82+
def test_is_path_invalid_cases_iterable_false(self):
83+
for invalid_path in invalid_paths + valid_iterable_paths:
84+
with self.subTest(msg=f'invalid path `{invalid_path}`'):
85+
self.assertFalse(datapath.is_path(invalid_path, iterable=False))
86+
87+
def test_is_path_invalid_cases_iterable_true(self):
88+
for invalid_path in invalid_paths:
89+
with self.subTest(msg=f'invalid path `{invalid_path}`'):
90+
self.assertFalse(datapath.is_path(invalid_path, iterable=True))
4491

4592
def test_split_path(self):
4693
tests = (

0 commit comments

Comments
 (0)