diff --git a/atst/routes/errors.py b/atst/routes/errors.py index b3e7effd..b579996d 100644 --- a/atst/routes/errors.py +++ b/atst/routes/errors.py @@ -3,6 +3,7 @@ from flask_wtf.csrf import CSRFError import werkzeug.exceptions as werkzeug_exceptions import atst.domain.exceptions as exceptions +from atst.domain.invitations import InvitationExpired def make_error_pages(app): @@ -41,4 +42,15 @@ def make_error_pages(app): 500, ) + @app.errorhandler(InvitationExpired) + # pylint: disable=unused-variable + def expired_invitation(e): + log_error(e) + return ( + render_template( + "error.html", message="The invitation you followed has expired." + ), + 404, + ) + return app diff --git a/atst/routes/workspaces.py b/atst/routes/workspaces.py index f12a81ce..674f9dd3 100644 --- a/atst/routes/workspaces.py +++ b/atst/routes/workspaces.py @@ -340,4 +340,8 @@ def update_member(workspace_id, member_id): @bp.route("/workspaces/invitation/", methods=["GET"]) def accept_invitation(invite_id): - pass + invite = Invitations.accept(invite_id) + + return redirect( + url_for("workspaces.show_workspace", workspace_id=invite.workspace.id) + ) diff --git a/tests/routes/test_workspaces.py b/tests/routes/test_workspaces.py index 75fe0662..32a85f8e 100644 --- a/tests/routes/test_workspaces.py +++ b/tests/routes/test_workspaces.py @@ -1,11 +1,12 @@ from flask import url_for -from tests.factories import UserFactory, WorkspaceFactory +from tests.factories import UserFactory, WorkspaceFactory, InvitationFactory from atst.domain.workspaces import Workspaces from atst.domain.workspace_users import WorkspaceUsers from atst.domain.projects import Projects from atst.domain.environments import Environments from atst.domain.environment_roles import EnvironmentRoles +from atst.domain.invitations import Invitations from atst.models.workspace_user import WorkspaceUser from atst.queue import queue @@ -313,3 +314,38 @@ def test_update_member_environment_role_with_no_data(client, user_session): ) assert response.status_code == 200 assert EnvironmentRoles.get(user.id, env1_id).role == "developer" + + +def test_new_member_accept_valid_invite(client, user_session): + owner = UserFactory.create() + workspace = WorkspaceFactory.create() + Workspaces._create_workspace_role(owner, workspace, "admin") + + user = UserFactory.create() + member = WorkspaceUsers.add(user, workspace.id, "developer") + invite = InvitationFactory.create(user_id=member.user.id, workspace_id=workspace.id) + user_session(user) + response = client.get(url_for("workspaces.accept_invitation", invite_id=invite.id)) + + assert response.status_code == 302 + assert ( + url_for("workspaces.show_workspace", workspace_id=invite.workspace.id) + in response.headers["Location"] + ) + assert invite.valid == False + + +def test_new_member_accept_invalid_invite(client, user_session): + owner = UserFactory.create() + workspace = WorkspaceFactory.create() + Workspaces._create_workspace_role(owner, workspace, "admin") + + user = UserFactory.create() + member = WorkspaceUsers.add(user, workspace.id, "developer") + invite = InvitationFactory.create( + user_id=member.user.id, workspace_id=workspace.id, valid=False + ) + user_session(user) + response = client.get(url_for("workspaces.accept_invitation", invite_id=invite.id)) + + assert response.status_code == 404