diff --git a/app/main/views/register.py b/app/main/views/register.py index 90b340b1c..5bd4d08c7 100644 --- a/app/main/views/register.py +++ b/app/main/views/register.py @@ -25,7 +25,6 @@ from app.main.forms import ( ) from app.main.views import sign_in from app.main.views.verify import activate_user -from app.models.service import Service from app.models.user import InvitedOrgUser, InvitedUser, User from app.utils import hide_from_search_engines, hilite @@ -156,41 +155,12 @@ def set_up_your_profile(): state = request.args.get("state") login_gov_error = request.args.get("error") if code and state: - _handle_login_dot_gov_invite(code, state) + _handle_login_dot_gov_invite(code, state, form) elif login_gov_error: current_app.logger.error(f"login.gov error: {login_gov_error}") raise Exception(f"Could not login with login.gov {login_gov_error}") # end login.gov - # create the user - # TODO we have to provide something for password until that column goes away - # TODO ideally we would set the user's preferred timezone here as well - - user = user_api_client.get_user_by_uuid_or_email(user_uuid, user_email) - if user is None: - user = User.register( - name=form.name.data, - email_address=user_email, - mobile_number=form.mobile_number.data, - password=str(uuid.uuid4()), - auth_type="sms_auth", - ) - - # activate the user - user = user_api_client.get_user_by_uuid_or_email(user_uuid, user_email) - activate_user(user["id"]) - usr = User.from_id(user["id"]) - usr.add_to_service( - invited_service.id, - invite_data["permissions"], - invite_data["folder_permissions"], - invite_data["from_user_id"], - ) - current_app.logger.debug( - hilite(f"Added user {usr.email_address} to service {invited_service.name}") - ) - return redirect(url_for("main.show_accounts_or_dashboard")) - return render_template("views/set-up-your-profile.html", form=form) @@ -208,26 +178,16 @@ def invited_user_accept_invite(invited_user_id): invited_user.accept_invite() -def _handle_login_dot_gov_invite(code, state): +def _handle_login_dot_gov_invite(code, state, form): access_token = sign_in._get_access_token(code, state) - print(f"access token {access_token}") user_email, user_uuid = sign_in._get_user_email_and_uuid(access_token) - print(f"user_email {user_email} user_uuid {user_uuid}") - print(f"state = {state}") invite_data = state.encode("utf8") - print(f"encoded invite data {invite_data}") invite_data = base64.b64decode(invite_data) - print(f"decoded invite data = {invite_data}") invite_data = json.loads(invite_data) - print(f"final invite data {invite_data}") - invited_service = Service.from_id(invite_data["service_id"]) - print(f"invited service {invited_service}") invited_user_id = invite_data["invited_user_id"] invited_user_email_address = get_invited_user_email_address(invited_user_id) - print(f"invited_user_email_address = {invited_user_email_address}") if user_email.lower() != invited_user_email_address.lower(): - print(f"HITTING THE FLASH") flash("You cannot accept an invite for another person.") session.pop("invited_user_id", None) abort(403) @@ -239,3 +199,29 @@ def _handle_login_dot_gov_invite(code, state): ) ) current_app.logger.debug(hilite("ACCEPTED INVITE")) + user = user_api_client.get_user_by_uuid_or_email(user_uuid, user_email) + if user is None: + user = User.register( + name=form.name.data, + email_address=user_email, + mobile_number=form.mobile_number.data, + password=str(uuid.uuid4()), + auth_type="sms_auth", + ) + + # activate the user + user = user_api_client.get_user_by_uuid_or_email(user_uuid, user_email) + activate_user(user["id"]) + usr = User.from_id(user["id"]) + usr.add_to_service( + invite_data["service_id"], + invite_data["permissions"], + invite_data["folder_permissions"], + invite_data["from_user_id"], + ) + current_app.logger.debug( + hilite( + f"Added user {usr.email_address} to service {invite_data['service_id']}" + ) + ) + return redirect(url_for("main.show_accounts_or_dashboard")) diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py index b82f7dde1..2a13ebb9d 100644 --- a/tests/app/main/views/test_register.py +++ b/tests/app/main/views/test_register.py @@ -5,8 +5,9 @@ from unittest.mock import ANY import pytest from flask import url_for +from app.main.forms import RegisterUserForm from app.main.views.register import _handle_login_dot_gov_invite -from app.models.user import InvitedUser, User +from app.models.user import User from tests.conftest import normalize_spaces @@ -549,11 +550,6 @@ def test_handle_login_dot_gov_invite_bad_email(client_request, mocker): return_value=["fake@fake.gov", "12345"], ) - mocker.patch( - "app.main.views.register.Service.from_id", - return_value={"service_from_id"}, - ) - mocker.patch( "app.main.views.register.get_invited_user_email_address", return_value="boo@fake.gov", @@ -570,8 +566,7 @@ def test_handle_login_dot_gov_invite_bad_email(client_request, mocker): invite_data = invite_data.encode("utf8") invite_data = base64.b64encode(invite_data) invite_data = invite_data.decode("utf8") - print(f"sending this as state {invite_data}") - _handle_login_dot_gov_invite("code", invite_data) + _handle_login_dot_gov_invite("code", invite_data, RegisterUserForm()) mock_flash.assert_called_once_with( "You cannot accept an invite for another person." ) @@ -590,23 +585,33 @@ def test_handle_login_dot_gov_invite_good_email(client_request, mocker): return_value=["fake@fake.gov", "12345"], ) - mocker.patch( - "app.main.views.register.Service.from_id", - return_value={"service_from_id"}, - ) - mocker.patch( "app.main.views.register.get_invited_user_email_address", return_value="fake@fake.gov", ) + mocker.patch( + "app.main.views.register.user_api_client.get_user_by_uuid_or_email", + return_value={"id": "abc"}, + ) + + mock_user = mocker.patch( + "app.main.views.register.User.add_to_service", + ) + mock_accept = mocker.patch("app.main.views.register.invited_user_accept_invite") - invite_data = {"service_id": "service", "invited_user_id": "invited_user"} + invite_data = { + "service_id": "service", + "invited_user_id": "invited_user", + "permissions": ["manage_everything"], + "folder_permissions": [], + "from_user_id": "xyz", + } invite_data = json.dumps(invite_data) invite_data = invite_data.encode("utf8") invite_data = base64.b64encode(invite_data) invite_data = invite_data.decode("utf8") - print(f"sending this as state {invite_data}") - _handle_login_dot_gov_invite("code", invite_data) + _handle_login_dot_gov_invite("code", invite_data, RegisterUserForm()) mock_accept.assert_called_once() + mock_user.assert_called_once_with("service", ["manage_everything"], [], "xyz")