Skip to content

Commit 0b1e491

Browse files
committed
Fix function unit tests
1 parent 58b57e2 commit 0b1e491

File tree

3 files changed

+89
-16
lines changed

3 files changed

+89
-16
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
"""Function db details
2+
3+
Revision ID: 7cefc13e3b2b
4+
Revises: 44f40f1069aa
5+
Create Date: 2025-05-12 11:28:32.298331+00:00
6+
7+
"""
8+
9+
import sqlalchemy as sa
10+
from alembic import op
11+
12+
# revision identifiers, used by Alembic.
13+
revision = "7cefc13e3b2b"
14+
down_revision = "44f40f1069aa"
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column(
22+
"funcapi_function_job_collections",
23+
sa.Column(
24+
"created", sa.DateTime(), server_default=sa.text("now()"), nullable=False
25+
),
26+
)
27+
op.add_column(
28+
"funcapi_function_job_collections",
29+
sa.Column(
30+
"modified", sa.DateTime(), server_default=sa.text("now()"), nullable=False
31+
),
32+
)
33+
op.add_column(
34+
"funcapi_function_job_collections_to_function_jobs",
35+
sa.Column(
36+
"created", sa.DateTime(), server_default=sa.text("now()"), nullable=False
37+
),
38+
)
39+
op.add_column(
40+
"funcapi_function_job_collections_to_function_jobs",
41+
sa.Column(
42+
"modified", sa.DateTime(), server_default=sa.text("now()"), nullable=False
43+
),
44+
)
45+
op.add_column(
46+
"funcapi_function_jobs", sa.Column("description", sa.String(), nullable=True)
47+
)
48+
op.add_column(
49+
"funcapi_function_jobs",
50+
sa.Column(
51+
"created", sa.DateTime(), server_default=sa.text("now()"), nullable=False
52+
),
53+
)
54+
op.add_column(
55+
"funcapi_function_jobs",
56+
sa.Column(
57+
"modified", sa.DateTime(), server_default=sa.text("now()"), nullable=False
58+
),
59+
)
60+
# ### end Alembic commands ###
61+
62+
63+
def downgrade():
64+
# ### commands auto generated by Alembic - please adjust! ###
65+
op.drop_column("funcapi_function_jobs", "modified")
66+
op.drop_column("funcapi_function_jobs", "created")
67+
op.drop_column("funcapi_function_jobs", "description")
68+
op.drop_column("funcapi_function_job_collections_to_function_jobs", "modified")
69+
op.drop_column("funcapi_function_job_collections_to_function_jobs", "created")
70+
op.drop_column("funcapi_function_job_collections", "modified")
71+
op.drop_column("funcapi_function_job_collections", "created")
72+
# ### end Alembic commands ###

