diff --git a/app/main/forms.py b/app/main/forms.py index 90dd618be..b8af1c9dc 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -45,7 +45,7 @@ from app.main.validators import ( CommonlyUsedPassword, CsvFileValidator, DoesNotStartWithDoubleZero, - LettersNumbersFullStopsAndUnderscoresOnly, + LettersNumbersSingleQuotesFullStopsAndUnderscoresOnly, MustContainAlphanumericCharacters, NoCommasInPlaceHolders, NoEmbeddedImagesInSVG, @@ -1734,7 +1734,7 @@ class ServiceSmsSenderForm(StripWhitespaceForm): DataRequired(message="Cannot be empty"), Length(max=11, message="Enter 11 characters or fewer"), Length(min=3, message="Enter 3 characters or more"), - LettersNumbersFullStopsAndUnderscoresOnly(), + LettersNumbersSingleQuotesFullStopsAndUnderscoresOnly(), DoesNotStartWithDoubleZero(), ] ) diff --git a/app/main/validators.py b/app/main/validators.py index 9d09fbe0c..d3b267332 100644 --- a/app/main/validators.py +++ b/app/main/validators.py @@ -144,9 +144,9 @@ class BroadcastLength: ) -class LettersNumbersFullStopsAndUnderscoresOnly: +class LettersNumbersSingleQuotesFullStopsAndUnderscoresOnly: - regex = re.compile(r'^[a-zA-Z0-9\s\._]+$') + regex = re.compile(r"^[a-zA-Z0-9\s\._']+$") def __init__(self, message='Use letters and numbers only'): self.message = message diff --git a/tests/app/main/test_validators.py b/tests/app/main/test_validators.py index 5798dd2d4..9458dbd62 100644 --- a/tests/app/main/test_validators.py +++ b/tests/app/main/test_validators.py @@ -187,46 +187,35 @@ def test_if_string_contains_alphanumeric_characters_does_not_raise(string): MustContainAlphanumericCharacters()(None, _gen_mock_field(string)) +@pytest.mark.parametrize( + "sms_sender,error_expected,error_message", + [ + ('', True, 'Cannot be empty'), + ('22', True, 'Enter 3 characters or more'), + ('333', False, None), + ('elevenchars', False, None), # 11 chars + ('twelvecharas', True, 'Enter 11 characters or fewer'), # 12 chars + ('###', True, 'Use letters and numbers only'), + ('00111222333', True, 'Cannot start with 00'), + ('UK_GOV', False, None), # Underscores are allowed + ('UK.GOV', False, None), # Full stops are allowed + ("'UC'", False, None), # Straight single quotes are allowed + ] +) def test_sms_sender_form_validation( client, mock_get_user_by_email, + sms_sender, + error_expected, + error_message ): form = ServiceSmsSenderForm() + form.sms_sender.data = sms_sender - form.sms_sender.data = 'elevenchars' form.validate() - assert not form.errors - form.sms_sender.data = '' - form.validate() - assert "Cannot be empty" == form.errors['sms_sender'][0] - - form.sms_sender.data = 'morethanelevenchars' - form.validate() - assert "Enter 11 characters or fewer" == form.errors['sms_sender'][0] - - form.sms_sender.data = '###########' - form.validate() - assert 'Use letters and numbers only' == form.errors['sms_sender'][0] - - # Underscores are allowed - form.sms_sender.data = 'UK_GOV' - form.validate() - assert not form.errors - - # Full stops are allowed - form.sms_sender.data = 'UK.GOV' - form.validate() - assert not form.errors - - form.sms_sender.data = '22' - form.validate() - assert 'Enter 3 characters or more' == form.errors['sms_sender'][0] - - form.sms_sender.data = '333' - form.validate() - assert not form.errors - - form.sms_sender.data = '00111222333' - form.validate() - assert "Cannot start with 00" == form.errors['sms_sender'][0] + if error_expected: + assert form.errors + assert error_message == form.errors['sms_sender'][0] + else: + assert not form.errors