def test_should_return_error_for_integer_range_validation(self): field = IntegerField(name="Age", code="Q2", label="What is your age", language="eng", range=NumericConstraint(min=15, max=120), ddtype=self.ddtype) valid_value = field.validate("120") self.assertEqual(valid_value, 120) valid_value = field.validate("25.5") self.assertEqual(valid_value, 25.5)
def test_should_return_error_for_integer_range_validation(self): field = IntegerField( name="Age", code="Q2", label="What is your age", constraints=[NumericRangeConstraint(min=15, max=120)]) valid_value = field.validate("120") self.assertEqual(valid_value, 120) valid_value = field.validate("25.5") self.assertEqual(valid_value, 25.5)
def test_should_return_error_for_wrong_type_for_integer(self): with self.assertRaises(AnswerWrongType) as e: field = IntegerField( name="Age", code="Q2", label="What is your age", constraints=[NumericRangeConstraint(min=15, max=120)]) field.validate("asas") self.assertEqual(e.exception.message, "Answer asas for question Q2 is of the wrong type.")
def test_should_raise_regex_mismatch_exception_if_invalid_phone_number( self): mobile_number_length = TextLengthConstraint(max=15) mobile_number_pattern = RegexConstraint(reg='^[0-9]+$') field = TelephoneNumberField( name="test", code='MC', label='question', constraints=[mobile_number_length, mobile_number_pattern], instruction='') with self.assertRaises(RegexMismatchException): field.validate(u'020321dsa')
def test_telephone_number_should_clean_before_validate(self): mobile_number_length = TextLengthConstraint(max=15) mobile_number_pattern = RegexConstraint(reg='^[0-9]+$') field = TelephoneNumberField( name="test", code='MC', label='question', constraints=[mobile_number_length, mobile_number_pattern], instruction='') self.assertEqual(u'266123321435', field.validate(u'2.66123321435e+11')) self.assertEqual(u'266123321435', field.validate(u'266-123321435')) self.assertEqual(u'266123321435', field.validate(u'266123321435.0'))
def test_telephone_number_should_not_trim_the_leading_zeroes(self): field = TelephoneNumberField(name="test", code='MC', label='question', constraints=[], instruction='') self.assertEqual(u'020', field.validate(u'020'))
def test_should_validate_location_with_whitespaces(self): expect_lat_long = (89.1, 100.1) field = GeoCodeField(name="field1_Loc", code="Q1", label="Where do you stay?") actual_lat_long = field.validate(lat_long_string="89.1 100.1") self.assertEqual(expect_lat_long, actual_lat_long)
def test_should_return_error_for_integer_range_validation_for_min_value(self): with self.assertRaises(AnswerTooSmallException) as e: field = IntegerField(name="Age", code="Q2", label="What is your age", language="eng", range=NumericConstraint(min=15, max=120), ddtype=self.ddtype) valid_value = field.validate(11) self.assertFalse(valid_value) self.assertEqual(e.exception.message, "Answer 11 for question Q2 is smaller than allowed.")
def test_should_return_error_for_text_length_validation_for_min_value(self): with self.assertRaises(AnswerTooShortException) as e: field = TextField(name="Age", code="Q2", label="What is your age", language="eng", length=TextConstraint(min=15, max=120), ddtype=self.ddtype) valid_value = field.validate("short") self.assertFalse(valid_value) self.assertEqual(e.exception.message, "Answer short for question Q2 is shorter than allowed.")
def test_should_create_location_field_type_for_default_english_language( self): expected_json = { "label": "Where do you stay?", "name": "field1_Loc", "code": "Q1", "type": "geocode", "parent_field_code": None, "required": True, "instruction": "test_instruction", "appearance": None, "constraint_message": None, "default": None, "hint": None, "xform_constraint": None, "relevant": None } field = GeoCodeField( name="field1_Loc", code="Q1", label="Where do you stay?", instruction="test_instruction", ) actual_json = field._to_json() self.assertEqual(actual_json, expected_json) field.set_value(field.validate("23,23")) self.assertEqual("23.0, 23.0", field.convert_to_unicode())
def test_should_remove_spaces_if_present_in_answer_for_multi_select(self): field = SelectField(name="color", code="Q3", label="What is your favorite color", options=[("RED", 'a'), ("YELLOW", 'b'), ('green')], single_select_flag=False, instruction="test_instruction") self.assertEqual(['RED', 'YELLOW'], field.validate('a b'))
def _validate_answer_for_field(self, answer, field): try: value = field.validate(answer) return True, value except Exception as e: field.errors.append(e.message) self._validation_exception.append(e) return False, e.message
def test_should_validate_location(self): expect_lat_long = (89.1, 100.1) field = GeoCodeField(name="field1_Loc", code="Q1", label="Where do you stay?", ddtype=self.ddtype, language="eng") actual_lat_long = field.validate(lat_long_string="89.1 100.1") self.assertEqual(expect_lat_long, actual_lat_long)
def test_successful_text_length_validation(self): field = TextField(name="Name", code="Q2", label="What is your Name", language="eng", length=TextConstraint(min=4, max=15), ddtype=self.ddtype) field1 = TextField(name="Name", code="Q2", label="What is your Name", language="eng", ddtype=self.ddtype) valid_value = field.validate("valid") self.assertEqual(valid_value, "valid") valid_value = field1.validate("valid") self.assertEqual(valid_value, "valid")
def test_successful_text_length_validation(self): field = TextField(name="Name", code="Q2", label="What is your Name", constraints=[TextLengthConstraint(min=4, max=15)]) field1 = TextField(name="Name", code="Q2", label="What is your Name") valid_value = field.validate("valid") self.assertEqual(valid_value, "valid") valid_value = field1.validate("valid") self.assertEqual(valid_value, "valid")
def test_should_give_error_for_invalid_location(self): field = GeoCodeField(name="field1_Loc", code="Q1", label="Where do you stay?", ddtype=self.ddtype, language="eng") with self.assertRaises(GeoCodeFormatException) as e: field.validate(lat_long_string="89.1") self.assertEquals(("89.1",), e.exception.data) with self.assertRaises(GeoCodeFormatException): field.validate(lat_long_string=" ") with self.assertRaises(GeoCodeFormatException): field.validate(lat_long_string="") with self.assertRaises(GeoCodeFormatException): field.validate(lat_long_string=None)
def test_should_return_error_for_incorrect_date_format_error_for_wrong_format( self): with self.assertRaises(IncorrectDate) as e: field = DateField(name="Age", code="Q2", label="What is your birth date", language="eng", date_format="mm.yyyy", ddtype=self.ddtype) valid_value = field.validate("13.2010") self.assertFalse(valid_value) self.assertEqual( e.exception.message, "Answer 13.2010 for question Q2 is invalid. Expected date in mm.yyyy format" ) with self.assertRaises(IncorrectDate) as e: field = DateField(name="Age", code="Q2", label="What is your birth date", language="eng", date_format="dd.mm.yyyy", ddtype=self.ddtype) valid_value = field.validate("33.12.2010") self.assertFalse(valid_value) self.assertEqual( e.exception.message, "Answer 33.12.2010 for question Q2 is invalid. Expected date in dd.mm.yyyy format" ) with self.assertRaises(IncorrectDate) as e: field = DateField(name="Age", code="Q2", label="What is your birth date", language="eng", date_format="mm.dd.yyyy", ddtype=self.ddtype) valid_value = field.validate("13.01.2010") self.assertFalse(valid_value) self.assertEqual( e.exception.message, "Answer 13.01.2010 for question Q2 is invalid. Expected date in mm.dd.yyyy format" )
def test_should_give_error_for_invalid_location(self): field = GeoCodeField(name="field1_Loc", code="Q1", label="Where do you stay?") with self.assertRaises(GeoCodeFormatException) as e: field.validate(lat_long_string="89.1") self.assertEquals(("89.1", ), e.exception.data) with self.assertRaises(RequiredFieldNotPresentException): field.validate(lat_long_string=" ") with self.assertRaises(RequiredFieldNotPresentException): field.validate(lat_long_string="") with self.assertRaises(RequiredFieldNotPresentException): field.validate(lat_long_string=None)
def test_should_return_error_for_integer_range_validation_for_min_value( self): with self.assertRaises(AnswerTooSmallException) as e: field = IntegerField( name="Age", code="Q2", label="What is your age", constraints=[NumericRangeConstraint(min=15, max=120)]) valid_value = field.validate(11) self.assertFalse(valid_value) self.assertEqual(e.exception.message, "Answer 11 for question Q2 is smaller than allowed.")
def test_should_return_error_for_text_length_validation_for_max_value( self): with self.assertRaises(AnswerTooLongException) as e: field = TextField(name="Age", code="Q2", label="What is your age", constraints=[TextLengthConstraint(min=1, max=4)]) valid_value = field.validate("long_answer") self.assertFalse(valid_value) self.assertEqual( e.exception.message, "Answer long_answer for question Q2 is longer than allowed.")
def test_should_create_multi_select_field_type_for_default_english_language( self): expected_json = { "label": "What is your favorite color", "name": "color", "choices": [{ "text": "RED", "val": 'a' }, { "text": "YELLOW", "val": 'b' }, { "text": 'green', 'val': 'green' }], "code": "Q3", "parent_field_code": None, "type": "select", "required": True, "instruction": "test_instruction", "appearance": None, "constraint_message": None, "default": None, "hint": None, "xform_constraint": None, "relevant": None, "is_cascade": False } field = SelectField(name="color", code="Q3", label="What is your favorite color", options=[("RED", 'a'), ("YELLOW", 'b'), ('green')], single_select_flag=False, instruction="test_instruction") actual_json = field._to_json() self.assertEqual(actual_json, expected_json) field.set_value(field.validate('ab')) self.assertEqual("RED,YELLOW", field.convert_to_unicode())
def test_should_validate_for_required_field(self): field = TextField(name='text_field', code=None, label=None) with self.assertRaises(RequiredFieldNotPresentException): field.validate(None) with self.assertRaises(RequiredFieldNotPresentException): field.validate("") with self.assertRaises(RequiredFieldNotPresentException): field.validate(" ")
def test_should_return_error_for_text_length_validation_for_min_value( self): with self.assertRaises(AnswerTooShortException) as e: field = TextField(name="Age", code="Q2", label="What is your age", language="eng", length=TextConstraint(min=15, max=120), ddtype=self.ddtype) valid_value = field.validate("short") self.assertFalse(valid_value) self.assertEqual( e.exception.message, "Answer short for question Q2 is shorter than allowed.")
def test_should_return_error_for_integer_range_validation_for_max_value( self): with self.assertRaises(AnswerTooBigException) as e: field = IntegerField(name="Age", code="Q2", label="What is your age", language="eng", range=NumericConstraint(min=15, max=120), ddtype=self.ddtype) valid_value = field.validate(150) self.assertFalse(valid_value) self.assertEqual( e.exception.message, "Answer 150 for question Q2 is greater than allowed.")
def test_should_return_error_for_incorrect_date_format_error_for_wrong_format(self): with self.assertRaises(IncorrectDate) as e: field = DateField(name="Age", code="Q2", label="What is your birth date", language="eng", date_format="mm.yyyy", ddtype=self.ddtype) valid_value = field.validate("13.2010") self.assertFalse(valid_value) self.assertEqual(e.exception.message, "Answer 13.2010 for question Q2 is invalid. Expected date in mm.yyyy format") with self.assertRaises(IncorrectDate) as e: field = DateField(name="Age", code="Q2", label="What is your birth date", language="eng", date_format="dd.mm.yyyy", ddtype=self.ddtype) valid_value = field.validate("33.12.2010") self.assertFalse(valid_value) self.assertEqual(e.exception.message, "Answer 33.12.2010 for question Q2 is invalid. Expected date in dd.mm.yyyy format") with self.assertRaises(IncorrectDate) as e: field = DateField(name="Age", code="Q2", label="What is your birth date", language="eng", date_format="mm.dd.yyyy", ddtype=self.ddtype) valid_value = field.validate("13.01.2010") self.assertFalse(valid_value) self.assertEqual(e.exception.message, "Answer 13.01.2010 for question Q2 is invalid. Expected date in mm.dd.yyyy format")
def test_should_validate_text_data_based_on_list_of_constraints(self): length_constraint = TextLengthConstraint(min=10, max=12) regex_constraint = RegexConstraint("^[A-Za-z0-9]+$") constraints = [length_constraint, regex_constraint] field = TextField(name="test", code='MC', label='question', constraints=constraints) self.assertEqual('validatable', field.validate('validatable')) self.assertRaises(RegexMismatchException, field.validate, '!alidatabl!') self.assertRaises(AnswerTooShortException, field.validate, 'val') self.assertRaises(AnswerTooLongException, field.validate, 'val11111111111111')
def test_should_create_select_one_field_type_for_default_english_language( self): expected_json = { "label": "What is your favorite color", "name": "color", "choices": [{ "text": "RED", "val": 'a' }, { "text": "YELLOW", "val": 'b' }, { "text": 'green', "val": 'c' }], "code": "Q3", 'parent_field_code': None, "type": "select1", "required": True, "instruction": None } field = SelectField(name="color", code="Q3", label="What is your favorite color", options=[("RED", 'a'), ("YELLOW", 'b'), ('green', 'c')]) actual_json = field._to_json() self.assertEqual(actual_json, expected_json) field.set_value(field.validate('b')) self.assertEqual("YELLOW", field.convert_to_unicode())
def test_should_validate_location_with_whitespaces(self): expect_lat_long=(89.1, 100.1) field = GeoCodeField(name="field1_Loc", code="Q1", label="Where do you stay?", ddtype=self.ddtype, language="eng") actual_lat_long = field.validate(lat_long_string=" 89.1 100.1 ") self.assertEqual(expect_lat_long, actual_lat_long)
def test_should_return_error_for_wrong_type_for_integer(self): with self.assertRaises(AnswerWrongType) as e: field = IntegerField(name="Age", code="Q2", label="What is your age", language="eng", range=NumericConstraint(min=15, max=120), ddtype=self.ddtype) field.validate("asas") self.assertEqual(e.exception.message, "Answer asas for question Q2 is of the wrong type.")
def _validate_answer_for_field(self, answer, field): try: value = field.validate(answer) return True, value except MangroveException as e: return False, e.message