|
28 | 28 | from simcore_service_webserver.db.models import UserRole |
29 | 29 | from simcore_service_webserver.projects._groups_api import ProjectGroupGet |
30 | 30 | from simcore_service_webserver.projects.models import ProjectDict |
| 31 | +from tenacity import AsyncRetrying, stop_after_attempt, wait_fixed |
31 | 32 | from yarl import URL |
32 | 33 |
|
33 | 34 |
|
@@ -789,3 +790,54 @@ async def test_trash_project_in_subfolder( |
789 | 790 | page = Page[ProjectGet].model_validate(await resp.json()) |
790 | 791 | assert page.meta.total == 1 |
791 | 792 | assert page.data[0].uuid == project_uuid |
| 793 | + |
| 794 | + |
| 795 | +async def test_trash_project_explitictly_and_empty_trash_bin( |
| 796 | + client: TestClient, |
| 797 | + logged_user: UserInfoDict, |
| 798 | + user_project: ProjectDict, |
| 799 | + mocked_catalog: None, |
| 800 | + mocked_dynamic_services_interface: dict[str, MagicMock], |
| 801 | +): |
| 802 | + assert client.app |
| 803 | + |
| 804 | + project_uuid = UUID(user_project["uuid"]) |
| 805 | + |
| 806 | + # TRASH project |
| 807 | + trashing_at = arrow.utcnow().datetime |
| 808 | + resp = await client.post( |
| 809 | + f"/v0/projects/{project_uuid}:trash", params={"force": "true"} |
| 810 | + ) |
| 811 | + await assert_status(resp, status.HTTP_204_NO_CONTENT) |
| 812 | + |
| 813 | + # LIST trashed projects |
| 814 | + resp = await client.get("/v0/projects", params={"filters": '{"trashed": true}'}) |
| 815 | + await assert_status(resp, status.HTTP_200_OK) |
| 816 | + |
| 817 | + page = Page[ProjectListItem].model_validate(await resp.json()) |
| 818 | + assert page.meta.total == 1 |
| 819 | + assert page.data[0].uuid == project_uuid |
| 820 | + |
| 821 | + # GET trashed project |
| 822 | + resp = await client.get(f"/v0/projects/{project_uuid}") |
| 823 | + data, _ = await assert_status(resp, status.HTTP_200_OK) |
| 824 | + got = ProjectGet.model_validate(data) |
| 825 | + assert got.uuid == project_uuid |
| 826 | + assert got.trashed_at is not None |
| 827 | + assert trashing_at < got.trashed_at < arrow.utcnow().datetime |
| 828 | + |
| 829 | + # force EMPTY trash |
| 830 | + resp = await client.delete("/v0/trash") |
| 831 | + await assert_status(resp, status.HTTP_204_NO_CONTENT) |
| 832 | + |
| 833 | + async for attempt in AsyncRetrying( |
| 834 | + stop=stop_after_attempt(3), wait=wait_fixed(1), reraise=True |
| 835 | + ): |
| 836 | + with attempt: |
| 837 | + # LIST trashed projects again |
| 838 | + resp = await client.get( |
| 839 | + "/v0/projects", params={"filters": '{"trashed": true}'} |
| 840 | + ) |
| 841 | + await assert_status(resp, status.HTTP_200_OK) |
| 842 | + page = Page[ProjectListItem].model_validate(await resp.json()) |
| 843 | + assert page.meta.total == 0 |
0 commit comments