Update function to determine when invite can be resent and added lots of
tests
This commit is contained in:
parent
93af6116c2
commit
9597966bcd
@ -77,7 +77,10 @@ class Invitation(Base, TimestampsMixin, AuditableMixin):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def is_expired(self):
|
def is_expired(self):
|
||||||
return datetime.datetime.now(self.expiration_time.tzinfo) > self.expiration_time
|
return (
|
||||||
|
datetime.datetime.now(self.expiration_time.tzinfo) > self.expiration_time
|
||||||
|
and not self.status == Status.ACCEPTED
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def workspace(self):
|
def workspace(self):
|
||||||
|
@ -117,6 +117,10 @@ class WorkspaceRole(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
|
|||||||
def role_displayname(self):
|
def role_displayname(self):
|
||||||
return self.role.display_name
|
return self.role.display_name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_active(self):
|
||||||
|
return self.status == Status.ACTIVE
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def num_environment_roles(self):
|
def num_environment_roles(self):
|
||||||
return (
|
return (
|
||||||
@ -147,8 +151,13 @@ class WorkspaceRole(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def can_resend_invitation(self):
|
def can_resend_invitation(self):
|
||||||
return self.latest_invitation and (
|
return not self.is_active and (
|
||||||
self.latest_invitation.is_rejected or self.latest_invitation.is_expired
|
self.latest_invitation
|
||||||
|
and (
|
||||||
|
self.latest_invitation.is_rejected
|
||||||
|
or self.latest_invitation.is_expired
|
||||||
|
or self.latest_invitation.is_revoked
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -304,9 +304,11 @@ def test_can_create_workspaces_with_matching_names():
|
|||||||
Workspaces.create(RequestFactory.create(), name=workspace_name)
|
Workspaces.create(RequestFactory.create(), name=workspace_name)
|
||||||
|
|
||||||
|
|
||||||
def test_can_revoke_workspace_access():
|
def test_can_revoke_workspace_access_for_active_member():
|
||||||
workspace = WorkspaceFactory.create()
|
workspace = WorkspaceFactory.create()
|
||||||
workspace_role = WorkspaceRoleFactory.create(workspace=workspace)
|
workspace_role = WorkspaceRoleFactory.create(
|
||||||
|
workspace=workspace, status=WorkspaceRoleStatus.ACTIVE
|
||||||
|
)
|
||||||
Workspaces.revoke_access(workspace.owner, workspace.id, workspace_role.id)
|
Workspaces.revoke_access(workspace.owner, workspace.id, workspace_role.id)
|
||||||
assert Workspaces.for_user(workspace_role.user) == []
|
assert Workspaces.for_user(workspace_role.user) == []
|
||||||
|
|
||||||
@ -314,7 +316,9 @@ def test_can_revoke_workspace_access():
|
|||||||
def test_can_revoke_access():
|
def test_can_revoke_access():
|
||||||
workspace = WorkspaceFactory.create()
|
workspace = WorkspaceFactory.create()
|
||||||
owner_role = workspace.roles[0]
|
owner_role = workspace.roles[0]
|
||||||
workspace_role = WorkspaceRoleFactory.create(workspace=workspace)
|
workspace_role = WorkspaceRoleFactory.create(
|
||||||
|
workspace=workspace, status=WorkspaceRoleStatus.ACTIVE
|
||||||
|
)
|
||||||
|
|
||||||
assert Workspaces.can_revoke_access_for(workspace, workspace_role)
|
assert Workspaces.can_revoke_access_for(workspace, workspace_role)
|
||||||
assert not Workspaces.can_revoke_access_for(workspace, owner_role)
|
assert not Workspaces.can_revoke_access_for(workspace, owner_role)
|
||||||
|
@ -1,12 +1,19 @@
|
|||||||
from flask import url_for
|
from flask import url_for
|
||||||
|
|
||||||
from tests.factories import UserFactory, WorkspaceFactory, WorkspaceRoleFactory
|
from tests.factories import (
|
||||||
|
UserFactory,
|
||||||
|
WorkspaceFactory,
|
||||||
|
WorkspaceRoleFactory,
|
||||||
|
InvitationFactory,
|
||||||
|
)
|
||||||
from atst.domain.workspaces import Workspaces
|
from atst.domain.workspaces import Workspaces
|
||||||
from atst.domain.workspace_roles import WorkspaceRoles
|
from atst.domain.workspace_roles import WorkspaceRoles
|
||||||
from atst.domain.projects import Projects
|
from atst.domain.projects import Projects
|
||||||
from atst.domain.environments import Environments
|
from atst.domain.environments import Environments
|
||||||
from atst.domain.environment_roles import EnvironmentRoles
|
from atst.domain.environment_roles import EnvironmentRoles
|
||||||
from atst.queue import queue
|
from atst.queue import queue
|
||||||
|
from atst.models.workspace_role import Status as WorkspaceRoleStatus
|
||||||
|
from atst.models.invitation import Status as InvitationStatus
|
||||||
|
|
||||||
|
|
||||||
def test_user_with_permission_has_add_member_link(client, user_session):
|
def test_user_with_permission_has_add_member_link(client, user_session):
|
||||||
@ -174,10 +181,12 @@ def test_update_member_environment_role_with_no_data(client, user_session):
|
|||||||
assert EnvironmentRoles.get(user.id, env1_id).role == "developer"
|
assert EnvironmentRoles.get(user.id, env1_id).role == "developer"
|
||||||
|
|
||||||
|
|
||||||
def test_revoke_member_access(client, user_session):
|
def test_revoke_active_member_access(client, user_session):
|
||||||
workspace = WorkspaceFactory.create()
|
workspace = WorkspaceFactory.create()
|
||||||
user = UserFactory.create()
|
user = UserFactory.create()
|
||||||
member = WorkspaceRoles.add(user, workspace.id, "developer")
|
member = WorkspaceRoleFactory.create(
|
||||||
|
workspace=workspace, user=user, status=WorkspaceRoleStatus.ACTIVE
|
||||||
|
)
|
||||||
Projects.create(
|
Projects.create(
|
||||||
workspace.owner,
|
workspace.owner,
|
||||||
workspace,
|
workspace,
|
||||||
@ -195,22 +204,7 @@ def test_revoke_member_access(client, user_session):
|
|||||||
assert WorkspaceRoles.get_by_id(member.id).num_environment_roles == 0
|
assert WorkspaceRoles.get_by_id(member.id).num_environment_roles == 0
|
||||||
|
|
||||||
|
|
||||||
def test_shows_revoke_button(client, user_session):
|
def test_does_not_show_any_buttons_if_owner(client, user_session):
|
||||||
workspace = WorkspaceFactory.create()
|
|
||||||
user = UserFactory.create()
|
|
||||||
member = WorkspaceRoleFactory.create(user=user, workspace=workspace)
|
|
||||||
user_session(workspace.owner)
|
|
||||||
response = client.get(
|
|
||||||
url_for(
|
|
||||||
"workspaces.view_member",
|
|
||||||
workspace_id=workspace.id,
|
|
||||||
member_id=member.user.id,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
assert "Remove Workspace Access" in response.data.decode()
|
|
||||||
|
|
||||||
|
|
||||||
def test_does_not_show_revoke_button(client, user_session):
|
|
||||||
workspace = WorkspaceFactory.create()
|
workspace = WorkspaceFactory.create()
|
||||||
user_session(workspace.owner)
|
user_session(workspace.owner)
|
||||||
response = client.get(
|
response = client.get(
|
||||||
@ -221,3 +215,95 @@ def test_does_not_show_revoke_button(client, user_session):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
assert "Remove Workspace Access" not in response.data.decode()
|
assert "Remove Workspace Access" not in response.data.decode()
|
||||||
|
assert "Resend Invitation" not in response.data.decode()
|
||||||
|
assert "Revoke Invitation" not in response.data.decode()
|
||||||
|
|
||||||
|
|
||||||
|
def test_only_shows_revoke_access_button_if_active(client, user_session):
|
||||||
|
workspace = WorkspaceFactory.create()
|
||||||
|
user = UserFactory.create()
|
||||||
|
member = WorkspaceRoleFactory.create(
|
||||||
|
user=user, workspace=workspace, status=WorkspaceRoleStatus.ACTIVE
|
||||||
|
)
|
||||||
|
InvitationFactory.create(
|
||||||
|
user=workspace.owner,
|
||||||
|
workspace_role=member,
|
||||||
|
email=member.user.email,
|
||||||
|
status=InvitationStatus.ACCEPTED,
|
||||||
|
)
|
||||||
|
user_session(workspace.owner)
|
||||||
|
response = client.get(
|
||||||
|
url_for(
|
||||||
|
"workspaces.view_member",
|
||||||
|
workspace_id=workspace.id,
|
||||||
|
member_id=member.user.id,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert "Remove Workspace Access" in response.data.decode()
|
||||||
|
assert "Revoke Invitation" not in response.data.decode()
|
||||||
|
assert "Resend Invitation" not in response.data.decode()
|
||||||
|
|
||||||
|
|
||||||
|
def test_only_shows_revoke_invite_button_if_pending(client, user_session):
|
||||||
|
workspace = WorkspaceFactory.create()
|
||||||
|
member = WorkspaceRoleFactory.create(
|
||||||
|
workspace=workspace, status=WorkspaceRoleStatus.PENDING
|
||||||
|
)
|
||||||
|
InvitationFactory.create(
|
||||||
|
user=workspace.owner, workspace_role=member, email=member.user.email
|
||||||
|
)
|
||||||
|
user_session(workspace.owner)
|
||||||
|
response = client.get(
|
||||||
|
url_for(
|
||||||
|
"workspaces.view_member",
|
||||||
|
workspace_id=workspace.id,
|
||||||
|
member_id=member.user.id,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert "Revoke Invitation" in response.data.decode()
|
||||||
|
assert "Remove Workspace Access" not in response.data.decode()
|
||||||
|
assert "Resend Invitation" not in response.data.decode()
|
||||||
|
|
||||||
|
|
||||||
|
def test_only_shows_resend_button_if_expired(client, user_session):
|
||||||
|
workspace = WorkspaceFactory.create()
|
||||||
|
member = WorkspaceRoleFactory.create(workspace=workspace)
|
||||||
|
InvitationFactory.create(
|
||||||
|
user=workspace.owner,
|
||||||
|
workspace_role=member,
|
||||||
|
email=member.user.email,
|
||||||
|
status=InvitationStatus.REJECTED_EXPIRED,
|
||||||
|
)
|
||||||
|
user_session(workspace.owner)
|
||||||
|
response = client.get(
|
||||||
|
url_for(
|
||||||
|
"workspaces.view_member",
|
||||||
|
workspace_id=workspace.id,
|
||||||
|
member_id=member.user.id,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert "Resend Invitation" in response.data.decode()
|
||||||
|
assert "Revoke Invitation" not in response.data.decode()
|
||||||
|
assert "Remove Workspace Access" not in response.data.decode()
|
||||||
|
|
||||||
|
|
||||||
|
def test_only_shows_resend_button_if_revoked(client, user_session):
|
||||||
|
workspace = WorkspaceFactory.create()
|
||||||
|
member = WorkspaceRoleFactory.create(workspace=workspace)
|
||||||
|
InvitationFactory.create(
|
||||||
|
user=workspace.owner,
|
||||||
|
workspace_role=member,
|
||||||
|
email=member.user.email,
|
||||||
|
status=InvitationStatus.REVOKED,
|
||||||
|
)
|
||||||
|
user_session(workspace.owner)
|
||||||
|
response = client.get(
|
||||||
|
url_for(
|
||||||
|
"workspaces.view_member",
|
||||||
|
workspace_id=workspace.id,
|
||||||
|
member_id=member.user.id,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert "Resend Invitation" in response.data.decode()
|
||||||
|
assert "Remove Workspace Access" not in response.data.decode()
|
||||||
|
assert "Revoke Invitation" not in response.data.decode()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user