3
3
4
4
from fastapi import status
5
5
6
- from models .domain .authentication import Role , User
6
+ from models .domain .workspace_users import AssignmentType , Role
7
7
from tests_ma .test_api .test_routes .test_resource_helpers import FAKE_CREATE_TIMESTAMP
8
8
from tests_ma .test_api .conftest import create_admin_user
9
9
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
63
63
users = [
64
64
{
65
65
"id" : "123" ,
66
- "name" : "John Doe" ,
67
-
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
+ }]
70
79
},
71
80
{
72
81
"id" : "456" ,
73
- "name" : "Jane Smith" ,
74
-
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
+ }]
77
90
}
78
91
]
79
92
get_workspace_users_mock .return_value = users
@@ -85,101 +98,115 @@ async def test_get_workspace_users_returns_users(self, _, auth_class, app, clien
85
98
86
99
@pytest .mark .parametrize ("auth_class" , ["aad_authentication.AzureADAuthorization" ])
87
100
@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 :
93
104
94
- workspace = get_workspace_by_id_mock . return_value
105
+ role_id = "test_role_id"
95
106
96
- user = {
97
- "id" : "123" ,
98
- "name" : "John Doe" ,
99
-
100
- "roles" : ["WorkspaceOwner" , "WorkspaceResearcher" ],
101
- "roleAssignments" : []
102
- }
107
+ get_workspace_users_mock .return_value = []
103
108
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
105
114
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 ()
108
117
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"
112
125
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
+ })
114
132
assert response .status_code == status .HTTP_202_ACCEPTED
115
133
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
119
135
get_workspace_users_mock .assert_called_once ()
120
136
121
- assert response .json ()["users" ] == users
122
-
123
137
@pytest .mark .parametrize ("auth_class" , ["aad_authentication.AzureADAuthorization" ])
124
138
@patch ("api.dependencies.workspaces.WorkspaceRepository.get_workspace_by_id" , return_value = sample_workspace ())
125
139
async def test_remove_workspace_user_assignment_removes_workspace_user_assignment (self , get_workspace_by_id_mock , auth_class , app , client ):
126
140
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 , \
129
141
patch (f"services.{ auth_class } .get_workspace_users" ) as get_workspace_users_mock :
130
142
131
- workspace = get_workspace_by_id_mock .return_value
132
-
133
143
user = {
134
- "id" : "123" ,
135
- "name" : "John Doe" ,
136
-
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
+ }
146
159
147
- user ["roles" ].remove (role_name_to_deassign )
148
- users = [user ]
160
+ role_id = "test_role_id"
149
161
150
- get_workspace_users_mock .return_value = users
162
+ get_workspace_users_mock .return_value = []
151
163
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" })
153
165
assert response .status_code == status .HTTP_202_ACCEPTED
154
166
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 ()
158
168
get_workspace_users_mock .assert_called_once ()
159
169
160
- assert response .json ()["users" ] == users
161
-
162
170
@pytest .mark .parametrize ("auth_class" , ["aad_authentication.AzureADAuthorization" ])
163
171
@patch ("api.dependencies.workspaces.WorkspaceRepository.get_workspace_by_id" , return_value = sample_workspace ())
164
172
async def test_get_assignable_users_returns_assignable_users (self , get_workspace_by_id_mock , auth_class , app , client ):
165
173
with patch (f"services.{ auth_class } .get_assignable_users" ) as get_assignable_users_mock :
166
174
assignable_users = [
167
175
{
168
- "name" : "John Doe" ,
169
-
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
+ }]
170
190
},
171
191
{
172
- "name" : "Jane Smith" ,
173
-
192
+ "id" : "1" ,
193
+ "displayName" : "Jane Smith" ,
194
+ "userPrincipalName" :
"[email protected] " ,
195
+ "roles" : [
196
+ {
197
+ "id" : "2" ,
198
+ "displayName" : "WorkspaceResearcher" ,
199
+ "type" : "ApplicationRole"
200
+ }]
174
201
}
175
202
]
176
203
177
204
get_assignable_users_mock .return_value = assignable_users
178
205
179
206
response = await client .get (app .url_path_for (strings .API_GET_ASSIGNABLE_USERS , workspace_id = WORKSPACE_ID ))
180
207
208
+ get_assignable_users_mock .assert_called_once ()
181
209
assert response .status_code == status .HTTP_200_OK
182
- assert response .json ()["assignable_users" ] == assignable_users
183
210
184
211
@pytest .mark .parametrize ("auth_class" , ["aad_authentication.AzureADAuthorization" ])
185
212
@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
188
215
workspace_roles = [
189
216
Role (
190
217
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
199
220
),
200
221
Role (
201
222
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
210
225
),
211
226
Role (
212
227
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
+ )
222
231
]
223
232
224
233
get_workspace_roles_mock .return_value = workspace_roles
225
234
226
235
response = await client .get (app .url_path_for (strings .API_GET_WORKSPACE_ROLES , workspace_id = WORKSPACE_ID ))
227
236
237
+ get_workspace_roles_mock .assert_called_once ()
228
238
assert response .status_code == status .HTTP_200_OK
229
- assert response .json ()["roles" ] == workspace_roles
0 commit comments