Files
notifications-admin/tests/app/main/test_validators.py

239 lines
6.3 KiB
Python
Raw Normal View History

from unittest.mock import Mock
import pytest
from wtforms import ValidationError
from app.main.forms import RegisterUserForm, ServiceSmsSenderForm
from app.main.validators import (
2019-11-08 17:12:32 +00:00
MustContainAlphanumericCharacters,
NoCommasInPlaceHolders,
OnlySMSCharacters,
ValidGovEmail,
)
@pytest.mark.parametrize('password', [
'govuknotify', '11111111', 'kittykat', 'blackbox'
])
def test_should_raise_validation_error_for_password(
client,
mock_get_user_by_email,
password,
):
form = RegisterUserForm()
form.name.data = 'test'
form.email_address.data = 'teset@example.gov.uk'
form.mobile_number.data = '441231231231'
form.password.data = password
form.validate()
assert 'Choose a password thats harder to guess' in form.errors['password']
def test_valid_email_not_in_valid_domains(
client,
mock_get_organisations,
):
form = RegisterUserForm(email_address="test@test.com", mobile_number='441231231231')
assert not form.validate()
assert "Enter a public sector email address" in form.errors['email_address'][0]
def test_valid_email_in_valid_domains(
client
):
form = RegisterUserForm(
name="test",
email_address="test@my.gov.uk",
mobile_number='4407888999111',
password='an uncommon password')
form.validate()
assert form.errors == {}
def test_invalid_email_address_error_message(
client,
mock_get_organisations,
):
form = RegisterUserForm(
name="test",
email_address="test.com",
mobile_number='4407888999111',
password='1234567890')
assert not form.validate()
form = RegisterUserForm(
name="test",
email_address="test.com",
mobile_number='4407888999111',
password='1234567890')
assert not form.validate()
def _gen_mock_field(x):
return Mock(data=x)
@pytest.mark.parametrize("email", [
'test@gov.uk',
'test@GOV.UK',
'test@gov.uK',
'test@test.test.gov.uk',
'test@test.gov.uk',
'test@mod.uk',
'test@ddc-mod.org',
'test@test.ddc-mod.org',
'test@gov.scot',
'test@test.gov.scot',
'test@parliament.uk',
'test@gov.parliament.uk',
'test@nhs.uk',
'test@gov.nhs.uk',
'test@nhs.net',
'test@gov.nhs.net',
'test@police.uk',
'test@gov.police.uk',
'test@GOV.PoliCe.uk',
'test@scotent.co.uk',
'test@assembly.wales',
'test@cjsm.net',
])
def test_valid_list_of_white_list_email_domains(
client,
email,
):
email_domain_validators = ValidGovEmail()
email_domain_validators(None, _gen_mock_field(email))
@pytest.mark.parametrize("email", [
'test@ukgov.uk',
'test@gov.uk.uk',
'test@gov.test.uk',
'test@ukmod.uk',
'test@mod.uk.uk',
'test@mod.test.uk',
'test@ukddc-mod.org',
'test@ddc-mod.org.uk',
'test@ddc-mod.uk.org',
'test@ukgov.scot',
'test@gov.scot.uk',
'test@gov.test.scot',
'test@ukparliament.uk',
'test@parliament.uk.uk',
'test@parliament.test.uk',
'test@uknhs.uk',
'test@nhs.uk.uk',
'test@uknhs.net',
'test@nhs.net.uk',
'test@nhs.test.net',
'test@ukpolice.uk',
'test@police.uk.uk',
2016-10-18 13:51:34 +01:00
'test@police.test.uk',
'test@ucds.com',
'test@123bl.uk',
])
def test_invalid_list_of_white_list_email_domains(
client,
email,
mock_get_organisations,
):
email_domain_validators = ValidGovEmail()
with pytest.raises(ValidationError):
email_domain_validators(None, _gen_mock_field(email))
def test_for_commas_in_placeholders(
client
):
with pytest.raises(ValidationError) as error:
NoCommasInPlaceHolders()(None, _gen_mock_field('Hello ((name,date))'))
2019-09-12 16:49:18 +01:00
assert str(error.value) == 'You cannot put commas between double brackets'
NoCommasInPlaceHolders()(None, _gen_mock_field('Hello ((name))'))
@pytest.mark.parametrize('msg', ['The quick brown fox', 'Thé “quick” bröwn fox\u200B'])
def test_sms_character_validation(client, msg):
OnlySMSCharacters(template_type='sms')(None, _gen_mock_field(msg))
@pytest.mark.parametrize('data, err_msg', [
(
'∆ abc 📲 def 📵 ghi',
(
2019-09-12 16:49:18 +01:00
'You cannot use ∆, 📲 or 📵 in text messages. '
'They will not show up properly on everyones phones.'
)
),
(
'📵',
(
2019-09-12 16:49:18 +01:00
'You cannot use 📵 in text messages. '
'It will not show up properly on everyones phones.'
)
),
])
def test_non_sms_character_validation(data, err_msg, client):
with pytest.raises(ValidationError) as error:
OnlySMSCharacters(template_type='sms')(None, _gen_mock_field(data))
assert str(error.value) == err_msg
2019-11-08 17:12:32 +00:00
@pytest.mark.parametrize("string", [".", "A.", ".8...."])
def test_if_string_does_not_contain_alphanumeric_characters_raises(string):
with pytest.raises(ValidationError) as error:
MustContainAlphanumericCharacters()(None, _gen_mock_field(string))
assert str(error.value) == "Must include at least two alphanumeric characters"
@pytest.mark.parametrize("string", [".A8", "AB.", ".42...."])
def test_if_string_contains_alphanumeric_characters_does_not_raise(string):
MustContainAlphanumericCharacters()(None, _gen_mock_field(string))
def test_sms_sender_form_validation(
client,
mock_get_user_by_email,
):
2017-10-30 14:30:43 +00:00
form = ServiceSmsSenderForm()
form.sms_sender.data = 'elevenchars'
form.validate()
assert not form.errors
form.sms_sender.data = ''
form.validate()
2019-09-12 16:49:18 +01:00
assert "Cannot be empty" == form.errors['sms_sender'][0]
2016-07-01 16:32:21 +01:00
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]
2020-04-02 15:57:46 +01:00
# 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]
2018-02-15 16:39:42 +00:00
form.sms_sender.data = '333'
2018-02-15 16:39:42 +00:00
form.validate()
assert not form.errors
form.sms_sender.data = '00111222333'
form.validate()
2019-09-12 16:49:18 +01:00
assert "Cannot start with 00" == form.errors['sms_sender'][0]