Skip to content

Commit a8ece9b

Browse files
author
Matthew Fortunka
committed
fixed unit tests
1 parent d18a392 commit a8ece9b

File tree

3 files changed

+124
-322
lines changed

3 files changed

+124
-322
lines changed

api_app/services/aad_authentication.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -352,17 +352,6 @@ def get_workspace_roles(self, workspace: Workspace) -> List[Role]:
352352

353353
return roles
354354

355-
def get_workspace_user_emails_by_role_assignment(self, workspace: Workspace):
356-
users = self.get_workspace_users(workspace)
357-
workspace_role_assignments_details = {}
358-
for user in users:
359-
if user.email:
360-
for role in user.roles:
361-
if role not in workspace_role_assignments_details:
362-
workspace_role_assignments_details[role] = []
363-
workspace_role_assignments_details[role].append(user.email)
364-
return workspace_role_assignments_details
365-
366355
def assign_workspace_user(self, user_id: str, workspace: Workspace, role_id: str) -> None:
367356
# User already has the role, do nothing
368357
if self._is_user_in_role(user_id, role_id):

api_app/tests_ma/test_api/test_routes/test_workspace_users.py

Lines changed: 99 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from fastapi import status
55

6-
from models.domain.authentication import Role, User
6+
from models.domain.workspace_users import AssignmentType, Role
77
from tests_ma.test_api.test_routes.test_resource_helpers import FAKE_CREATE_TIMESTAMP
88
from tests_ma.test_api.conftest import create_admin_user
99
from services.authentication import get_current_admin_user, \
@@ -63,17 +63,30 @@ async def test_get_workspace_users_returns_users(self, _, auth_class, app, clien
6363
users = [
6464
{
6565
"id": "123",
66-
"name": "John Doe",
67-
"email": "[email protected]",
68-
"roles": ["WorkspaceOwner", "WorkspaceResearcher"],
69-
'roleAssignments': []
66+
"displayName": "John Doe",
67+
"userPrincipalName": "[email protected]",
68+
"roles": [
69+
{
70+
"id": "1",
71+
"displayName": "WorkspaceOwner",
72+
"type": "ApplicationRole"
73+
},
74+
{
75+
"id": "2",
76+
"displayName": "WorkspaceResearcher",
77+
"type": "ApplicationRole"
78+
}]
7079
},
7180
{
7281
"id": "456",
73-
"name": "Jane Smith",
74-
"email": "[email protected]",
75-
"roles": ["WorkspaceResearcher"],
76-
'roleAssignments': []
82+
"displayName": "Jane Smith",
83+
"userPrincipalName": "[email protected]",
84+
"roles": [
85+
{
86+
"id": "2",
87+
"displayName": "WorkspaceResearcher",
88+
"type": "ApplicationRole"
89+
}]
7790
}
7891
]
7992
get_workspace_users_mock.return_value = users
@@ -85,101 +98,115 @@ async def test_get_workspace_users_returns_users(self, _, auth_class, app, clien
8598

8699
@pytest.mark.parametrize("auth_class", ["aad_authentication.AzureADAuthorization"])
87100
@patch("api.dependencies.workspaces.WorkspaceRepository.get_workspace_by_id", return_value=sample_workspace())
88-
async def test_assign_workspace_user_assigns_workspace_user(self, get_workspace_by_id_mock, auth_class, app, client):
89-
with patch(f"services.{auth_class}.get_user_by_email") as get_user_by_email_mock, \
90-
patch(f"services.{auth_class}.get_workspace_role_by_name") as get_workspace_role_by_name_mock, \
91-
patch(f"services.{auth_class}.assign_workspace_user") as assign_workspace_user_mock, \
92-
patch(f"services.{auth_class}.get_workspace_users") as get_workspace_users_mock:
101+
async def test_assign_workspace_user_assigns_single_workspace_user(self, get_workspace_by_id_mock, auth_class, app, client):
102+
with patch(f"services.{auth_class}.assign_workspace_user") as assign_workspace_user_mock, \
103+
patch(f"services.{auth_class}.get_workspace_users") as get_workspace_users_mock:
93104

94-
workspace = get_workspace_by_id_mock.return_value
105+
role_id = "test_role_id"
95106

96-
user = {
97-
"id": "123",
98-
"name": "John Doe",
99-
"email": "[email protected]",
100-
"roles": ["WorkspaceOwner", "WorkspaceResearcher"],
101-
"roleAssignments": []
102-
}
107+
get_workspace_users_mock.return_value = []
103108

104-
users = [user]
109+
response = await client.post(app.url_path_for(strings.API_ASSIGN_WORKSPACE_USER, workspace_id=WORKSPACE_ID), json={
110+
"role_id": role_id,
111+
"user_ids": [ "user_1" ]
112+
})
113+
assert response.status_code == status.HTTP_202_ACCEPTED
105114

106-
role_name_to_assign = "AirlockManager"
107-
role = {"id": "test_role_id"}
115+
assign_workspace_user_mock.assert_called_once()
116+
get_workspace_users_mock.assert_called_once()
108117

109-
get_user_by_email_mock.return_value = User.parse_obj(user)
110-
get_workspace_role_by_name_mock.return_value = role
111-
get_workspace_users_mock.return_value = users
118+
@pytest.mark.parametrize("auth_class", ["aad_authentication.AzureADAuthorization"])
119+
@patch("api.dependencies.workspaces.WorkspaceRepository.get_workspace_by_id", return_value=sample_workspace())
120+
async def test_assign_workspace_user_assigns_multiple_workspace_user(self, get_workspace_by_id_mock, auth_class, app, client):
121+
with patch(f"services.{auth_class}.assign_workspace_user") as assign_workspace_user_mock, \
122+
patch(f"services.{auth_class}.get_workspace_users") as get_workspace_users_mock:
123+
124+
role_id = "test_role_id"
112125

113-
response = await client.post(app.url_path_for(strings.API_ASSIGN_WORKSPACE_USER, workspace_id=WORKSPACE_ID), params={"user_email": user["email"], "role_name": role_name_to_assign})
126+
get_workspace_users_mock.return_value = []
127+
128+
response = await client.post(app.url_path_for(strings.API_ASSIGN_WORKSPACE_USER, workspace_id=WORKSPACE_ID), json={
129+
"role_id": role_id,
130+
"user_ids": [ "user_1", "user_2" ]
131+
})
114132
assert response.status_code == status.HTTP_202_ACCEPTED
115133

116-
get_user_by_email_mock.assert_called_once_with(user["email"])
117-
get_workspace_role_by_name_mock.assert_called_once_with(role_name_to_assign, workspace)
118-
assign_workspace_user_mock.assert_called_once_with(User.parse_obj(user), workspace, role)
134+
assign_workspace_user_mock.call_count == 2
119135
get_workspace_users_mock.assert_called_once()
120136

121-
assert response.json()["users"] == users
122-
123137
@pytest.mark.parametrize("auth_class", ["aad_authentication.AzureADAuthorization"])
124138
@patch("api.dependencies.workspaces.WorkspaceRepository.get_workspace_by_id", return_value=sample_workspace())
125139
async def test_remove_workspace_user_assignment_removes_workspace_user_assignment(self, get_workspace_by_id_mock, auth_class, app, client):
126140
with patch(f"services.{auth_class}.remove_workspace_role_user_assignment") as remove_workspace_role_user_assignment_mock, \
127-
patch(f"services.{auth_class}.get_user_by_email") as get_user_by_email_mock, \
128-
patch(f"services.{auth_class}.get_workspace_role_by_name") as get_workspace_role_by_name_mock, \
129141
patch(f"services.{auth_class}.get_workspace_users") as get_workspace_users_mock:
130142

131-
workspace = get_workspace_by_id_mock.return_value
132-
133143
user = {
134-
"id": "123",
135-
"name": "John Doe",
136-
"email": "[email protected]",
137-
"roles": ["WorkspaceOwner", "WorkspaceResearcher"],
138-
"roleAssignments": []
139-
}
140-
141-
role_name_to_deassign = "WorkspaceResearcher"
142-
role = {"id": "test_role_id"}
143-
144-
get_user_by_email_mock.return_value = User.parse_obj(user)
145-
get_workspace_role_by_name_mock.return_value = role
144+
"id": "123",
145+
"displayName": "John Doe",
146+
"userPrincipalName": "[email protected]",
147+
"roles": [
148+
{
149+
"id": "1",
150+
"displayName": "WorkspaceOwner",
151+
"type": "ApplicationRole"
152+
},
153+
{
154+
"id": "2",
155+
"displayName": "WorkspaceResearcher",
156+
"type": "ApplicationRole"
157+
}]
158+
}
146159

147-
user["roles"].remove(role_name_to_deassign)
148-
users = [user]
160+
role_id = "test_role_id"
149161

150-
get_workspace_users_mock.return_value = users
162+
get_workspace_users_mock.return_value = []
151163

152-
response = await client.delete(app.url_path_for(strings.API_ASSIGN_WORKSPACE_USER, workspace_id=WORKSPACE_ID), params={"user_email": user["email"], "role_name": role_name_to_deassign})
164+
response = await client.delete(app.url_path_for(strings.API_ASSIGN_WORKSPACE_USER, workspace_id=WORKSPACE_ID), params={"user_id": user["id"], "role_id": role_id, "assignmentType": "ApplicationRole"})
153165
assert response.status_code == status.HTTP_202_ACCEPTED
154166

155-
get_user_by_email_mock.assert_called_once_with(user["email"])
156-
get_workspace_role_by_name_mock.assert_called_once_with(role_name_to_deassign, workspace)
157-
remove_workspace_role_user_assignment_mock.assert_called_once_with(get_user_by_email_mock.return_value, role, workspace)
167+
remove_workspace_role_user_assignment_mock.assert_called_once()
158168
get_workspace_users_mock.assert_called_once()
159169

160-
assert response.json()["users"] == users
161-
162170
@pytest.mark.parametrize("auth_class", ["aad_authentication.AzureADAuthorization"])
163171
@patch("api.dependencies.workspaces.WorkspaceRepository.get_workspace_by_id", return_value=sample_workspace())
164172
async def test_get_assignable_users_returns_assignable_users(self, get_workspace_by_id_mock, auth_class, app, client):
165173
with patch(f"services.{auth_class}.get_assignable_users") as get_assignable_users_mock:
166174
assignable_users = [
167175
{
168-
"name": "John Doe",
169-
"email": "[email protected]",
176+
"id": "1",
177+
"displayName": "John Doe",
178+
"userPrincipalName": "[email protected]",
179+
"roles": [
180+
{
181+
"id": "1",
182+
"displayName": "WorkspaceOwner",
183+
"type": "ApplicationRole"
184+
},
185+
{
186+
"id": "2",
187+
"displayName": "WorkspaceResearcher",
188+
"type": "ApplicationRole"
189+
}]
170190
},
171191
{
172-
"name": "Jane Smith",
173-
"email": "[email protected]",
192+
"id": "1",
193+
"displayName": "Jane Smith",
194+
"userPrincipalName": "[email protected]",
195+
"roles": [
196+
{
197+
"id": "2",
198+
"displayName": "WorkspaceResearcher",
199+
"type": "ApplicationRole"
200+
}]
174201
}
175202
]
176203

177204
get_assignable_users_mock.return_value = assignable_users
178205

179206
response = await client.get(app.url_path_for(strings.API_GET_ASSIGNABLE_USERS, workspace_id=WORKSPACE_ID))
180207

208+
get_assignable_users_mock.assert_called_once()
181209
assert response.status_code == status.HTTP_200_OK
182-
assert response.json()["assignable_users"] == assignable_users
183210

184211
@pytest.mark.parametrize("auth_class", ["aad_authentication.AzureADAuthorization"])
185212
@patch("api.dependencies.workspaces.WorkspaceRepository.get_workspace_by_id", return_value=sample_workspace())
@@ -188,42 +215,24 @@ async def test_get_workspace_roles_returns_workspace_roles(self, get_workspace_b
188215
workspace_roles = [
189216
Role(
190217
id="1",
191-
value="AirlockManager",
192-
isEnabled=True,
193-
email=None,
194-
allowedMemberTypes=["Application", "User"],
195-
description="Provides airlock managers access to the Workspace and ability to review airlock requests.",
196-
displayName="Airlock Manager",
197-
origin="Application",
198-
roleAssignments=[],
218+
displayName="AirlockManager",
219+
type=AssignmentType.APP_ROLE
199220
),
200221
Role(
201222
id="2",
202-
value="WorkspaceResearcher",
203-
isEnabled=True,
204-
email=None,
205-
allowedMemberTypes=["Application", "User"],
206-
description="Provides researchers access to the Workspace.",
207-
displayName="Workspace Researcher",
208-
origin="Application",
209-
roleAssignments=[],
223+
displayName="WorkspaceResearcher",
224+
type=AssignmentType.APP_ROLE
210225
),
211226
Role(
212227
id="3",
213-
value="WorkspaceOwner",
214-
isEnabled=True,
215-
email=None,
216-
allowedMemberTypes=["Application", "User"],
217-
description="Provides workspace owners access to the Workspace.",
218-
displayName="Workspace Owner",
219-
origin="Application",
220-
roleAssignments=[],
221-
),
228+
displayName="WorkspaceOwner",
229+
type=AssignmentType.APP_ROLE
230+
)
222231
]
223232

224233
get_workspace_roles_mock.return_value = workspace_roles
225234

226235
response = await client.get(app.url_path_for(strings.API_GET_WORKSPACE_ROLES, workspace_id=WORKSPACE_ID))
227236

237+
get_workspace_roles_mock.assert_called_once()
228238
assert response.status_code == status.HTTP_200_OK
229-
assert response.json()["roles"] == workspace_roles

0 commit comments

Comments
 (0)