Merge pull request #269 from alphagov/invite-registration-sms-only

Change new invite registration flow to only need
This commit is contained in:
Adam Shimali
2016-03-14 10:55:31 +00:00
5 changed files with 66 additions and 24 deletions

View File

@@ -150,6 +150,23 @@ class TwoFactorForm(Form):
raise ValidationError(reason) raise ValidationError(reason)
class VerifySmsForm(Form):
def __init__(self, validate_code_func, *args, **kwargs):
'''
Keyword arguments:
validate_code_func -- Validates the code with the API.
'''
self.validate_code_func = validate_code_func
super(VerifySmsForm, self).__init__(*args, **kwargs)
sms_code = sms_code()
def validate_sms_code(self, field):
is_valid, reason = self.validate_code_func(field.data, 'sms')
if not is_valid:
raise ValidationError(reason)
class VerifyForm(Form): class VerifyForm(Form):
def __init__(self, validate_code_func, *args, **kwargs): def __init__(self, validate_code_func, *args, **kwargs):
''' '''

View File

@@ -9,7 +9,10 @@ from flask_login import login_user
from app.main import main from app.main import main
from app.main.dao import users_dao from app.main.dao import users_dao
from app.main.forms import VerifyForm from app.main.forms import (
VerifyForm,
VerifySmsForm
)
@main.route('/verify', methods=['GET', 'POST']) @main.route('/verify', methods=['GET', 'POST'])
@@ -22,7 +25,11 @@ def verify():
def _check_code(code, code_type): def _check_code(code, code_type):
return users_dao.check_verify_code(user_id, code, code_type) return users_dao.check_verify_code(user_id, code, code_type)
form = VerifyForm(_check_code) if session.get('invited_user'):
form = VerifySmsForm(_check_code)
else:
form = VerifyForm(_check_code)
if form.validate_on_submit(): if form.validate_on_submit():
try: try:
user = users_dao.get_user_by_id(user_id) user = users_dao.get_user_by_id(user_id)

View File

@@ -3,30 +3,48 @@
{% from "components/page-footer.html" import page_footer %} {% from "components/page-footer.html" import page_footer %}
{% block page_title %} {% block page_title %}
Enter the codes weve sent you GOV.UK Notify {% if form.email_code %}
Enter the codes weve sent you GOV.UK Notify
{% else %}
Enter the code weve sent you GOV.UK Notify
{% endif %}
{% endblock %} {% endblock %}
{% block maincolumn_content %} {% block maincolumn_content %}
<div class="grid-row"> <div class="grid-row">
<div class="column-two-thirds"> <div class="column-two-thirds">
<h1 class="heading-large">Enter the codes weve sent you</h1> {% if form.email_code %}
<p> <h1 class="heading-large">Enter the codes weve sent you</h1>
Weve sent you confirmation codes by email and text message. {% else %}
</p> <h1 class="heading-large">Enter the code weve sent you</h1>
{% endif %}
{% if form.email_code %}
<p>
Weve sent you confirmation codes by email and text message.
</p>
{% else %}
<p>
Weve sent you a confirmation code by text message.
</p>
{% endif %}
<form autocomplete="off" method="post"> <form autocomplete="off" method="post">
{% if form.sms_code %}
{{ textbox( {{ textbox(
form.sms_code, form.sms_code,
width='5em', width='5em',
help_link=url_for('.check_and_resend_text_code'), help_link=url_for('.check_and_resend_text_code'),
help_link_text='I havent received a text message' help_link_text='I havent received a text message'
) }} ) }}
{{ textbox( {% endif %}
form.email_code, {% if form.email_code %}
width='5em', {{ textbox(
help_link=url_for('.check_and_resend_email_code'), form.email_code,
help_link_text='I havent received an email' width='5em',
) }} help_link=url_for('.check_and_resend_email_code'),
help_link_text='I havent received an email'
) }}
{% endif %}
{{ page_footer("Continue") }} {{ page_footer("Continue") }}
</form> </form>
</div> </div>

View File

@@ -169,8 +169,7 @@ def test_cancelled_invited_user_accepts_invited_redirect_to_cancelled_invitation
service_one, service_one,
mocker, mocker,
mock_get_user, mock_get_user,
mock_get_service mock_get_service):
):
with app_.test_request_context(): with app_.test_request_context():
with app_.test_client() as client: with app_.test_client() as client:
cancelled_invitation = create_sample_invite(mocker, service_one, status='cancelled') cancelled_invitation = create_sample_invite(mocker, service_one, status='cancelled')
@@ -232,6 +231,7 @@ def test_new_user_accept_invite_completes_new_registration_redirects_to_verify(a
def test_new_invited_user_verifies_and_added_to_service(app_, def test_new_invited_user_verifies_and_added_to_service(app_,
service_one, service_one,
sample_invite, sample_invite,
api_user_active,
mock_check_invite_token, mock_check_invite_token,
mock_dont_get_user_by_email, mock_dont_get_user_by_email,
mock_register_user, mock_register_user,
@@ -261,8 +261,7 @@ def test_new_invited_user_verifies_and_added_to_service(app_,
response = client.post(url_for('main.register_from_invite'), data=data) response = client.post(url_for('main.register_from_invite'), data=data)
# that sends user on to verify # that sends user on to verify
response = client.post(url_for('main.verify'), data={'sms_code': '12345', 'email_code': '23456'}, response = client.post(url_for('main.verify'), data={'sms_code': '12345'}, follow_redirects=True)
follow_redirects=True)
# when they post codes back to admin user should be added to # when they post codes back to admin user should be added to
# service and sent on to dash board # service and sent on to dash board
@@ -270,8 +269,8 @@ def test_new_invited_user_verifies_and_added_to_service(app_,
with client.session_transaction() as session: with client.session_transaction() as session:
new_user_id = session['user_id'] new_user_id = session['user_id']
mock_add_user_to_service.assert_called_with(data['service'], new_user_id, expected_permissions) mock_add_user_to_service.assert_called_with(data['service'], new_user_id, expected_permissions)
mock_accept_invite.assert_called_with(data['service'], sample_invite['id'])
mock_accept_invite.assert_called_with(data['service'], sample_invite['id']) mock_check_verify_code.assert_called_once_with(new_user_id, '12345', 'sms')
page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser')
element = page.find('h2', class_='navigation-service-name').find('a') element = page.find('h2', class_='navigation-service-name').find('a')

View File

@@ -332,6 +332,7 @@ def mock_register_user(mocker, api_user_pending):
@pytest.fixture(scope='function') @pytest.fixture(scope='function')
def mock_get_user(mocker, api_user_active): def mock_get_user(mocker, api_user_active):
def _get_user(id): def _get_user(id):
api_user_active.id = id
return api_user_active return api_user_active
return mocker.patch( return mocker.patch(
'app.user_api_client.get_user', side_effect=_get_user) 'app.user_api_client.get_user', side_effect=_get_user)