diff --git a/pyaccuwage/fields.py b/pyaccuwage/fields.py index 18aaabf..8291d63 100644 --- a/pyaccuwage/fields.py +++ b/pyaccuwage/fields.py @@ -23,10 +23,11 @@ class Field(object): is_read_only = False _value = None - def __init__(self, name=None, max_length=0, blank=False, required=True, uppercase=True, creation_counter=None): + def __init__(self, name=None, min_length=0, max_length=0, blank=False, required=True, uppercase=True, creation_counter=None): self.name = name self._value = None self._orig_value = None + self.min_length = min_length self.max_length = max_length self.blank = blank self.required = required @@ -120,10 +121,13 @@ class TextField(Field): def validate(self): if self.value is None and self.required: raise ValidationError("value required", field=self) - if len(self.get_data()) > self.max_length: + data = self.get_data() + if len(data) > self.max_length: raise ValidationError("value is too long", field=self) - if len(self.get_data().strip()) == 0 and (not self.blank and self.required): - print(self.name, 'blank', self.blank, self.required) + stripped_data_length = len(data.strip()) + if stripped_data_length < self.min_length: + raise ValidationError("value is too short", field=self) + if stripped_data_length == 0 and (not self.blank and self.required): raise ValidationError("field cannot be blank", field=self) def get_data(self): diff --git a/setup.py b/setup.py index c3d830a..ca6d8c5 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ def pyaccuwage_tests(): return test_suite setup(name='pyaccuwage', - version='0.2024.1', + version='0.2024.2', packages=['pyaccuwage'], scripts=[ 'scripts/pyaccuwage-checkseq', diff --git a/tests/test_fields.py b/tests/test_fields.py index 050285e..2707e6f 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -38,6 +38,29 @@ class TestTextField(unittest.TestCase): field.validate() self.assertEqual(field.get_data(), b' ' * 6) + def testStringRequiredUnassigned(self): + field = TextField(max_length=6) + self.assertRaises(ValidationError, lambda: field.validate()) + + def testStringRequiredNonBlank(self): + field = TextField(max_length=6) + field.value = '' + self.assertRaises(ValidationError, lambda: field.validate()) + + def testStringRequiredBlank(self): + field = TextField(max_length=6, blank=True) + field.value = '' + field.validate() + self.assertEqual(len(field.get_data()), 6) + + def testStringMinimumLength(self): + field = TextField(max_length=6, min_length=6, blank=True) # blank has no effect + field.value = '' # one character too short + self.assertRaises(ValidationError, lambda: field.validate()) + field.value = '12345' # one character too short + self.assertRaises(ValidationError, lambda: field.validate()) + field.value = '123456' # one character too short + class TestStaticField(unittest.TestCase): def test_static_field(self): field = StaticField(value='TEST')