Merge pull request #4176 from alphagov/replay-falsey-values

Replay falsey values in input fields
This commit is contained in:
Ben Thorner
2022-03-14 09:53:02 +00:00
committed by GitHub
11 changed files with 113 additions and 94 deletions

View File

@@ -2,6 +2,7 @@ import math
import weakref import weakref
from datetime import datetime, timedelta from datetime import datetime, timedelta
from itertools import chain from itertools import chain
from numbers import Number
import pytz import pytz
from flask import Markup, render_template, request from flask import Markup, render_template, request
@@ -227,7 +228,8 @@ def password(label='Password'):
def govuk_text_input_field_widget(self, field, type=None, param_extensions=None, **kwargs): def govuk_text_input_field_widget(self, field, type=None, param_extensions=None, **kwargs):
value = kwargs["value"] if kwargs.get("value") else field.data value = kwargs["value"] if "value" in kwargs else field.data
value = str(value) if isinstance(value, Number) else value
# error messages # error messages
error_message = None error_message = None

View File

@@ -0,0 +1,12 @@
from flask_wtf import FlaskForm as Form
from app.main.forms import GovukTextInputField
def test_GovukTextInputField_renders_zero(client_request):
class FakeForm(Form):
field = GovukTextInputField()
form = FakeForm(field=0)
html = form.field()
assert 'value="0"' in html

View File

@@ -0,0 +1,61 @@
import pytest
from app.main.forms import RegisterUserForm
@pytest.mark.parametrize('password', [
'govuknotify', '11111111', 'kittykat', 'blackbox'
])
def test_should_raise_validation_error_for_password(
client_request,
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_request,
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_request,
):
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_request,
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()

View File

@@ -0,0 +1,37 @@
import pytest
from app.main.forms import ServiceSmsSenderForm
@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_request,
mock_get_user_by_email,
sms_sender,
error_expected,
error_message
):
form = ServiceSmsSenderForm()
form.sms_sender.data = sms_sender
form.validate()
if error_expected:
assert form.errors
assert error_message == form.errors['sms_sender'][0]
else:
assert not form.errors

View File

@@ -3,7 +3,6 @@ from unittest.mock import Mock
import pytest import pytest
from wtforms import ValidationError from wtforms import ValidationError
from app.main.forms import RegisterUserForm, ServiceSmsSenderForm
from app.main.validators import ( from app.main.validators import (
MustContainAlphanumericCharacters, MustContainAlphanumericCharacters,
NoCommasInPlaceHolders, NoCommasInPlaceHolders,
@@ -12,64 +11,6 @@ from app.main.validators import (
) )
@pytest.mark.parametrize('password', [
'govuknotify', '11111111', 'kittykat', 'blackbox'
])
def test_should_raise_validation_error_for_password(
client_request,
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_request,
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_request,
):
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_request,
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): def _gen_mock_field(x):
return Mock(data=x) return Mock(data=x)
@@ -185,37 +126,3 @@ def test_if_string_does_not_contain_alphanumeric_characters_raises(string):
@pytest.mark.parametrize("string", [".A8", "AB.", ".42...."]) @pytest.mark.parametrize("string", [".A8", "AB.", ".42...."])
def test_if_string_contains_alphanumeric_characters_does_not_raise(string): def test_if_string_contains_alphanumeric_characters_does_not_raise(string):
MustContainAlphanumericCharacters()(None, _gen_mock_field(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_request,
mock_get_user_by_email,
sms_sender,
error_expected,
error_message
):
form = ServiceSmsSenderForm()
form.sms_sender.data = sms_sender
form.validate()
if error_expected:
assert form.errors
assert error_message == form.errors['sms_sender'][0]
else:
assert not form.errors