Skip to content

Commit aae8321

Browse files
loveshAndrew Nikitin
authored and
Andrew Nikitin
committed
add min, max length support to iterables (hyperledger#612)
Signed-off-by: Lovesh Harchandani <[email protected]>
1 parent 41cd20f commit aae8321

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

plenum/common/messages/fields.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,28 @@ def _specific_validation(self, val):
194194
class IterableField(FieldBase):
195195
_base_types = (list, tuple)
196196

197-
def __init__(self, inner_field_type: FieldValidator, **kwargs):
197+
def __init__(self, inner_field_type: FieldValidator, min_length=None,
198+
max_length=None, **kwargs):
198199
assert inner_field_type
199200
assert isinstance(inner_field_type, FieldValidator)
201+
for m in (min_length, max_length):
202+
if m is not None:
203+
assert isinstance(m, int)
204+
assert m > 0
200205

201206
self.inner_field_type = inner_field_type
207+
self.min_length = min_length
208+
self.max_length = max_length
202209
super().__init__(**kwargs)
203210

204211
def _specific_validation(self, val):
212+
if self.min_length is not None:
213+
if len(val) < self.min_length:
214+
return 'length should be at least {}'.format(self.min_length)
215+
if self.max_length is not None:
216+
if len(val) > self.max_length:
217+
return 'length should be at most {}'.format(self.max_length)
218+
205219
for v in val:
206220
check_er = self.inner_field_type.validate(v)
207221
if check_er:

plenum/test/helper.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -828,7 +828,8 @@ def chk():
828828
if fails >= acceptable_fails:
829829
logger.debug('Too many fails, the last one: {}'.format(repr(ex)))
830830
last_ex = ex
831-
assert fails <= acceptable_fails, str(last_ex)
831+
assert fails <= acceptable_fails, '{} out of {} failed. Last exception:' \
832+
' {}'.format(fails, len(funcs), last_ex)
832833

833834
kwargs = {}
834835
if retry_wait:

plenum/test/input_validation/fields_validation/test_iterable_field.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,34 @@ def test_valid_inner_type():
1313
validator = IterableField(NonNegativeNumberField())
1414
assert not validator.validate([1, 2, 3])
1515
assert validator.validate([1, 2, -3])
16+
17+
18+
def test_valid_min_max_vals():
19+
with pytest.raises(Exception):
20+
IterableField(NonNegativeNumberField(), min_length=0)
21+
22+
with pytest.raises(Exception):
23+
IterableField(NonNegativeNumberField(), max_length=0)
24+
25+
with pytest.raises(Exception):
26+
IterableField(NonNegativeNumberField(), min_length=-1)
27+
28+
with pytest.raises(Exception):
29+
IterableField(NonNegativeNumberField(), max_length=-5)
30+
31+
with pytest.raises(Exception):
32+
IterableField(NonNegativeNumberField(), min_length=2.5)
33+
34+
with pytest.raises(Exception):
35+
IterableField(NonNegativeNumberField(), max_length=3.5)
36+
37+
38+
def test_min_max_checks():
39+
validator = IterableField(NonNegativeNumberField(), min_length=3,
40+
max_length=10)
41+
assert validator.validate(list(range(2)))
42+
43+
for i in range(3, 11):
44+
assert not validator.validate(list(range(i)))
45+
46+
assert validator.validate(list(range(12)))

0 commit comments

Comments
 (0)