def test_date_type_validator_valid_leap_year(): validator = DateCheck() # 2016 WAS a leap year mock_form = Mock() mock_form.data = '2016-02-29' mock_field = Mock() validator(mock_form, mock_field)
def get_date_form(answer=None, to_field_data=None, validate_range=False, error_messages=None): """ Returns a date form metaclass with appropriate validators. Used in both date and date range form creation. :param error_messages: The messages during validation :param answer: The answer on which to base this form :param to_field_data: The data coming from the :param validate_range: Whether the dateform should add a daterange validator :return: The generated DateForm metaclass """ class DateForm(Form): # Set up all the calendar month choices for select MONTH_CHOICES = [('', 'Select month')] + [ (str(x), calendar.month_name[x]) for x in range(1, 13) ] month = SelectField(choices=MONTH_CHOICES, default='') year = StringField() validate_with = [validators.Optional()] if not error_messages: date_messages = {} else: date_messages = error_messages.copy() if answer['mandatory'] is True: if 'validation' in answer and 'messages' in answer['validation'] \ and 'MANDATORY' in answer['validation']['messages']: date_messages['MANDATORY'] = answer['validation']['messages'][ 'MANDATORY'] validate_with = [DateRequired(message=date_messages['MANDATORY'])] if 'validation' in answer and 'messages' in answer['validation'] \ and 'INVALID_DATE' in answer['validation']['messages']: date_messages['INVALID_DATE'] = answer['validation']['messages'][ 'INVALID_DATE'] validate_with += [DateCheck(date_messages['INVALID_DATE'])] if validate_range and to_field_data: validate_with += [ DateRangeCheck(to_field_data=to_field_data, messages=date_messages) ] DateForm.day = StringField(validators=validate_with) return DateForm
def test_date_type_validator_invalid_year(self): validator = DateCheck() mock_form = Mock() mock_form.data = '20000-12-20' mock_field = Mock() with self.assertRaises(StopValidation) as ite: validator(mock_form, mock_field) self.assertEqual(error_messages['INVALID_DATE'], str(ite.exception))
def test_date_type_validator_missing_month(self): validator = DateCheck() mock_form = Mock() mock_form.data = '2016--03' mock_field = Mock() with self.assertRaises(StopValidation) as ite: validator(mock_form, mock_field) self.assertEqual(error_messages['INVALID_DATE'], str(ite.exception))
def test_date_type_validator_none(self): validator = DateCheck() mock_form = Mock() mock_form.day.data = None mock_form.month.data = None mock_form.year.data = None mock_field = Mock() with self.assertRaises(StopValidation) as ite: validator(mock_form, mock_field) self.assertEqual(error_messages['INVALID_DATE'], str(ite.exception))
def test_date_type_validator_valid_leap_year(self): validator = DateCheck() # 2016 WAS a leap year mock_form = Mock() mock_form.day.data = '29' mock_form.month.data = "02" mock_form.year.data = "2016" mock_field = Mock() try: validator(mock_form, mock_field) except StopValidation: self.fail("Valid date raised StopValidation")
def test_date_type_validator_invalid_leap_year(self): validator = DateCheck() # 2015 was not a leap year mock_form = Mock() mock_form.day.data = '29' mock_form.month.data = '02' mock_form.year.data = '2015' mock_field = Mock() with self.assertRaises(StopValidation) as ite: validator(mock_form, mock_field) self.assertEqual(error_messages['INVALID_DATE'], str(ite.exception))
def get_date_form(answer_store, metadata, answer=None, error_messages=None): """ Returns a date form metaclass with appropriate validators. Used in both date and date range form creation. :param error_messages: The messages during validation :param answer: The answer on which to base this form :param answer_store: The current answer store :param metadata: metadata for reference meta dates :return: The generated DateForm metaclass """ class DateForm(Form): day = StringField() year = StringField() @property def data(self): data = super().data if not data['year'] and not data['month'] and not data['day']: return None return '{:04d}-{:02d}-{:02d}'.format( int(data['year']), int(data['month']), int(data['day']), ) validate_with = [OptionalForm()] if answer['mandatory'] is True: validate_with = validate_mandatory_date(error_messages, answer) error_message = get_bespoke_message( answer, 'INVALID_DATE') or error_messages['INVALID_DATE'] validate_with.append(DateCheck(error_message)) if 'minimum' in answer or 'maximum' in answer: min_max_validation = validate_min_max_date(answer, answer_store, metadata, 'yyyy-mm-dd') validate_with.append(min_max_validation) # Set up all the calendar month choices for select DateForm.month = get_month_selection_field(validate_with) return DateForm
def test_date_type_validator_valid_dates(): validator = DateCheck() mock_form = Mock() mock_form.data = '2016-01-29' mock_field = Mock() validator(mock_form, mock_field) mock_form = Mock() mock_form.data = '2016-12-01' mock_field = Mock() validator(mock_form, mock_field) mock_form = Mock() mock_form.data = '2016-03-03' mock_field = Mock() validator(mock_form, mock_field)
def get_date_form(answer=None, error_messages=None): """ Returns a date form metaclass with appropriate validators. Used in both date and date range form creation. :param error_messages: The messages during validation :param answer: The answer on which to base this form :return: The generated DateForm metaclass """ class DateForm(Form): day = StringField() year = StringField() validate_with = [OptionalForm()] if not error_messages: date_messages = {} else: date_messages = error_messages.copy() if answer['mandatory'] is True: if 'validation' in answer and 'messages' in answer['validation'] \ and 'MANDATORY' in answer['validation']['messages']: date_messages['MANDATORY'] = answer['validation']['messages']['MANDATORY'] validate_with = [DateRequired(message=date_messages['MANDATORY'])] if 'validation' in answer and 'messages' in answer['validation'] \ and 'INVALID_DATE' in answer['validation']['messages']: date_messages['INVALID_DATE'] = answer['validation']['messages']['INVALID_DATE'] validate_with += [DateCheck(date_messages['INVALID_DATE'])] # Set up all the calendar month choices for select month_choices = [('', 'Select month')] + [(str(x), calendar.month_name[x]) for x in range(1, 13)] DateForm.month = SelectField(choices=month_choices, default='', validators=validate_with) return DateForm
def test_date_type_validator_valid_dates(self): validator = DateCheck() mock_form = Mock() mock_form.day.data = '01' mock_form.month.data = "01" mock_form.year.data = "2016" mock_field = Mock() try: validator(mock_form, mock_field) except StopValidation: self.fail("Valid date raised StopValidation") mock_form = Mock() mock_form.day.data = '1' mock_form.month.data = "12" mock_form.year.data = "2016" mock_field = Mock() try: validator(mock_form, mock_field) except StopValidation: self.fail("Valid date raised StopValidation") mock_form = Mock() mock_form.day.data = '01' mock_form.month.data = "03" mock_form.year.data = "2016" mock_field = Mock() try: validator(mock_form, mock_field) except StopValidation: self.fail("Valid date raised StopValidation")