mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-19 14:09:20 -04:00
Merge pull request #3446 from alphagov/fix-invite-errors
Catch errors when user register from invite
This commit is contained in:
@@ -93,5 +93,5 @@ def _add_invited_user_to_service(invited_user):
|
|||||||
invitation = InvitedUser(invited_user)
|
invitation = InvitedUser(invited_user)
|
||||||
user = User.from_id(session['user_id'])
|
user = User.from_id(session['user_id'])
|
||||||
service_id = invited_user['service']
|
service_id = invited_user['service']
|
||||||
user_api_client.add_user_to_service(service_id, user.id, invitation.permissions, invitation.folder_permissions)
|
user.add_to_service(service_id, invitation.permissions, invitation.folder_permissions)
|
||||||
return service_id
|
return service_id
|
||||||
|
|||||||
@@ -407,12 +407,18 @@ class User(JSONModel, UserMixin):
|
|||||||
session['current_session_id'] = self.current_session_id
|
session['current_session_id'] = self.current_session_id
|
||||||
|
|
||||||
def add_to_service(self, service_id, permissions, folder_permissions):
|
def add_to_service(self, service_id, permissions, folder_permissions):
|
||||||
user_api_client.add_user_to_service(
|
try:
|
||||||
service_id,
|
user_api_client.add_user_to_service(
|
||||||
self.id,
|
service_id,
|
||||||
permissions,
|
self.id,
|
||||||
folder_permissions,
|
permissions,
|
||||||
)
|
folder_permissions,
|
||||||
|
)
|
||||||
|
except HTTPError as exception:
|
||||||
|
if exception.status_code == 400 and 'already part of service' in exception.message:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise exception
|
||||||
|
|
||||||
def add_to_organisation(self, organisation_id):
|
def add_to_organisation(self, organisation_id):
|
||||||
user_api_client.add_user_to_organisation(
|
user_api_client.add_user_to_organisation(
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from tests.conftest import (
|
|||||||
USER_ONE_ID,
|
USER_ONE_ID,
|
||||||
create_active_caseworking_user,
|
create_active_caseworking_user,
|
||||||
create_active_user_with_permissions,
|
create_active_user_with_permissions,
|
||||||
|
create_api_user_active,
|
||||||
normalize_spaces,
|
normalize_spaces,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -196,6 +197,37 @@ def test_existing_user_of_service_get_redirected_to_signin(
|
|||||||
assert mock_accept_invite.call_count == 1
|
assert mock_accept_invite.call_count == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_accept_invite_redirects_if_api_raises_an_error_that_they_are_already_part_of_the_service(
|
||||||
|
client,
|
||||||
|
mocker,
|
||||||
|
api_user_active,
|
||||||
|
sample_invite,
|
||||||
|
mock_accept_invite,
|
||||||
|
mock_get_service,
|
||||||
|
mock_get_users_by_service
|
||||||
|
):
|
||||||
|
sample_invite['email_address'] = api_user_active['email_address']
|
||||||
|
|
||||||
|
# This mock needs to return a user with a different ID to the invited user so that
|
||||||
|
# `existing_user in Users(invited_user.service)` returns False and the right code path is tested
|
||||||
|
mocker.patch('app.user_api_client.get_user_by_email', return_value=create_api_user_active(with_unique_id=True))
|
||||||
|
mocker.patch('app.invite_api_client.check_token', return_value=sample_invite)
|
||||||
|
|
||||||
|
mocker.patch('app.user_api_client.add_user_to_service', side_effect=HTTPError(
|
||||||
|
response=Mock(
|
||||||
|
status_code=400,
|
||||||
|
json={
|
||||||
|
"result": "error",
|
||||||
|
"message": {f"User id: {api_user_active['id']} already part of service id: {SERVICE_ONE_ID}"}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
message=f"User id: {api_user_active['id']} already part of service id: {SERVICE_ONE_ID}"
|
||||||
|
))
|
||||||
|
|
||||||
|
response = client.get(url_for('main.accept_invite', token='thisisnotarealtoken'), follow_redirects=False)
|
||||||
|
assert response.location == url_for('main.service_dashboard', service_id=SERVICE_ONE_ID, _external=True)
|
||||||
|
|
||||||
|
|
||||||
def test_existing_signed_out_user_accept_invite_redirects_to_sign_in(
|
def test_existing_signed_out_user_accept_invite_redirects_to_sign_in(
|
||||||
client,
|
client,
|
||||||
service_one,
|
service_one,
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
|
from unittest.mock import Mock
|
||||||
|
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
from flask import session as flask_session
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
from itsdangerous import SignatureExpired
|
from itsdangerous import SignatureExpired
|
||||||
|
from notifications_python_client.errors import HTTPError
|
||||||
|
|
||||||
|
from app.main.views.verify import activate_user
|
||||||
from tests.conftest import normalize_spaces
|
from tests.conftest import normalize_spaces
|
||||||
|
|
||||||
|
|
||||||
@@ -165,3 +169,32 @@ def test_verify_redirects_to_sign_in_if_not_logged_in(
|
|||||||
|
|
||||||
assert response.location == url_for('main.sign_in', _external=True)
|
assert response.location == url_for('main.sign_in', _external=True)
|
||||||
assert response.status_code == 302
|
assert response.status_code == 302
|
||||||
|
|
||||||
|
|
||||||
|
def test_activate_user_redirects_to_service_dashboard_if_user_already_belongs_to_service(
|
||||||
|
mocker,
|
||||||
|
client,
|
||||||
|
service_one,
|
||||||
|
sample_invite,
|
||||||
|
api_user_active,
|
||||||
|
mock_login,
|
||||||
|
):
|
||||||
|
mocker.patch('app.user_api_client.add_user_to_service', side_effect=HTTPError(
|
||||||
|
response=Mock(
|
||||||
|
status_code=400,
|
||||||
|
json={
|
||||||
|
"result": "error",
|
||||||
|
"message": {f"User id: {api_user_active['id']} already part of service id: {service_one['id']}"}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
message=f"User id: {api_user_active['id']} already part of service id: {service_one['id']}"
|
||||||
|
))
|
||||||
|
|
||||||
|
# Can't use `with client.session_transaction()...` here since activate_session is not a view function
|
||||||
|
flask_session['invited_user'] = sample_invite
|
||||||
|
|
||||||
|
response = activate_user(api_user_active['id'])
|
||||||
|
|
||||||
|
assert response.location == url_for('main.service_dashboard', service_id=service_one['id'])
|
||||||
|
|
||||||
|
flask_session.pop('invited_user')
|
||||||
|
|||||||
Reference in New Issue
Block a user