Convert EmailFields to GovukEmailFields

Changes those fields (and sometimes also regular text input fields)
 in the following forms:
- LoginForm
- RegisterUserForm
- ChangeEmailForm
- FeedbackOrProblem
- AcceptAgreementForm
- ChangeNameForm (only name field here, but used in the same template
field as ChangeEmailForm here: app/templates/views/user-profile/change.html)

Also includes changes to templates that use this form
and associated tests.
This commit is contained in:
Pea Tyczynska
2020-08-12 10:34:42 +01:00
committed by Tom Byers
parent 7e771a5fa1
commit 39bc7cf721
21 changed files with 95 additions and 76 deletions
+11 -9
View File
@@ -147,7 +147,7 @@ def email_address(label='Email address', gov_user=True, required=True):
if required:
validators.append(DataRequired(message='Cannot be empty'))
return EmailField(label, validators, render_kw={'spellcheck': 'false'})
return GovukEmailField(label, validators, render_kw={'spellcheck': 'false'})
class UKMobileNumber(TelField):
@@ -557,7 +557,7 @@ class OnOffField(RadioField):
class LoginForm(StripWhitespaceForm):
email_address = EmailField('Email address', validators=[
email_address = GovukEmailField('Email address', validators=[
Length(min=5, max=255),
DataRequired(message='Cannot be empty'),
ValidEmail()
@@ -568,8 +568,10 @@ class LoginForm(StripWhitespaceForm):
class RegisterUserForm(StripWhitespaceForm):
name = StringField('Full name',
validators=[DataRequired(message='Cannot be empty')])
name = GovukTextInputField(
'Full name',
validators=[DataRequired(message='Cannot be empty')]
)
email_address = email_address()
mobile_number = international_phone_number()
password = password()
@@ -1299,7 +1301,7 @@ class CsvUploadForm(StripWhitespaceForm):
class ChangeNameForm(StripWhitespaceForm):
new_name = StringField(u'Your name')
new_name = GovukTextInputField(u'Your name')
class ChangeEmailForm(StripWhitespaceForm):
@@ -1401,7 +1403,7 @@ class SupportRedirect(StripWhitespaceForm):
class FeedbackOrProblem(StripWhitespaceForm):
name = StringField('Name (optional)')
name = GovukTextInputField('Name (optional)')
email_address = email_address(label='Email address', gov_user=False, required=True)
feedback = TextAreaField('Your message', validators=[DataRequired(message="Cannot be empty")])
@@ -1850,7 +1852,7 @@ def get_placeholder_form_instance(
else:
field = uk_mobile_number(label=placeholder_name)
else:
field = StringField(placeholder_name, validators=[
field = GovukTextInputField(placeholder_name, validators=[
DataRequired(message='Cannot be empty')
])
@@ -2191,7 +2193,7 @@ class AcceptAgreementForm(StripWhitespaceForm):
on_behalf_of_email=org.agreement_signed_on_behalf_of_email_address,
)
version = StringField(
version = GovukTextInputField(
'Which version of the agreement do you want to accept?'
)
@@ -2209,7 +2211,7 @@ class AcceptAgreementForm(StripWhitespaceForm):
),
)
on_behalf_of_name = StringField(
on_behalf_of_name = GovukTextInputField(
'Whats their name?'
)
@@ -1,5 +1,4 @@
{% extends "withnav_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/radios.html" import radio, conditional_radio_panel %}
{% from "components/select-input.html" import select_wrapper %}
{% from "components/form.html" import form_wrapper %}
@@ -28,10 +27,14 @@
{% endfor %}
{% endcall %}
{% call conditional_radio_panel('on-behalf-of') %}
{{ textbox(form.on_behalf_of_name, width='1-1') }}
{{ textbox(form.on_behalf_of_email, width='1-1') }}
{{ form.on_behalf_of_name(param_extensions={"classes": "govuk-!-width-full"}) }}
{{ form.on_behalf_of_email(param_extensions={"classes": "govuk-!-width-full"}) }}
{% endcall %}
{{ textbox(form.version, width='1-3', hint='The version number is on the front page, for example 3.6') }}
{{ form.version(
param_extensions={
"hint": {"text": "The version number is on the front page, for example 3.6"},
"classes": "govuk-!-width-one-third"}
) }}
{{ page_footer('Continue') }}
+1 -2
View File
@@ -1,5 +1,4 @@
{% extends "withoutnav_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
@@ -16,7 +15,7 @@ Create a new password
<p class="govuk-body">Well send you an email to create a new password.</p>
{% call form_wrapper() %}
{{ textbox(form.email_address, safe_error_message=True) }}
{{ form.email_address(error_message_with_html=True) }}
{{ page_footer("Send email") }}
{% endcall %}
+6 -2
View File
@@ -1,5 +1,4 @@
{% extends "withnav_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-header.html" import page_header %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
@@ -17,7 +16,12 @@
{% call form_wrapper() %}
{{ textbox(form.email_address, width='1-1', safe_error_message=True) }}
{{ form.email_address(
param_extensions={
"classes": "govuk-!-width-full"
},
error_message_with_html=True
) }}
{% include 'views/manage-users/permissions.html' %}
@@ -1,5 +1,4 @@
{% extends "withnav_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-header.html" import page_header %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
@@ -17,7 +16,7 @@
<p class="govuk-body" id="user_name">This will change the email address for {{ user.name }}.</p>
{% call form_wrapper() %}
{{ textbox(form.email_address, width='1-1', safe_error_message=True) }}
{{ form.email_address(param_extensions={"classes": "govuk-!-width-full"}, error_message_with_html=True) }}
{{ page_footer('Save') }}
{% endcall %}
@@ -1,6 +1,5 @@
{% extends "org_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/page-header.html" import page_header %}
{% from "components/form.html" import form_wrapper %}
@@ -16,7 +15,12 @@
back_link=url_for('.manage_org_users', org_id=current_org.id)
) }}
{% call form_wrapper() %}
{{ textbox(form.email_address, width='1-1', safe_error_message=True) }}
{{ form.email_address(
param_extensions={
"classes": "govuk-!-width-full"
},
error_message_with_html=True
) }}
<div class="bottom-gutter">
<p class="form-label">
+9 -2
View File
@@ -13,8 +13,15 @@ Create an account
<div class="govuk-grid-column-two-thirds">
<h1 class="heading-large">Create an account</h1>
{% call form_wrapper(autocomplete=True) %}
{{ textbox(form.name, width='3-4') }}
{{ textbox(form.email_address, hint="Must be from a public sector organisation", width='3-4', safe_error_message=True, autocomplete='email') }}
{{ form.name(param_extensions={"classes": "govuk-!-width-three-quarters"}) }}
{{ form.email_address(
param_extensions={
"hint": {"text": "Must be from a public sector organisation"},
"classes": "govuk-!-width-three-quarters",
"autocomplete": "email"
},
error_message_with_html=True
) }}
<div class="extra-tracking">
{{ textbox(form.mobile_number, width='3-4', hint='Well send you a security code by text message') }}
</div>
@@ -1,5 +1,4 @@
{% from "components/banner.html" import banner, banner_wrapper %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
{% from "components/button/macro.njk" import govukButton %}
@@ -47,11 +46,12 @@
{% call form_wrapper(
action = form_url
) %}
{{ textbox(
form.email_address,
width='1-1',
safe_error_message=True,
hint='This should be a shared inbox managed by your team, not your own email address'
{{ form.email_address(
param_extensions={
"hint": {"text": "This should be a shared inbox managed by your team, not your own email address"},
"classes": "govuk-!-width-full"
},
error_message_with_html=True
) }}
{% if not first_email_address and not existing_is_default %}
{{ form.is_default }}
@@ -1,5 +1,4 @@
{% extends "withnav_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-header.html" import page_header %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
@@ -16,11 +15,12 @@
) }}
{% call form_wrapper() %}
{{ textbox(
form.email_address,
width='1-1',
hint='This should be a shared inbox managed by your team, not your own email address',
safe_error_message=True
{{ form.email_address(
param_extensions={
"hint": {"text": "This should be a shared inbox managed by your team, not your own email address"},
"classes": "govuk-!-width-full"
},
error_message_with_html=True
) }}
{% if not first_email_address %}
{{ form.is_default }}
@@ -16,11 +16,12 @@
back_link=url_for('main.service_email_reply_to', service_id=current_service.id)
) }}
{% call form_wrapper() %}
{{ textbox(
form.email_address,
width='1-1',
safe_error_message=True,
hint='This should be a shared inbox managed by your team, not your own email address.'
{{ form.email_address(
param_extensions={
"hint": {"text": "This should be a shared inbox managed by your team, not your own email address"},
"classes": "govuk-!-width-full"
},
error_message_with_html=True
) }}
{% if form.is_default.data %}
<p class="form-group">
+1 -2
View File
@@ -1,5 +1,4 @@
{% extends "withoutnav_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
@@ -32,7 +31,7 @@
{% endif %}
{% call form_wrapper(autocomplete=True) %}
{{ textbox(form.email_address, autocomplete='email') }}
{{ form.email_address(param_extensions={"autocomplete": "email"}) }}
{{ form.password(param_extensions={"autocomplete": "current-password"}) }}
{{ page_footer("Continue", secondary_link=url_for('.forgot_password'), secondary_link_text="Forgotten your password?") }}
{% endcall %}
+2 -2
View File
@@ -27,8 +27,8 @@
{% call form_wrapper() %}
{{ textbox(form.feedback, width='1-1', hint='', rows=10, autosize=True) }}
{% if not current_user.is_authenticated %}
{{ textbox(form.name, width='1-1') }}
{{ textbox(form.email_address, width='1-1') }}
{{ form.name(param_extensions={"classes": "govuk-!-width-full"}) }}
{{ form.email_address(param_extensions={"classes": "govuk-!-width-full"}) }}
{% else %}
<p class="govuk-body">Well reply to {{ current_user.email_address }}</p>
{% endif %}
+1 -2
View File
@@ -1,5 +1,4 @@
{% extends "withoutnav_template.html" %}
{% from "components/textbox.html" import textbox %}
{% from "components/page-header.html" import page_header %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
@@ -18,7 +17,7 @@
<div class="govuk-grid-row">
<div class="govuk-grid-column-three-quarters">
{% call form_wrapper() %}
{{ textbox(form_field, safe_error_message=True) }}
{{ form_field(error_message_with_html=True) }}
{{ page_footer('Save') }}
{% endcall %}
</div>
@@ -80,7 +80,7 @@ def test_invite_org_user_errors_when_same_email_as_inviter(
)
assert mock_invite_org_user.called is False
assert normalize_spaces(page.select_one('.error-message').text) == 'You cannot send an invitation to yourself'
assert 'You cannot send an invitation to yourself' in normalize_spaces(page.select_one('.govuk-error-message').text)
def test_accepted_invite_when_other_user_already_logged_in(
+14 -12
View File
@@ -205,10 +205,13 @@ def test_show_accept_agreement_page(
]
assert normalize_spaces(page.select_one('label[for=version]').text) == (
'Which version of the agreement do you want to accept? '
'Which version of the agreement do you want to accept?'
)
assert normalize_spaces(page.select_one('#version-hint').text) == (
'The version number is on the front page, for example 3.6'
)
assert page.select_one('input[name=version]')['value'] == ''
assert page.select_one('input[name=version]').get('value') is None
assert normalize_spaces(page.select_one('#who legend').text) == (
'Who are you accepting the agreement for?'
@@ -235,12 +238,12 @@ def test_show_accept_agreement_page(
assert normalize_spaces(page.select_one('label[for=on_behalf_of_name]').text) == (
'Whats their name?'
)
assert page.select_one('input[name=on_behalf_of_name]')['value'] == ''
assert page.select_one('input[name=on_behalf_of_name]').get('value') is None
assert normalize_spaces(page.select_one('label[for=on_behalf_of_email]').text) == (
'Whats their email address?'
)
assert page.select_one('input[name=on_behalf_of_email]')['value'] == ''
assert page.select_one('input[name=on_behalf_of_email]').get('value') is None
def test_accept_agreement_page_populates(
@@ -278,8 +281,7 @@ def test_accept_agreement_page_populates(
'on_behalf_of_email': '',
},
[
'Select an option',
'Must be a number',
'Error: Must be a number',
],
),
(
@@ -290,7 +292,7 @@ def test_accept_agreement_page_populates(
'on_behalf_of_email': '',
},
[
'Must be a number',
'Error: Must be a number',
],
),
(
@@ -301,8 +303,8 @@ def test_accept_agreement_page_populates(
'on_behalf_of_email': '',
},
[
'Cannot be empty',
'Cannot be empty',
'Error: Cannot be empty',
'Error: Cannot be empty',
],
),
(
@@ -313,7 +315,7 @@ def test_accept_agreement_page_populates(
'on_behalf_of_email': '',
},
[
'Cannot be empty',
'Error: Cannot be empty',
],
),
(
@@ -324,7 +326,7 @@ def test_accept_agreement_page_populates(
'on_behalf_of_email': 'test@example.com',
},
[
'Cannot be empty',
'Error: Cannot be empty',
],
),
@@ -343,7 +345,7 @@ def test_accept_agreement_page_validates(
_expected_status=200,
)
assert [
error.text.strip() for error in page.select('.error-message')
error.text.strip() for error in page.select('.govuk-error-message')
] == expected_errors
+3 -3
View File
@@ -233,7 +233,7 @@ def test_email_address_required_for_problems_and_questions(
_data=data,
_expected_status=200
)
assert isinstance(page.find('span', {'class': 'error-message'}), element.Tag)
assert isinstance(page.find('span', {'class': 'govuk-error-message'}), element.Tag)
@freeze_time('2016-12-12 12:00:00.000000')
@@ -255,8 +255,8 @@ def test_email_address_must_be_valid_if_provided_to_support_form(
assert response.status_code == 200
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert normalize_spaces(page.select_one('span.error-message').text) == (
'Enter a valid email address'
assert normalize_spaces(page.select_one('span.govuk-error-message').text) == (
'Error: Enter a valid email address'
)
+3 -3
View File
@@ -1116,8 +1116,8 @@ def test_user_cant_invite_themselves(
_expected_status=200,
)
assert page.h1.string.strip() == 'Invite a team member'
form_error = page.find('span', class_='error-message').string.strip()
assert form_error == "You cannot send an invitation to yourself"
form_error = page.find('span', class_='govuk-error-message').text.strip()
assert form_error == "Error: You cannot send an invitation to yourself"
assert not mock_create_invite.called
@@ -1404,7 +1404,7 @@ def test_edit_user_email_cannot_change_a_gov_email_address_to_a_non_gov_email_ad
},
_expected_status=200,
)
assert 'Enter a public sector email address' in page.select_one('.error-message').text
assert 'Enter a public sector email address' in page.select_one('.govuk-error-message').text
with client_request.session_transaction() as session:
assert 'team_member_email_change-'.format(active_user_with_permissions['id']) not in session
+8 -8
View File
@@ -113,10 +113,10 @@ def test_should_return_200_when_email_is_not_gov_uk(
_expected_status=200,
)
assert normalize_spaces(page.select_one('.error-message').text) == (
'Enter a public sector email address or find out who can use Notify'
assert 'Enter a public sector email address or find out who can use Notify' in normalize_spaces(
page.select_one('.govuk-error-message').text
)
assert page.select_one('.error-message a')['href'] == url_for(
assert page.select_one('.govuk-error-message a')['href'] == url_for(
'main.who_can_use_notify'
)
@@ -199,9 +199,9 @@ def test_register_with_existing_email_sends_emails(
("first.1.2.3.last@example.com", "First Last"),
("first.last.1.2.3@example.com", "First Last"),
# Instances where we cant make a good-enough guess:
("example123@example.com", ""),
("f.last@example.com", ""),
("f.m.last@example.com", ""),
("example123@example.com", None),
("f.last@example.com", None),
("f.m.last@example.com", None),
])
def test_shows_name_on_registration_page_from_invite(
client_request,
@@ -223,7 +223,7 @@ def test_shows_name_on_registration_page_from_invite(
}
page = client_request.get('main.register_from_invite')
assert page.select_one('input[name=name]')['value'] == expected_value
assert page.select_one('input[name=name]').get('value') == expected_value
def test_shows_hidden_email_address_on_registration_page_from_invite(
@@ -247,7 +247,7 @@ def test_shows_hidden_email_address_on_registration_page_from_invite(
assert normalize_spaces(page.select_one('main p').text) == (
'Your account will be created with this email address: test@example.com'
)
hidden_input = page.select_one('form .visually-hidden input')
hidden_input = page.select_one('form .govuk-visually-hidden input')
for attr, value in (
('type', 'email'),
('name', 'username'),
+1 -1
View File
@@ -2266,7 +2266,7 @@ def test_send_one_off_letter_copes_with_placeholder_from_address_block(
assert normalize_spaces(page.select_one('form label').text) == 'thing'
assert page.select_one('form input[type=text]')['name'] == 'placeholder_value'
assert page.select_one('form input[type=text]')['value'] == ''
assert page.select_one('form input[type=text]').get('value') is None
with client_request.session_transaction() as session:
assert session['placeholders'] == {
@@ -2240,7 +2240,7 @@ def test_incorrect_reply_to_email_address_input(
_expected_status=200
)
assert normalize_spaces(page.select_one('.error-message').text) == expected_error
assert expected_error in normalize_spaces(page.select_one('.govuk-error-message').text)
@pytest.mark.parametrize('contact_block_input, expected_error', [
+1 -1
View File
@@ -15,7 +15,7 @@ def test_render_sign_in_template_for_new_user(
page = client_request.get('main.sign_in')
assert normalize_spaces(page.select_one('h1').text) == 'Sign in'
assert normalize_spaces(page.select('label')[0].text) == 'Email address'
assert page.select_one('#email_address')['value'] == ''
assert page.select_one('#email_address').get('value') is None
assert page.select_one('#email_address')['autocomplete'] == 'email'
assert normalize_spaces(page.select('label')[1].text) == 'Password'
assert page.select_one('#password').get('value') is None