diff --git a/app/main/validators.py b/app/main/validators.py index 096f83c51..6b1b60374 100644 --- a/app/main/validators.py +++ b/app/main/validators.py @@ -1,7 +1,8 @@ from wtforms import ValidationError from notifications_utils.template import Template -from notifications_utils.gsm import get_non_gsm_characters +from notifications_utils.gsm import get_non_gsm_compatible_characters +from app import formatted_list from app.main._blacklisted_passwords import blacklisted_passwords from app.utils import ( Spreadsheet, @@ -54,8 +55,10 @@ class NoCommasInPlaceHolders: class OnlyGSMCharacters: def __call__(self, form, field): - non_gsm_characters = get_non_gsm_characters(field.data) + non_gsm_characters = sorted(list(get_non_gsm_compatible_characters(field.data))) if non_gsm_characters: - raise ValidationError('The following characters are not allowed in text messages: {}'.format( - ', '.join(non_gsm_characters) - )) + raise ValidationError( + 'You can’t use {} in text messages. They won’t show up properly on everyone’s phones.'.format( + formatted_list(non_gsm_characters, conjunction='or') + ) + ) diff --git a/tests/app/main/test_validators.py b/tests/app/main/test_validators.py index 9d4917507..432d73aac 100644 --- a/tests/app/main/test_validators.py +++ b/tests/app/main/test_validators.py @@ -1,6 +1,6 @@ import pytest from app.main.forms import RegisterUserForm, ServiceSmsSender -from app.main.validators import ValidGovEmail, NoCommasInPlaceHolders +from app.main.validators import ValidGovEmail, NoCommasInPlaceHolders, OnlyGSMCharacters from wtforms import ValidationError from unittest.mock import Mock @@ -141,6 +141,21 @@ def test_for_commas_in_placeholders( NoCommasInPlaceHolders()(None, _gen_mock_field('Hello ((name))')) +@pytest.mark.parametrize('msg', ['The quick brown fox', 'Thé “quick” bröwn fox\u200B']) +def test_gsm_character_validation(client, msg): + OnlyGSMCharacters()(None, _gen_mock_field(msg)) + + +def test_non_gsm_character_validation(client): + with pytest.raises(ValidationError) as error: + OnlyGSMCharacters()(None, _gen_mock_field('∆ abc 📲 def 📵 ghi')) + + assert str(error.value) == ( + 'You can’t use ‘∆’, ‘📲’ or ‘📵’ in text messages. ' + 'They won’t show up properly on everyone’s phones.' + ) + + def test_sms_sender_form_validation( client, mock_get_user_by_email,