diff --git a/app/main/views/register.py b/app/main/views/register.py index 9e92fa444..f94895695 100644 --- a/app/main/views/register.py +++ b/app/main/views/register.py @@ -43,10 +43,11 @@ def register(): @main.route('/register-from-invite', methods=['GET', 'POST']) def register_from_invite(): invited_user = session.get('invited_user') - form = RegisterUserFromInviteForm() if not invited_user: abort(404) + form = RegisterUserFromInviteForm() + if form.validate_on_submit(): if form.service.data != invited_user['service'] or form.email_address.data != invited_user['email_address']: abort(400) @@ -65,11 +66,11 @@ def register_from_invite(): return render_template('views/register-from-invite.html', email_address=invited_user['email_address'], form=form) -def _do_registration(form, service=None, send_sms=True, send_email=True): +def _do_registration(form, send_sms=True, send_email=True): if user_api_client.is_email_unique(form.email_address.data): user = user_api_client.register_user(form.name.data, form.email_address.data, - form.mobile_number.data, + form.mobile_number.data or None, form.password.data, form.auth_type.data) diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py index a366e5282..544e69d8c 100644 --- a/tests/app/main/views/test_register.py +++ b/tests/app/main/views/test_register.py @@ -8,6 +8,7 @@ from flask import ( url_for, session ) +from flask_login import current_user from app.notify_client.models import InvitedUser @@ -165,7 +166,7 @@ def test_register_with_existing_email_sends_emails( assert response.location == url_for('main.registration_continue', _external=True) -def test_register_from_invite_( +def test_register_from_invite( client, fake_uuid, mock_is_email_unique, @@ -224,3 +225,105 @@ def test_register_from_invite_when_user_registers_in_another_browser( ) assert response.status_code == 302 assert response.location == url_for('main.verify', _external=True) + + +def test_register_from_email_auth_invite( + client, + sample_invite, + mock_is_email_unique, + mock_register_user, + mock_get_user, + mock_send_verify_email, + mock_send_verify_code, + mock_accept_invite, +): + sample_invite['auth_type'] = 'email_auth' + with client.session_transaction() as session: + session['invited_user'] = sample_invite + assert not current_user.is_authenticated + + data = { + 'name': 'invited user', + 'email_address': sample_invite['email_address'], + 'mobile_number': '07700900001', + 'password': 'FSLKAJHFNvdzxgfyst', + 'service': sample_invite['service'], + 'auth_type': 'email_auth', + } + + resp = client.post(url_for('main.register_from_invite'), data=data) + assert resp.status_code == 302 + assert resp.location == url_for('main.add_service', first='first', _external=True) + + # doesn't send any 2fa code + assert not mock_send_verify_email.called + assert not mock_send_verify_code.called + # creates user with email_auth set + mock_register_user.assert_called_once_with( + data['name'], + data['email_address'], + data['mobile_number'], + data['password'], + data['auth_type'] + ) + mock_accept_invite.assert_called_once_with(sample_invite['service'], sample_invite['id']) + # just logs them in + assert current_user.is_authenticated + + with client.session_transaction() as session: + # invited user details are still there so they can get added to the service + assert session['invited_user'] == sample_invite + + +def test_can_register_email_auth_without_phone_number( + client, + sample_invite, + mock_is_email_unique, + mock_register_user, + mock_get_user, + mock_send_verify_email, + mock_send_verify_code, + mock_accept_invite, +): + sample_invite['auth_type'] = 'email_auth' + with client.session_transaction() as session: + session['invited_user'] = sample_invite + + data = { + 'name': 'invited user', + 'email_address': sample_invite['email_address'], + 'mobile_number': '', + 'password': 'FSLKAJHFNvdzxgfyst', + 'service': sample_invite['service'], + 'auth_type': 'email_auth' + } + + resp = client.post(url_for('main.register_from_invite'), data=data) + assert resp.status_code == 302 + assert resp.location == url_for('main.add_service', first='first', _external=True) + + mock_register_user.assert_called_once_with( + ANY, + ANY, + None, # mobile_number + ANY, + ANY + ) + + +def test_cannot_register_with_sms_auth_and_missing_mobile_number( + client, + mock_send_verify_code, + mock_get_user_by_email_not_found, + mock_login, +): + response = client.post(url_for('main.register'), + data={'name': 'Missing Mobile', + 'email_address': 'missing_mobile@example.gov.uk', + 'password': 'validPassword!'}) + + assert response.status_code == 200 + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + err = page.select_one('.error-message') + assert err.text.strip() == 'Can’t be empty' + assert err.attrs['data-error-label'] == 'mobile_number'