diff --git a/app/main/forms.py b/app/main/forms.py index 9259f5c6f..1229b61e4 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -37,10 +37,10 @@ class UKMobileNumber(StringField): if self.data.startswith('+'): self.data = self.data[1:] - if not sum([ + if not sum( self.data.startswith(prefix) for prefix in ['07', '447', '4407', '00447'] - ]): - raise ValidationError('Must be a mobile number') + ): + raise ValidationError('Must be a UK mobile number (eg 07700 900460)') for digit in self.data: try: @@ -54,7 +54,7 @@ class UKMobileNumber(StringField): raise ValidationError('Too many digits') if len(self.data) < 9: - raise ValidationError('Too few digits') + raise ValidationError('Not enough digits') def post_validate(self, form, validation_stopped): diff --git a/tests/app/main/test_phone_number_form_field.py b/tests/app/main/test_phone_number_form_field.py index a6994fce5..c7a10583a 100644 --- a/tests/app/main/test_phone_number_form_field.py +++ b/tests/app/main/test_phone_number_form_field.py @@ -6,62 +6,69 @@ from app.main.forms import UKMobileNumber class FormExample(Form): phone_number = UKMobileNumber() -phone_numbers = { - 'invalid': [ - # Too long - '0712345678910', - '0044712345678910', - '0044712345678910', - '+44 (0)7123 456 789 10', - # Too short - '0712345678', - '004471234567', - '00447123456', - '+44 (0)7123 456 78', - # Not mobile (from https://fakenumber.org/generator/freephone) - '08081 570364', - '+44 8081 570364', - '0117 496 0860', - '+44 117 496 0860', - '020 7946 0991', - '+44 20 7946 0991', - # Contains non-numbers - '07890x32109', - '07123 456789...', - '07123 ☟☜⬇⬆☞☝', - '07123☟☜⬇⬆☞☝', - '07";DROP TABLE;"', - '+44 07ab cde fgh', - ], - 'valid': [ - '07123456789', - '07123 456789', - '07123-456-789', - '00447123456789', - '00 44 7123456789', - '+447123456789', - '+44 7123 456 789', - '+44 (0)7123 456 789' +invalid_phone_numbers = sum([ + [ + (phone_number, error) for phone_number in group + ] for error, group in [ + ('Too many digits', ( + '0712345678910', + '0044712345678910', + '0044712345678910', + '+44 (0)7123 456 789 10', + )), + ('Not enough digits', ( + '0712345678', + '004471234567', + '00447123456', + '+44 (0)7123 456 78', + )), + ('Must be a UK mobile number (eg 07700 900460)', ( + '08081 570364', + '+44 8081 570364', + '0117 496 0860', + '+44 117 496 0860', + '020 7946 0991', + '+44 20 7946 0991', + '71234567890', + )), + ('Must not contain letters or symbols', ( + '07890x32109', + '07123 456789...', + '07123 ☟☜⬇⬆☞☝', + '07123☟☜⬇⬆☞☝', + '07";DROP TABLE;"', + '+44 07ab cde fgh', + )) ] -} +], []) + +valid_phone_numbers = [ + '07123456789', + '07123 456789', + '07123-456-789', + '00447123456789', + '00 44 7123456789', + '+447123456789', + '+44 7123 456 789', + '+44 (0)7123 456 789' +] -@pytest.mark.parametrize("phone_number", phone_numbers['valid']) +@pytest.mark.parametrize("phone_number", valid_phone_numbers) def test_phone_number_accepts_valid_values(phone_number): form = FormExample(phone_number=phone_number) form.validate() assert form.errors == {} -@pytest.mark.parametrize("phone_number", phone_numbers['invalid']) -def test_phone_number_rejects_invalid_values(phone_number): +@pytest.mark.parametrize("phone_number, error_message", invalid_phone_numbers) +def test_phone_number_rejects_invalid_values(phone_number, error_message): form = FormExample(phone_number=phone_number) form.validate() - print(phone_number) - assert form.errors != {} + assert form.phone_number.errors[0] == error_message -@pytest.mark.parametrize("phone_number", phone_numbers['valid']) +@pytest.mark.parametrize("phone_number", valid_phone_numbers) def test_phone_number_outputs_in_correct_format(phone_number): form = FormExample(phone_number=phone_number) form.validate()