Skip to content

Commit 176c8b6

Browse files
committed
setup with folders and projects
1 parent 276c64f commit 176c8b6

File tree

2 files changed

+137
-6
lines changed

2 files changed

+137
-6
lines changed

services/web/server/src/simcore_service_webserver/folders/_folders_db.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ async def get_for_user_or_workspace(
209209
return FolderDB.from_orm(row)
210210

211211

212+
_MAX_ITEMS_UPDATE: Final = 100
213+
214+
212215
async def update(
213216
app: web.Application,
214217
*,
@@ -238,9 +241,10 @@ async def update(
238241
)
239242

240243
if isinstance(folder_id, set):
241-
if len(folder_id) == 0:
242-
msg = f"Expected one or more folder_id to update, got {folder_id}"
244+
if len(folder_id) == 0 or len(folder_id) > _MAX_ITEMS_UPDATE:
245+
msg = f"Number of items for batch update is out-of-range, got {len(folder_id)=}"
243246
raise ValueError(msg)
247+
244248
# batch-update
245249
query = query.where(folders_v2.c.folder_id.in_(list(folder_id)))
246250
else:

services/web/server/tests/unit/with_dbs/03/test_trash.py

Lines changed: 131 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,16 @@ async def test_trash_projects( # noqa: PLR0915
181181
@pytest.mark.acceptance_test(
182182
"For https://github.com/ITISFoundation/osparc-simcore/pull/6642"
183183
)
184-
async def test_trash_single_folder(
185-
client: TestClient, logged_user: UserInfoDict, is_project_running: bool, force: bool
186-
):
184+
async def test_trash_single_folder(client: TestClient, logged_user: UserInfoDict):
187185
assert client.app
188186

189-
# CREATE a folder
187+
# CREATE a folder
190188
resp = await client.post("/v0/folders", json={"name": "My first folder"})
191189
data, _ = await assert_status(resp, status.HTTP_201_CREATED)
192190
folder = FolderGet.parse_obj(data)
193191

192+
# ---------------------------------------------------------------------
193+
194194
# LIST NOT trashed
195195
resp = await client.get("/v0/folders")
196196
await assert_status(resp, status.HTTP_200_OK)
@@ -253,3 +253,130 @@ async def test_trash_single_folder(
253253

254254
assert got.folder_id == folder.folder_id
255255
assert got.trashed_at is None
256+
257+
258+
@pytest.mark.acceptance_test(
259+
"For https://github.com/ITISFoundation/osparc-simcore/pull/6642"
260+
)
261+
async def test_trash_folder_with_content(
262+
client: TestClient,
263+
logged_user: UserInfoDict,
264+
user_project: ProjectDict,
265+
mocked_catalog: None,
266+
mocked_director_v2: None,
267+
):
268+
assert client.app
269+
project_uuid = UUID(user_project["uuid"])
270+
271+
# CREATE a folder
272+
resp = await client.post("/v0/folders", json={"name": "My first folder"})
273+
data, _ = await assert_status(resp, status.HTTP_201_CREATED)
274+
folder = FolderGet.parse_obj(data)
275+
276+
# CREATE a SUB-folder
277+
resp = await client.post(
278+
"/v0/folders",
279+
json={"name": "My subfolder 1", "parentFolderId": folder.folder_id},
280+
)
281+
data, _ = await assert_status(resp, status.HTTP_201_CREATED)
282+
subfolder = FolderGet.parse_obj(data)
283+
284+
# MOVE project to SUB-folder
285+
resp = await client.put(
286+
f"/v0/projects/{project_uuid}/folders/{subfolder.folder_id}"
287+
)
288+
await assert_status(resp, status.HTTP_204_NO_CONTENT)
289+
290+
# CHECK created
291+
resp = await client.get("/v0/folders")
292+
await assert_status(resp, status.HTTP_200_OK)
293+
page = Page[FolderGet].parse_obj(await resp.json())
294+
assert page.meta.total == 1
295+
assert page.data[0] == folder
296+
297+
resp = await client.get("/v0/folders", params={"folder_id": f"{folder.folder_id}"})
298+
await assert_status(resp, status.HTTP_200_OK)
299+
page = Page[FolderGet].parse_obj(await resp.json())
300+
assert page.meta.total == 1
301+
assert page.data[0] == subfolder
302+
303+
resp = await client.get("/v0/projects")
304+
await assert_status(resp, status.HTTP_200_OK)
305+
page = Page[ProjectListItem].parse_obj(await resp.json())
306+
assert page.meta.total == 1
307+
assert page.data[0].uuid == project_uuid
308+
assert page.data[0].folder_id == subfolder.folder_id
309+
310+
# ---------------------------------------------------------------------
311+
312+
# TRASH folder
313+
resp = await client.post(f"/v0/folders/{folder.folder_id}:trash")
314+
await assert_status(resp, status.HTTP_204_NO_CONTENT)
315+
316+
# ONLY folder listed in trash. The rest is not listed anymore!
317+
resp = await client.get("/v0/folders", params={"filters": '{"trashed": true}'})
318+
await assert_status(resp, status.HTTP_200_OK)
319+
page = Page[FolderGet].parse_obj(await resp.json())
320+
assert page.meta.total == 1
321+
assert page.data[0].folder_id == folder.folder_id
322+
323+
resp = await client.get(
324+
"/v0/folders",
325+
params={"filters": '{"trashed": true}', "folder_id": f"{folder.folder_id}"},
326+
)
327+
await assert_status(resp, status.HTTP_200_OK)
328+
page = Page[FolderGet].parse_obj(await resp.json())
329+
assert page.meta.total == 0
330+
assert page.data[0].folder_id == subfolder.folder_id
331+
332+
resp = await client.get("/v0/projects", params={"filters": '{"trashed": true}'})
333+
await assert_status(resp, status.HTTP_200_OK)
334+
page = Page[ProjectListItem].parse_obj(await resp.json())
335+
assert page.meta.total == 0
336+
337+
# CHECK marked as trashed
338+
resp = await client.get(f"/v0/folders/{folder.folder_id}")
339+
data, _ = await assert_status(resp, status.HTTP_200_OK)
340+
got = FolderGet.parse_obj(data)
341+
assert got.trashed_at is not None
342+
343+
resp = await client.get(f"/v0/folders/{subfolder.folder_id}")
344+
data, _ = await assert_status(resp, status.HTTP_200_OK)
345+
got = FolderGet.parse_obj(data)
346+
assert got.trashed_at is not None
347+
348+
resp = await client.get(f"/v0/projects/{project_uuid}")
349+
data, _ = await assert_status(resp, status.HTTP_200_OK)
350+
got = FolderGet.parse_obj(data)
351+
assert got.trashed_at is not None
352+
353+
# UNTRASH folder
354+
resp = await client.post(f"/v0/folders/{folder.folder_id}:untrash")
355+
await assert_status(resp, status.HTTP_204_NO_CONTENT)
356+
357+
# NO folders listed in trash.
358+
resp = await client.get("/v0/folders", params={"filters": '{"trashed": true}'})
359+
await assert_status(resp, status.HTTP_200_OK)
360+
page = Page[FolderGet].parse_obj(await resp.json())
361+
assert page.meta.total == 0
362+
363+
resp = await client.get("/v0/projects", params={"filters": '{"trashed": true}'})
364+
await assert_status(resp, status.HTTP_200_OK)
365+
page = Page[ProjectListItem].parse_obj(await resp.json())
366+
assert page.meta.total == 0
367+
368+
# CHECK marked as trashed
369+
resp = await client.get(f"/v0/folders/{folder.folder_id}")
370+
data, _ = await assert_status(resp, status.HTTP_200_OK)
371+
got = FolderGet.parse_obj(data)
372+
assert got.trashed_at is None
373+
374+
resp = await client.get(f"/v0/folders/{subfolder.folder_id}")
375+
data, _ = await assert_status(resp, status.HTTP_200_OK)
376+
got = FolderGet.parse_obj(data)
377+
assert got.trashed_at is None
378+
379+
resp = await client.get(f"/v0/projects/{project_uuid}")
380+
data, _ = await assert_status(resp, status.HTTP_200_OK)
381+
got = FolderGet.parse_obj(data)
382+
assert got.trashed_at is None

0 commit comments

Comments
 (0)