Skip to content

Commit cd7282b

Browse files
committed
tests are passing
1 parent d44446e commit cd7282b

File tree

3 files changed

+99
-15
lines changed

3 files changed

+99
-15
lines changed

packages/models-library/src/models_library/storage_schemas.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,4 +380,46 @@ class PathMetaDataGet(BaseModel):
380380
file_meta_data: Annotated[
381381
FileMetaDataGet | None,
382382
Field(description="if filled, this is the file meta data of the s3 object"),
383-
]
383+
] = None
384+
385+
assert "json_schema_extra" in FileMetaDataGet.model_config # nosec
386+
assert isinstance(FileMetaDataGet.model_config["json_schema_extra"], dict) # nosec
387+
assert isinstance( # nosec
388+
FileMetaDataGet.model_config["json_schema_extra"]["examples"], list
389+
)
390+
391+
model_config = ConfigDict(
392+
extra="forbid",
393+
json_schema_extra={
394+
"examples": [
395+
# ls no filter
396+
{
397+
"path": "f8da77a9-24b9-4eab-aee7-1f0608da1e3e",
398+
"display_path": "my amazing project",
399+
},
400+
# ls f8da77a9-24b9-4eab-aee7-1f0608da1e3e
401+
{
402+
"path": "f8da77a9-24b9-4eab-aee7-1f0608da1e3e/2f94f80f-633e-4dfa-a983-226b7babe3d7",
403+
"display_path": "my amazing project/awesome node",
404+
},
405+
# ls f8da77a9-24b9-4eab-aee7-1f0608da1e3e/2f94f80f-633e-4dfa-a983-226b7babe3d7
406+
{
407+
"path": "f8da77a9-24b9-4eab-aee7-1f0608da1e3e/2f94f80f-633e-4dfa-a983-226b7babe3d7/outputs",
408+
"display_path": "my amazing project/awesome node/outputs",
409+
},
410+
# ls f8da77a9-24b9-4eab-aee7-1f0608da1e3e/2f94f80f-633e-4dfa-a983-226b7babe3d7/outputs
411+
{
412+
"path": "f8da77a9-24b9-4eab-aee7-1f0608da1e3e/2f94f80f-633e-4dfa-a983-226b7babe3d7/outputs/output5",
413+
"display_path": "my amazing project/awesome node/outputs/output5",
414+
},
415+
# ls f8da77a9-24b9-4eab-aee7-1f0608da1e3e/2f94f80f-633e-4dfa-a983-226b7babe3d7/outputs/output_5
416+
{
417+
"path": f"f8da77a9-24b9-4eab-aee7-1f0608da1e3e/2f94f80f-633e-4dfa-a983-226b7babe3d7/outputs/output5/{FileMetaDataGet.model_config['json_schema_extra']['examples'][0]['file_name']}",
418+
"display_path": f"my amazing project/awesome node/outputs/output5/{FileMetaDataGet.model_config['json_schema_extra']['examples'][0]['file_name']}",
419+
"file_meta_data": FileMetaDataGet.model_config["json_schema_extra"][
420+
"examples"
421+
][0],
422+
},
423+
]
424+
},
425+
)

services/web/server/tests/unit/with_dbs/01/storage/conftest.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66
import logging
77
import random
88
from collections.abc import Iterator
9+
from pathlib import Path
910
from threading import Thread
11+
from typing import Annotated
1012

1113
import pytest
1214
import uvicorn
1315
from faker import Faker
14-
from fastapi import APIRouter, FastAPI, Request, status
16+
from fastapi import APIRouter, Depends, FastAPI, Request, status
17+
from fastapi_pagination import add_pagination, create_page
18+
from fastapi_pagination.cursor import CursorPage, CursorParams
1519
from models_library.generics import Envelope
1620
from models_library.projects import ProjectID
1721
from models_library.projects_nodes_io import LocationID, StorageFileID
@@ -24,6 +28,7 @@
2428
FileUploadCompletionBody,
2529
FileUploadSchema,
2630
LinkType,
31+
PathMetaDataGet,
2732
)
2833
from models_library.users import UserID
2934
from pydantic import AnyUrl, TypeAdapter
@@ -41,6 +46,8 @@ def storage_vtag() -> str:
4146
@pytest.fixture(scope="module")
4247
def fake_storage_app(storage_vtag: str) -> FastAPI:
4348
app = FastAPI(debug=True)
49+
add_pagination(app)
50+
4451
router = APIRouter(
4552
prefix=f"/{storage_vtag}",
4653
)
@@ -68,6 +75,38 @@ async def _list_storage_locations(user_id: UserID, request: Request):
6875
]
6976
)
7077

