@@ -87,7 +87,6 @@ async def test_trash_service__delete_expired_trash(
8787
8888 # UNDER TEST: Run delete_expired_trash
8989 await trash_service .safe_delete_expired_trash_as_admin (client .app )
90-
9190 # ASSERT: logged_user tries to get the project and expects 404
9291 resp = await client .get (f"/v0/projects/{ user_project_id } " )
9392 await assert_status (resp , status .HTTP_404_NOT_FOUND )
@@ -98,7 +97,7 @@ async def test_trash_service__delete_expired_trash(
9897 await assert_status (resp , status .HTTP_404_NOT_FOUND )
9998
10099
101- async def test_trash_nested_folders_and_projects (
100+ async def test_trash_service__delete_expired_trash_for_nested_folders_and_projects (
102101 client : TestClient ,
103102 logged_user : UserInfoDict ,
104103 user_project : ProjectDict ,
@@ -191,3 +190,134 @@ async def test_trash_nested_folders_and_projects(
191190
192191 resp = await client .get (f"/v0/projects/{ other_user_project ['uuid' ]} " )
193192 await assert_status (resp , status .HTTP_404_NOT_FOUND )
193+
194+
195+ async def test_trash_service__delete_expired_trash_for_workspace (
196+ client : TestClient ,
197+ logged_user : UserInfoDict ,
198+ user_project : ProjectDict ,
199+ other_user : UserInfoDict ,
200+ other_user_project : ProjectDict ,
201+ mocked_catalog : None ,
202+ mocked_director_v2 : None ,
203+ mocked_dynamic_services_interface : dict [str , MagicMock ],
204+ ):
205+ assert client .app
206+ assert logged_user ["id" ] != other_user ["id" ]
207+
208+ async with switch_client_session_to (client , logged_user ):
209+ # CREATE folders hierarchy for logged_user
210+ resp = await client .post ("/v0/folders" , json = {"name" : "Root Folder" })
211+ data , _ = await assert_status (resp , status .HTTP_201_CREATED )
212+ logged_user_root_folder = data
213+
214+ resp = await client .post (
215+ "/v0/folders" ,
216+ json = {
217+ "name" : "Sub Folder" ,
218+ "parentFolderId" : logged_user_root_folder ["folderId" ],
219+ },
220+ )
221+ data , _ = await assert_status (resp , status .HTTP_201_CREATED )
222+ logged_user_sub_folder = data
223+
224+ # MOVE project to subfolder
225+ resp = await client .put (
226+ f"/v0/projects/{ user_project ['uuid' ]} /folders/{ logged_user_sub_folder ['folderId' ]} "
227+ )
228+ await assert_status (resp , status .HTTP_204_NO_CONTENT )
229+
230+ # CREATE workspace
231+ resp = await client .post ("/v0/workspaces" , json = {"name" : "My Workspace" })
232+ data , _ = await assert_status (resp , status .HTTP_201_CREATED )
233+ logged_user_workspace = data
234+
235+ # MOVE root folder with content to workspace
236+ url = client .app .router ["move_folder_to_workspace" ].url_for (
237+ folder_id = f"{ logged_user_root_folder ['folderId' ]} " ,
238+ workspace_id = f"{ logged_user_workspace ['workspaceId' ]} " ,
239+ )
240+ resp = await client .post (f"{ url } " )
241+ await assert_status (resp , status .HTTP_204_NO_CONTENT )
242+
243+ # TRASH workspace
244+ resp = await client .post (
245+ f"/v0/workspaces/{ logged_user_workspace ['workspaceId' ]} :trash"
246+ )
247+ await assert_status (resp , status .HTTP_204_NO_CONTENT )
248+
249+ async with switch_client_session_to (client , other_user ):
250+ # CREATE folders hierarchy for other_user
251+ resp = await client .post ("/v0/folders" , json = {"name" : "Root Folder" })
252+ data , _ = await assert_status (resp , status .HTTP_201_CREATED )
253+ other_user_root_folder = data
254+
255+ resp = await client .post (
256+ "/v0/folders" ,
257+ json = {
258+ "name" : "Sub Folder (other)" ,
259+ "parentFolderId" : other_user_root_folder ["folderId" ],
260+ },
261+ )
262+ data , _ = await assert_status (resp , status .HTTP_201_CREATED )
263+ other_user_sub_folder = data
264+
265+ # MOVE project to subfolder
266+ resp = await client .put (
267+ f"/v0/projects/{ other_user_project ['uuid' ]} /folders/{ other_user_sub_folder ['folderId' ]} "
268+ )
269+ await assert_status (resp , status .HTTP_204_NO_CONTENT )
270+
271+ # CREATE workspace
272+ resp = await client .post (
273+ "/v0/workspaces" , json = {"name" : "Other User Workspace" }
274+ )
275+ data , _ = await assert_status (resp , status .HTTP_201_CREATED )
276+ other_user_workspace = data
277+
278+ # MOVE Folder to workspace
279+ url = client .app .router ["move_folder_to_workspace" ].url_for (
280+ folder_id = f"{ other_user_root_folder ['folderId' ]} " ,
281+ workspace_id = f"{ other_user_workspace ['workspaceId' ]} " ,
282+ )
283+ resp = await client .post (f"{ url } " )
284+ await assert_status (resp , status .HTTP_204_NO_CONTENT )
285+
286+ # TRASH workspace
287+ resp = await client .post (
288+ f"/v0/workspaces/{ other_user_workspace ['workspaceId' ]} :trash"
289+ )
290+ await assert_status (resp , status .HTTP_204_NO_CONTENT )
291+
292+ # UNDER TEST
293+ await trash_service .safe_delete_expired_trash_as_admin (client .app )
294+
295+ async with switch_client_session_to (client , logged_user ):
296+ # Verify logged_user's resources are gone
297+ resp = await client .get (
298+ f"/v0/workspaces/{ logged_user_workspace ['workspaceId' ]} "
299+ )
300+ await assert_status (resp , status .HTTP_403_FORBIDDEN )
301+
302+ resp = await client .get (f"/v0/folders/{ logged_user_root_folder ['folderId' ]} " )
303+ await assert_status (resp , status .HTTP_403_FORBIDDEN )
304+
305+ resp = await client .get (f"/v0/folders/{ logged_user_sub_folder ['folderId' ]} " )
306+ await assert_status (resp , status .HTTP_403_FORBIDDEN )
307+
308+ resp = await client .get (f"/v0/projects/{ user_project ['uuid' ]} " )
309+ await assert_status (resp , status .HTTP_404_NOT_FOUND )
310+
311+ # Verify other_user's resources are gone
312+ async with switch_client_session_to (client , other_user ):
313+ resp = await client .get (f"/v0/workspaces/{ other_user_workspace ['workspaceId' ]} " )
314+ await assert_status (resp , status .HTTP_403_FORBIDDEN )
315+
316+ resp = await client .get (f"/v0/folders/{ other_user_root_folder ['folderId' ]} " )
317+ await assert_status (resp , status .HTTP_403_FORBIDDEN )
318+
319+ resp = await client .get (f"/v0/folders/{ other_user_sub_folder ['folderId' ]} " )
320+ await assert_status (resp , status .HTTP_403_FORBIDDEN )
321+
322+ resp = await client .get (f"/v0/projects/{ other_user_project ['uuid' ]} " )
323+ await assert_status (resp , status .HTTP_404_NOT_FOUND )
0 commit comments