services/api-server/src/simcore_service_api_server/api/routes/functions_routes.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ async def register_function_job(
367367

368368
@function_job_router.get(
369369
"/{function_job_id:uuid}",
370-
response_model=FunctionJob,
370+
response_model=RegisteredFunctionJob,
371371
responses={**_COMMON_FUNCTION_JOB_ERROR_RESPONSES},
372372
description="Get function job",
373373
)
@@ -502,7 +502,7 @@ async def function_job_outputs(
502502

503503
@function_router.post(
504504
"/{function_id:uuid}:map",
505-
response_model=FunctionJobCollection,
505+
response_model=RegisteredFunctionJobCollection,
506506
responses={**_COMMON_FUNCTION_ERROR_RESPONSES},
507507
description="Map function over input parameters",
508508
)
@@ -558,7 +558,7 @@ async def map_function( # noqa: PLR0913
558558

559559
@function_job_collections_router.get(
560560
"/{function_job_collection_id:uuid}",
561-
response_model=FunctionJobCollection,
561+
response_model=RegisteredFunctionJobCollection,
562562
responses={**_COMMON_FUNCTION_JOB_COLLECTION_ERROR_RESPONSES},
563563
description="Get function job collection",
564564
)
@@ -573,7 +573,7 @@ async def get_function_job_collection(
573573

574574
@function_job_collections_router.post(
575575
"",
576-
response_model=FunctionJobCollection,
576+
response_model=RegisteredFunctionJobCollection,
577577
description="Register function job collection",
578578
)
579579
async def register_function_job_collection(
@@ -602,7 +602,7 @@ async def delete_function_job_collection(
602602

603603
@function_job_collections_router.get(
604604
"/{function_job_collection_id:uuid}/function_jobs",
605-
response_model=list[FunctionJob],
605+
response_model=list[RegisteredFunctionJob],
606606
responses={**_COMMON_FUNCTION_JOB_COLLECTION_ERROR_RESPONSES},
607607
description="Get the function jobs in function job collection",
608608
)

services/api-server/tests/unit/api_functions/test_api_routers_functions.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
JSONFunctionInputSchema,
1313
JSONFunctionOutputSchema,
1414
RegisteredFunction,
15+
RegisteredFunctionJob,
1516
RegisteredFunctionJobCollection,
1617
)
1718
from models_library.rest_pagination import PageMetaInfoLimitOffset
@@ -64,7 +65,7 @@ def __init__(self) -> None:
6465
self._function_jobs = {}
6566
self._function_job_collections = {}
6667

67-
async def register_function(self, function: Function) -> Function:
68+
async def register_function(self, function: Function) -> RegisteredFunction:
6869
# Mimic returning the same function that was passed and store it for later retrieval
6970
uid = uuid4()
7071
self._functions[uid] = TypeAdapter(RegisteredFunction).validate_python(
@@ -81,7 +82,7 @@ async def register_function(self, function: Function) -> Function:
8182
)
8283
return self._functions[uid]
8384

84-
async def get_function(self, function_id: str) -> dict:
85+
async def get_function(self, function_id: str) -> RegisteredFunction:
8586
# Mimic retrieval of a function based on function_id and raise 404 if not found
8687
if function_id not in self._functions:
8788
raise HTTPException(status_code=404, detail="Function not found")
@@ -100,7 +101,7 @@ async def list_functions(
100101
self,
101102
pagination_offset: int,
102103
pagination_limit: int,
103-
) -> tuple[list[Function], PageMetaInfoLimitOffset]:
104+
) -> tuple[list[RegisteredFunction], PageMetaInfoLimitOffset]:
104105
# Mimic listing all functions
105106
functions_list = list(self._functions.values())[
106107
pagination_offset : pagination_offset + pagination_limit
@@ -121,10 +122,12 @@ async def delete_function(self, function_id: str) -> None:
121122
else:
122123
raise HTTPException(status_code=404, detail="Function not found")
123124

124-
async def register_function_job(self, function_job: FunctionJob) -> FunctionJob:
125+
async def register_function_job(
126+
self, function_job: FunctionJob
127+
) -> RegisteredFunctionJob:
125128
# Mimic registering a function job
126129
uid = uuid4()
127-
self._function_jobs[uid] = TypeAdapter(FunctionJob).validate_python(
130+
self._function_jobs[uid] = TypeAdapter(RegisteredFunctionJob).validate_python(
128131
{
129132
"uid": str(uid),
130133
"function_uid": function_job.function_uid,
@@ -138,7 +141,7 @@ async def register_function_job(self, function_job: FunctionJob) -> FunctionJob:
138141
)
139142
return self._function_jobs[uid]
140143

141-
async def get_function_job(self, function_job_id: str) -> dict:
144+
async def get_function_job(self, function_job_id: str) -> RegisteredFunctionJob:
142145
# Mimic retrieval of a function job based on function_job_id and raise 404 if not found
143146
if function_job_id not in self._function_jobs:
144147
raise HTTPException(status_code=404, detail="Function job not found")
@@ -148,7 +151,7 @@ async def list_function_jobs(
148151
self,
149152
pagination_offset: int,
150153
pagination_limit: int,
151-
) -> tuple[list[FunctionJob], PageMetaInfoLimitOffset]:
154+
) -> tuple[list[RegisteredFunctionJob], PageMetaInfoLimitOffset]:
152155
# Mimic listing all function jobs
153156
function_jobs_list = list(self._function_jobs.values())[
154157
pagination_offset : pagination_offset + pagination_limit
@@ -188,7 +191,7 @@ async def register_function_job_collection(
188191

189192
async def get_function_job_collection(
190193
self, function_job_collection_id: str
191-
) -> dict:
194+
) -> RegisteredFunctionJobCollection:
192195
# Mimic retrieval of a function job collection based on collection_id and raise 404 if not found
193196
if function_job_collection_id not in self._function_job_collections:
194197
raise HTTPException(
@@ -200,7 +203,7 @@ async def list_function_job_collections(
200203
self,
201204
pagination_offset: int,
202205
pagination_limit: int,
203-
) -> tuple[list[FunctionJobCollection], PageMetaInfoLimitOffset]:
206+
) -> tuple[list[RegisteredFunctionJobCollection], PageMetaInfoLimitOffset]:
204207
# Mimic listing all function job collections
205208
function_job_collections_list = list(self._function_job_collections.values())[
206209
pagination_offset : pagination_offset + pagination_limit
@@ -229,7 +232,6 @@ async def delete_function_job_collection(
229232
def test_register_function(api_app) -> None:
230233
client = TestClient(api_app)
231234
sample_function = {
232-
"uid": None,
233235
"title": "test_function",
234236
"function_class": "project",
235237
"project_id": str(uuid4()),
@@ -469,7 +471,6 @@ def test_register_function_job(api_app: FastAPI) -> None:
469471

470472
client = TestClient(api_app)
471473
mock_function_job = {
472-
"uid": None,
473474
"function_uid": str(uuid4()),
474475
"title": "Test Function Job",
475476
"description": "A test function job",

0 commit comments

Comments
 (0)