78+
@router.get(
79+
"/locations/{location_id}/paths",
80+
response_model=CursorPage[PathMetaDataGet],
81+
)
82+
async def _list_paths(
83+
page_params: Annotated[CursorParams, Depends()],
84+
# dsm: Annotated[BaseDataManager, Depends(get_data_manager)],
85+
user_id: UserID,
86+
file_filter: Path | None = None,
87+
):
88+
assert user_id
89+
assert "json_schema_extra" in PathMetaDataGet.model_config
90+
assert isinstance(PathMetaDataGet.model_config["json_schema_extra"], dict)
91+
assert isinstance(
92+
PathMetaDataGet.model_config["json_schema_extra"]["examples"], list
93+
)
94+
95+
example_index = len(file_filter.parts) if file_filter else 0
96+
assert example_index < len(
97+
PathMetaDataGet.model_config["json_schema_extra"]["examples"]
98+
), "fake server unable to server this example"
99+
chosen_example = PathMetaDataGet.model_config["json_schema_extra"]["examples"][
100+
example_index
101+
]
102+
103+
return create_page(
104+
random.randint(3, 15)
105+
* [PathMetaDataGet.model_validate(chosen_example)], # noqa: S311
106+
params=page_params,
107+
next_=None,
108+
)
109+
71110
@router.get(
72111
"/locations/{location_id}/files/metadata",
73112
response_model=Envelope[list[FileMetaDataGet]],

services/web/server/tests/unit/with_dbs/01/storage/test_storage.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
import pytest
1010
from aiohttp.test_utils import TestClient
1111
from faker import Faker
12+
from fastapi_pagination.cursor import CursorPage
1213
from models_library.projects_nodes_io import LocationID, StorageFileID
1314
from models_library.storage_schemas import (
1415
DatasetMetaDataGet,
1516
FileLocation,
1617
FileMetaDataGet,
1718
FileUploadSchema,
19+
PathMetaDataGet,
1820
)
1921
from pydantic import TypeAdapter
2022
from pytest_simcore.helpers.assert_checks import assert_status
@@ -80,7 +82,7 @@ async def test_list_storage_paths(
8082
resp = await client.get(f"{url}", params={"user_id": logged_user["id"]})
8183
data, error = await assert_status(resp, expected)
8284
if not error:
83-
assert isinstance(data, list)
85+
TypeAdapter(CursorPage[PathMetaDataGet]).validate_python(data)
8486

8587

8688
@pytest.mark.parametrize(
@@ -264,15 +266,16 @@ async def test_upload_file(
264266

265267
resp = await client.put(url, params={"user_id": logged_user["id"]})
266268
data, error = await assert_status(resp, expected)
267-
assert not error
268-
assert data
269-
file_upload_schema = FileUploadSchema.model_validate(data)
270-
271-
# let's abort
272-
resp = await client.post(
273-
f"{file_upload_schema.links.abort_upload.path}",
274-
params={"user_id": logged_user["id"]},
275-
)
276-
data, error = await assert_status(resp, status.HTTP_204_NO_CONTENT)
277-
assert not error
278-
assert not data
269+
if not error:
270+
assert not error
271+
assert data
272+
file_upload_schema = FileUploadSchema.model_validate(data)
273+
274+
# let's abort
275+
resp = await client.post(
276+
f"{file_upload_schema.links.abort_upload.path}",
277+
params={"user_id": logged_user["id"]},
278+
)
279+
data, error = await assert_status(resp, status.HTTP_204_NO_CONTENT)
280+
assert not error
281+
assert not data

0 commit comments

Comments
 (0)