Skip to content

Commit 5b213c0

Browse files
fix: create project fixture
1 parent 1770502 commit 5b213c0

File tree

2 files changed

+38
-17
lines changed

2 files changed

+38
-17
lines changed

packages/pytest-simcore/src/pytest_simcore/helpers/webserver_projects.py

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@
1212
from aiohttp import web
1313
from aiohttp.test_utils import TestClient
1414
from common_library.dict_tools import remap_keys
15-
from models_library.projects_nodes import Node
1615
from models_library.projects_nodes_io import NodeID
1716
from models_library.services_resources import ServiceResourcesDictHelpers
18-
from pydantic import TypeAdapter
1917
from simcore_postgres_database.utils_projects_nodes import ProjectNodeCreate
2018
from simcore_service_webserver.projects._groups_repository import (
2119
update_or_insert_project_group,
@@ -77,30 +75,49 @@ async def create_project(
7775

7876
db: ProjectDBAPI = app[APP_PROJECT_DBAPI]
7977

80-
raw_workbench = project_data.pop("workbench", {})
78+
raw_workbench: dict[str, Any] = project_data.pop("workbench", {})
79+
for raw_node in raw_workbench.values():
80+
if "position" in raw_node:
81+
del raw_node["position"]
82+
83+
# Get valid ProjectNodeCreate fields, excluding node_id since it's set separately
84+
valid_fields = ProjectNodeCreate.get_field_names(exclude={"node_id"})
85+
86+
# Mapping from camelCase (workbench) to snake_case (ProjectNodeCreate)
87+
field_mapping = {
88+
"inputAccess": "input_access",
89+
"inputNodes": "input_nodes",
90+
"inputsUnits": "inputs_units",
91+
"outputNodes": "output_nodes",
92+
"runHash": "run_hash",
93+
"bootOptions": "boot_options",
94+
}
8195

82-
workbench = TypeAdapter(dict[NodeID, Node]).validate_python(raw_workbench)
8396
fake_required_resources: dict[str, Any] = ServiceResourcesDictHelpers.model_config[
8497
"json_schema_extra"
8598
]["examples"][0]
8699

100+
project_nodes = {
101+
NodeID(node_id): ProjectNodeCreate(
102+
node_id=NodeID(node_id),
103+
# NOTE: fake initial resources until more is needed
104+
required_resources=fake_required_resources,
105+
**{
106+
str(field_mapping.get(field, field)): value
107+
for field, value in raw_node.items()
108+
if field_mapping.get(field, field) in valid_fields
109+
},
110+
)
111+
for node_id, raw_node in raw_workbench.items()
112+
}
113+
87114
project_created = await db.insert_project(
88115
project_data,
89116
user_id,
90117
product_name=product_name,
91118
force_project_uuid=force_uuid,
92119
force_as_template=as_template,
93-
# NOTE: fake initial resources until more is needed
94-
project_nodes={
95-
node_id: ProjectNodeCreate(
96-
node_id=node_id,
97-
required_resources=fake_required_resources,
98-
**node_model.model_dump(
99-
by_alias=False, exclude_unset=True, mode="json"
100-
),
101-
)
102-
for node_id, node_model in workbench.items()
103-
},
120+
project_nodes=project_nodes,
104121
)
105122

106123
if params_override and (

services/web/server/src/simcore_service_webserver/projects/_controller/projects_rest.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,9 @@ async def get_active_project(request: web.Request) -> web.Response:
249249
# updates project's permalink field
250250
await update_or_pop_permalink_in_project(request, project)
251251

252-
data = ProjectGet.from_domain_model(project).data(exclude_unset=True)
252+
data = ProjectGet.from_domain_model(project).data(
253+
exclude_none=True, exclude_unset=True
254+
)
253255

254256
return envelope_json_response(data)
255257

@@ -282,7 +284,9 @@ async def get_project(request: web.Request):
282284
# Adds permalink
283285
await update_or_pop_permalink_in_project(request, project)
284286

285-
data = ProjectGet.from_domain_model(project).data(exclude_unset=True)
287+
data = ProjectGet.from_domain_model(project).data(
288+
exclude_none=True, exclude_unset=True
289+
)
286290
return envelope_json_response(data)
287291

288292

0 commit comments

Comments
 (0)