Merge pull request #1830 from alphagov/blood

Allow full stops in SMS senders
This commit is contained in:
Chris Hill-Scott
2018-01-31 11:32:49 +00:00
committed by GitHub
3 changed files with 40 additions and 11 deletions

View File

@@ -1,4 +1,3 @@
import re
import pytz import pytz
import weakref import weakref
@@ -30,7 +29,14 @@ from wtforms.fields.html5 import EmailField, TelField, SearchField
from wtforms.validators import (DataRequired, Email, Length, Regexp, Optional) from wtforms.validators import (DataRequired, Email, Length, Regexp, Optional)
from flask_wtf.file import FileField as FileField_wtf, FileAllowed from flask_wtf.file import FileField as FileField_wtf, FileAllowed
from app.main.validators import (Blacklist, CsvFileValidator, ValidGovEmail, NoCommasInPlaceHolders, OnlyGSMCharacters) from app.main.validators import (
Blacklist,
CsvFileValidator,
ValidGovEmail,
NoCommasInPlaceHolders,
OnlyGSMCharacters,
LettersNumbersAndFullStopsOnly,
)
def get_time_value_and_label(future_time): def get_time_value_and_label(future_time):
@@ -553,15 +559,12 @@ class ServiceSmsSenderForm(StripWhitespaceForm):
'Text message sender', 'Text message sender',
validators=[ validators=[
DataRequired(message="Cant be empty"), DataRequired(message="Cant be empty"),
Length(max=11, message="Enter 11 characters or fewer") Length(max=11, message="Enter 11 characters or fewer"),
LettersNumbersAndFullStopsOnly(),
] ]
) )
is_default = BooleanField("Make this text message sender the default") is_default = BooleanField("Make this text message sender the default")
def validate_sms_sender(self, field):
if field.data and not re.match(r'^[a-zA-Z0-9\s]+$', field.data):
raise ValidationError('Use letters and numbers only')
class ServiceEditInboundNumberForm(StripWhitespaceForm): class ServiceEditInboundNumberForm(StripWhitespaceForm):
is_default = BooleanField("Make this text message sender the default") is_default = BooleanField("Make this text message sender the default")

View File

@@ -1,3 +1,4 @@
import re
from wtforms import ValidationError from wtforms import ValidationError
from notifications_utils.field import Field from notifications_utils.field import Field
from notifications_utils.gsm import get_non_gsm_compatible_characters from notifications_utils.gsm import get_non_gsm_compatible_characters
@@ -63,3 +64,15 @@ class OnlyGSMCharacters:
('It' if len(non_gsm_characters) == 1 else 'They') ('It' if len(non_gsm_characters) == 1 else 'They')
) )
) )
class LettersNumbersAndFullStopsOnly:
regex = re.compile(r'^[a-zA-Z0-9\s\.]+$')
def __init__(self, message='Use letters and numbers only'):
self.message = message
def __call__(self, form, field):
if field.data and not re.match(self.regex, field.data):
raise ValidationError(self.message)

View File

@@ -809,23 +809,36 @@ def test_incorrect_letter_contact_block_input(
@pytest.mark.parametrize('sms_sender_input, expected_error', [ @pytest.mark.parametrize('sms_sender_input, expected_error', [
('elevenchars', None),
('11 chars', None),
('', 'Cant be empty'), ('', 'Cant be empty'),
('abcdefghijkhgkg', 'Enter 11 characters or fewer') ('abcdefghijkhgkg', 'Enter 11 characters or fewer'),
(' ¯\_(ツ)_/¯ ', 'Use letters and numbers only'),
('blood.co.uk', None),
]) ])
def test_incorrect_sms_sender_input( def test_incorrect_sms_sender_input(
sms_sender_input, sms_sender_input,
expected_error, expected_error,
client_request, client_request,
no_sms_senders no_sms_senders,
mock_add_sms_sender,
): ):
page = client_request.post( page = client_request.post(
'main.service_add_sms_sender', 'main.service_add_sms_sender',
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,
_data={'sms_sender': sms_sender_input}, _data={'sms_sender': sms_sender_input},
_expected_status=200 _expected_status=(200 if expected_error else 302)
) )
assert normalize_spaces(page.select_one('.error-message').text) == expected_error error_message = page.select_one('.error-message')
count_of_api_calls = len(mock_add_sms_sender.call_args_list)
if not expected_error:
assert not error_message
assert count_of_api_calls == 1
else:
assert normalize_spaces(error_message.text) == expected_error
assert count_of_api_calls == 0
@pytest.mark.parametrize('fixture, data, api_default_args', [ @pytest.mark.parametrize('fixture, data, api_default_args', [