Merge pull request #2068 from alphagov/2fa-input

Improve 2fa code input
This commit is contained in:
Chris Hill-Scott
2018-05-08 16:53:54 +01:00
committed by GitHub
6 changed files with 97 additions and 94 deletions

View File

@@ -1,82 +1,74 @@
import pytest
from app import user_api_client
from app.main.forms import TwoFactorForm
from tests.conftest import (
mock_check_verify_code,
mock_check_verify_code_code_expired,
mock_check_verify_code_code_not_found,
)
def _check_code(code):
return user_api_client.check_verify_code('1', code, "sms")
@pytest.mark.parametrize('post_data', [
{'sms_code': '12345'},
{'sms_code': ' 12345 '},
])
def test_form_is_valid_returns_no_errors(
app_,
mock_check_verify_code,
post_data,
):
with app_.test_request_context(
method='POST',
data={'sms_code': '12345'}
):
def _check_code(code):
return user_api_client.check_verify_code('1', code, "sms")
with app_.test_request_context(method='POST', data=post_data):
form = TwoFactorForm(_check_code)
assert form.validate() is True
assert len(form.errors) == 0
assert form.errors == {}
@pytest.mark.parametrize('mock, post_data, expected_error', (
(
mock_check_verify_code,
{'sms_code': '1234'},
'Not enough numbers',
),
(
mock_check_verify_code,
{'sms_code': '123456'},
'Too many numbers',
),
(
mock_check_verify_code,
{},
'Cant be empty',
),
(
mock_check_verify_code,
{'sms_code': '12E45'},
'Numbers only',
),
(
mock_check_verify_code_code_expired,
{'sms_code': '99999'},
'Code has expired',
),
(
mock_check_verify_code_code_not_found,
{'sms_code': '99999'},
'Code not found',
),
))
def test_returns_errors_when_code_is_too_short(
app_,
mock_check_verify_code,
mocker,
mock,
post_data,
expected_error,
):
with app_.test_request_context(
method='POST',
data={'sms_code': '145'}
):
def _check_code(code):
return user_api_client.check_verify_code('1', code, "sms")
mock(mocker)
with app_.test_request_context(method='POST', data=post_data):
form = TwoFactorForm(_check_code)
assert form.validate() is False
assert len(form.errors) == 1
assert set(form.errors) == set({'sms_code': ['Code not found', 'Code does not match']})
def test_returns_errors_when_code_is_missing(
app_,
mock_check_verify_code,
):
with app_.test_request_context(
method='POST',
data={}
):
def _check_code(code):
return user_api_client.check_verify_code('1', code, "sms")
form = TwoFactorForm(_check_code)
assert form.validate() is False
assert len(form.errors) == 1
assert set(form.errors) == set({'sms_code': ['Code must not be empty']})
def test_returns_errors_when_code_contains_letters(
app_,
mock_check_verify_code,
):
with app_.test_request_context(
method='POST',
data={'sms_code': 'asdfg'}
):
def _check_code(code):
return user_api_client.check_verify_code('1', code, "sms")
form = TwoFactorForm(_check_code)
assert form.validate() is False
assert len(form.errors) == 1
assert set(form.errors) == set({'sms_code': ['Code not found', 'Code does not match']})
def test_should_return_errors_when_code_is_expired(
app_,
mock_check_verify_code_code_expired,
):
with app_.test_request_context(
method='POST',
data={'sms_code': '23456'}
):
def _check_code(code):
return user_api_client.check_verify_code('1', code, "sms")
form = TwoFactorForm(_check_code)
assert form.validate() is False
errors = form.errors
assert len(errors) == 1
assert errors == {'sms_code': ['Code has expired']}
assert form.errors == {'sms_code': [expected_error]}

View File

@@ -17,7 +17,15 @@ def test_should_render_two_factor_page(
'email': api_user_active.email_address}
response = client.get(url_for('main.two_factor'))
assert response.status_code == 200
assert '''Weve sent you a text message with a security code.''' in response.get_data(as_text=True)
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
assert page.select_one('main p').text.strip() == (
'Weve sent you a text message with a security code.'
)
assert page.select_one('label').text.strip(
'Text message code'
)
assert page.select_one('input')['type'] == 'tel'
assert page.select_one('input')['pattern'] == '[0-9]*'
def test_should_login_user_and_should_redirect_to_next_url(