mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-18 21:49:37 -04:00
Merge pull request #2068 from alphagov/2fa-input
Improve 2fa code input
This commit is contained in:
@@ -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,
|
||||
{},
|
||||
'Can’t 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]}
|
||||
|
||||
@@ -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 '''We’ve 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() == (
|
||||
'We’ve 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(
|
||||
|
||||
Reference in New Issue
Block a user