diff --git a/app/main/forms.py b/app/main/forms.py
index 3257ad84f..38290cb73 100644
--- a/app/main/forms.py
+++ b/app/main/forms.py
@@ -121,7 +121,7 @@ def email_address(label='Email address', gov_user=True, required=True):
if required:
validators.append(DataRequired(message='Can’t be empty'))
- return EmailField(label, validators)
+ return EmailField(label, validators, render_kw={'spellcheck': 'false'})
class UKMobileNumber(TelField):
diff --git a/app/templates/views/organisations/organisation/settings/edit-name/confirm.html b/app/templates/views/organisations/organisation/settings/edit-name/confirm.html
index 8fd5f263f..aad813c7b 100644
--- a/app/templates/views/organisations/organisation/settings/edit-name/confirm.html
+++ b/app/templates/views/organisations/organisation/settings/edit-name/confirm.html
@@ -19,7 +19,7 @@
{% call form_wrapper() %}
- {{ textbox(form.password) }}
+ {{ textbox(form.password, autocomplete='current-password') }}
Your organisation name will be changed from {{ current_org.name }} to {{ new_name }}
{{ page_footer('Confirm') }}
{% endcall %}
diff --git a/app/templates/views/register-from-invite.html b/app/templates/views/register-from-invite.html
index 9a19ba145..d91de327b 100644
--- a/app/templates/views/register-from-invite.html
+++ b/app/templates/views/register-from-invite.html
@@ -23,7 +23,7 @@ Create an account
{{ textbox(form.mobile_number, width='3-4', hint='We’ll send you a security code by text message') }}
{% endif %}
- {{ textbox(form.password, hint="At least 8 characters", width='3-4') }}
+ {{ textbox(form.password, hint="At least 8 characters", width='3-4', autocomplete='new-password') }}
{{ page_footer("Continue") }}
{{form.service}}
{{form.email_address}}
diff --git a/app/templates/views/register-from-org-invite.html b/app/templates/views/register-from-org-invite.html
index c5e32b704..be9d73374 100644
--- a/app/templates/views/register-from-org-invite.html
+++ b/app/templates/views/register-from-org-invite.html
@@ -18,7 +18,7 @@ Create an account
- {{ textbox(form.password, hint="At least 8 characters", width='3-4') }}
+ {{ textbox(form.password, hint="At least 8 characters", width='3-4', autocomplete='new-password') }}
{{ page_footer("Continue") }}
{{form.organisation}}
{{form.email_address}}
diff --git a/app/templates/views/register.html b/app/templates/views/register.html
index 04acc1b8b..a8a29bf87 100644
--- a/app/templates/views/register.html
+++ b/app/templates/views/register.html
@@ -14,12 +14,12 @@ Create an account
Create an account
{% call form_wrapper(autocomplete=True) %}
{{ textbox(form.name, width='3-4') }}
- {{ textbox(form.email_address, hint="Must be from a government organisation", width='3-4', safe_error_message=True) }}
+ {{ textbox(form.email_address, hint="Must be from a government organisation", width='3-4', safe_error_message=True, autocomplete='email') }}
- {{ textbox(form.password, hint="At least 8 characters", width='3-4') }}
+ {{ textbox(form.password, hint="At least 8 characters", width='3-4', autocomplete='new-password') }}
{{form.auth_type}}
{{ page_footer("Continue") }}
{% endcall %}
diff --git a/app/templates/views/service-settings/confirm.html b/app/templates/views/service-settings/confirm.html
index 6d222349b..12b90a7c5 100644
--- a/app/templates/views/service-settings/confirm.html
+++ b/app/templates/views/service-settings/confirm.html
@@ -19,7 +19,7 @@
{% call form_wrapper() %}
- {{ textbox(form.password) }}
+ {{ textbox(form.password, autocomplete='current-password') }}
{{ page_footer(
'Confirm',
destructive=destructive
diff --git a/app/templates/views/signin.html b/app/templates/views/signin.html
index 3d23afab6..9236cfe6e 100644
--- a/app/templates/views/signin.html
+++ b/app/templates/views/signin.html
@@ -32,8 +32,8 @@
{% endif %}
{% call form_wrapper(autocomplete=True) %}
- {{ textbox(form.email_address) }}
- {{ textbox(form.password) }}
+ {{ textbox(form.email_address, autocomplete='email') }}
+ {{ textbox(form.password, autocomplete='current-password') }}
{{ page_footer("Continue", secondary_link=url_for('.forgot_password'), secondary_link_text="Forgot your password?") }}
{% endcall %}
diff --git a/app/templates/views/user-profile/authenticate.html b/app/templates/views/user-profile/authenticate.html
index 57cfe8c9d..a4cdfb759 100644
--- a/app/templates/views/user-profile/authenticate.html
+++ b/app/templates/views/user-profile/authenticate.html
@@ -19,7 +19,7 @@
{% call form_wrapper(autocomplete=True) %}
- {{ textbox(form.password) }}
+ {{ textbox(form.password, autocomplete='current-password') }}
{{ page_footer('Confirm') }}
{% endcall %}
diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py
index 5f3468953..43e97a4ec 100644
--- a/tests/app/main/views/test_manage_users.py
+++ b/tests/app/main/views/test_manage_users.py
@@ -387,6 +387,16 @@ def test_invite_user_allows_to_choose_auth(
assert sms_auth_radio_button.has_attr("disabled") is False
+def test_invite_user_has_correct_email_field(
+ client_request,
+ mock_get_users_by_service,
+ mock_get_template_folders,
+):
+ email_field = client_request.get('main.invite_user', service_id=SERVICE_ONE_ID).select_one('#email_address')
+ assert email_field['spellcheck'] == 'false'
+ assert 'autocomplete' not in email_field
+
+
def test_should_not_show_page_for_non_team_member(
client_request,
mock_get_users_by_service,
diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py
index e9d0aa6dc..ae8d84bd0 100644
--- a/tests/app/main/views/test_register.py
+++ b/tests/app/main/views/test_register.py
@@ -15,6 +15,9 @@ def test_render_register_returns_template_with_form(client):
assert response.status_code == 200
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert page.find('input', attrs={'name': 'auth_type'}).attrs['value'] == 'sms_auth'
+ assert page.select_one('#email_address')['spellcheck'] == 'false'
+ assert page.select_one('#email_address')['autocomplete'] == 'email'
+ assert page.select_one('#password')['autocomplete'] == 'new-password'
assert 'Create an account' in response.get_data(as_text=True)
diff --git a/tests/app/main/views/test_sign_in.py b/tests/app/main/views/test_sign_in.py
index d4b9b2d71..a4d07eacb 100644
--- a/tests/app/main/views/test_sign_in.py
+++ b/tests/app/main/views/test_sign_in.py
@@ -5,20 +5,26 @@ from bs4 import BeautifulSoup
from flask import url_for
from app.models.user import User
+from tests.conftest import normalize_spaces
def test_render_sign_in_template_for_new_user(
- client
+ client_request
):
- response = client.get(url_for('main.sign_in', next=None))
- assert response.status_code == 200
- resp = response.get_data(as_text=True)
- assert 'Sign in' in resp
- assert 'Email address' in resp
- assert 'Password' in resp
- assert 'Forgot your password?' in resp
- assert 'If you do not have an account, you can' in resp
- assert 'Sign in again' not in resp
+ client_request.logout()
+ 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')['autocomplete'] == 'email'
+ assert normalize_spaces(page.select('label')[1].text) == 'Password'
+ assert page.select_one('#password')['value'] == ''
+ assert page.select_one('#password')['autocomplete'] == 'current-password'
+ assert page.select('main a')[0].text == 'create one now'
+ assert page.select('main a')[0]['href'] == url_for('main.register')
+ assert page.select('main a')[1].text == 'Forgot your password?'
+ assert page.select('main a')[1]['href'] == url_for('main.forgot_password')
+ assert 'Sign in again' not in normalize_spaces(page.text)
def test_sign_in_explains_session_timeout(client):