From e0b62bed70d66dc0f8a4cae0f0c5104d6dc12638 Mon Sep 17 00:00:00 2001 From: Ben Thorner Date: Fri, 11 Mar 2022 11:12:26 +0000 Subject: [PATCH] Group form tests in a directory This makes it clearer we have tests for the code in forms.py, which I missed initially. In future we could also split up forms.py in a similar way, as it's currently _very long_. As part of grouping tests for code in forms.py, I've extracted some from test_validators.py, so that what remains is focussed on testing the code in validators.py. --- .../main/{ => forms}/test_choose_time_form.py | 0 .../test_create_key_form.py} | 0 .../main/{ => forms}/test_placeholder_form.py | 0 .../app/main/forms/test_register_user_form.py | 61 ++++++++++++ .../test_service_contact_details_form.py | 0 .../forms/test_service_sms_senders_form.py | 37 ++++++++ .../test_strip_whitespace.py} | 0 .../main/{ => forms}/test_two_factor_form.py | 0 tests/app/main/test_validators.py | 93 ------------------- 9 files changed, 98 insertions(+), 93 deletions(-) rename tests/app/main/{ => forms}/test_choose_time_form.py (100%) rename tests/app/main/{test_create_api_key_form.py => forms/test_create_key_form.py} (100%) rename tests/app/main/{ => forms}/test_placeholder_form.py (100%) create mode 100644 tests/app/main/forms/test_register_user_form.py rename tests/app/main/{ => forms}/test_service_contact_details_form.py (100%) create mode 100644 tests/app/main/forms/test_service_sms_senders_form.py rename tests/app/main/{test_strip_whitespace_form.py => forms/test_strip_whitespace.py} (100%) rename tests/app/main/{ => forms}/test_two_factor_form.py (100%) diff --git a/tests/app/main/test_choose_time_form.py b/tests/app/main/forms/test_choose_time_form.py similarity index 100% rename from tests/app/main/test_choose_time_form.py rename to tests/app/main/forms/test_choose_time_form.py diff --git a/tests/app/main/test_create_api_key_form.py b/tests/app/main/forms/test_create_key_form.py similarity index 100% rename from tests/app/main/test_create_api_key_form.py rename to tests/app/main/forms/test_create_key_form.py diff --git a/tests/app/main/test_placeholder_form.py b/tests/app/main/forms/test_placeholder_form.py similarity index 100% rename from tests/app/main/test_placeholder_form.py rename to tests/app/main/forms/test_placeholder_form.py diff --git a/tests/app/main/forms/test_register_user_form.py b/tests/app/main/forms/test_register_user_form.py new file mode 100644 index 000000000..2f9a65364 --- /dev/null +++ b/tests/app/main/forms/test_register_user_form.py @@ -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 that’s 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() diff --git a/tests/app/main/test_service_contact_details_form.py b/tests/app/main/forms/test_service_contact_details_form.py similarity index 100% rename from tests/app/main/test_service_contact_details_form.py rename to tests/app/main/forms/test_service_contact_details_form.py diff --git a/tests/app/main/forms/test_service_sms_senders_form.py b/tests/app/main/forms/test_service_sms_senders_form.py new file mode 100644 index 000000000..04389228e --- /dev/null +++ b/tests/app/main/forms/test_service_sms_senders_form.py @@ -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 diff --git a/tests/app/main/test_strip_whitespace_form.py b/tests/app/main/forms/test_strip_whitespace.py similarity index 100% rename from tests/app/main/test_strip_whitespace_form.py rename to tests/app/main/forms/test_strip_whitespace.py diff --git a/tests/app/main/test_two_factor_form.py b/tests/app/main/forms/test_two_factor_form.py similarity index 100% rename from tests/app/main/test_two_factor_form.py rename to tests/app/main/forms/test_two_factor_form.py diff --git a/tests/app/main/test_validators.py b/tests/app/main/test_validators.py index f2dea8615..fca4f7eec 100644 --- a/tests/app/main/test_validators.py +++ b/tests/app/main/test_validators.py @@ -3,7 +3,6 @@ from unittest.mock import Mock import pytest from wtforms import ValidationError -from app.main.forms import RegisterUserForm, ServiceSmsSenderForm from app.main.validators import ( MustContainAlphanumericCharacters, 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 that’s 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): 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...."]) 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_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