Skip to content

Commit c1b6eac

Browse files
committed
drafting tests
1 parent a51a39e commit c1b6eac

File tree

3 files changed

+134
-0
lines changed

3 files changed

+134
-0
lines changed

services/api-server/tests/unit/service/conftest.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from pytest_mock import MockerFixture, MockType
1010
from simcore_service_api_server._service_jobs import JobService
1111
from simcore_service_api_server._service_solvers import SolverService
12+
from simcore_service_api_server._service_studies import StudyService
1213
from simcore_service_api_server.services_rpc.catalog import CatalogService
1314
from simcore_service_api_server.services_rpc.wb_api_server import WbApiRpcClient
1415

@@ -43,3 +44,11 @@ def solver_service(
4344
job_service: JobService,
4445
) -> SolverService:
4546
return SolverService(catalog_service=catalog_service, job_service=job_service)
47+
48+
49+
@pytest.fixture
50+
def study_service(
51+
job_service: JobService,
52+
) -> StudyService:
53+
54+
return StudyService(job_service=job_service)
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# pylint: disable=protected-access
2+
# pylint: disable=redefined-outer-name
3+
# pylint: disable=unused-argument
4+
# pylint: disable=unused-variable
5+
6+
7+
from models_library.products import ProductName
8+
from models_library.users import UserID
9+
from pytest_mock import MockType
10+
from simcore_service_api_server._service_jobs import JobService
11+
from simcore_service_api_server.models.schemas.jobs import Job, JobInputs
12+
from simcore_service_api_server.models.schemas.solvers import Solver
13+
14+
15+
async def test_list_jobs_by_resource_prefix(
16+
job_service: JobService,
17+
mocked_webserver_rpc_api: dict[str, MockType],
18+
):
19+
# Test with default pagination parameters
20+
jobs, page_meta = await job_service.list_jobs_by_resource_prefix(
21+
job_parent_resource_name_prefix="solvers/some-solver"
22+
)
23+
24+
assert isinstance(jobs, list)
25+
mocked_webserver_rpc_api["list_projects_marked_as_jobs"].assert_called_once()
26+
27+
# Check pagination info
28+
assert page_meta.total >= 0
29+
assert page_meta.limit > 0
30+
assert page_meta.offset == 0
31+
32+
33+
async def test_create_job(
34+
job_service: JobService,
35+
mocked_webserver_rest_api_base: dict[str, MockType],
36+
mocked_webserver_rpc_api: dict[str, MockType],
37+
product_name: ProductName,
38+
user_id: UserID,
39+
):
40+
# Create mock solver and inputs
41+
solver = Solver(
42+
id="simcore/services/comp/test-solver",
43+
version="1.0.0",
44+
title="Test Solver",
45+
maintainer="[email protected]",
46+
description="Test solver for testing",
47+
)
48+
49+
inputs = JobInputs(items={})
50+
51+
# Mock URL generator
52+
def mock_url_for(*args, **kwargs):
53+
return "https://example.com/api/v1/jobs/test-job"
54+
55+
# Test job creation
56+
job, project = await job_service.create_job(
57+
solver_or_program=solver,
58+
inputs=inputs,
59+
parent_project_uuid=None,
60+
parent_node_id=None,
61+
url_for=mock_url_for,
62+
hidden=False,
63+
project_name="Test Job Project",
64+
description="Test description",
65+
)
66+
67+
# Verify job and project creation
68+
assert isinstance(job, Job)
69+
assert job.id == project.uuid
70+
assert "test-solver" in job.name
71+
72+
# Verify API calls
73+
mocked_webserver_rest_api_base["create_project"].assert_called_once()
74+
mocked_webserver_rpc_api["mark_project_as_job"].assert_called_once()
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# pylint: disable=protected-access
2+
# pylint: disable=redefined-outer-name
3+
# pylint: disable=unused-argument
4+
# pylint: disable=unused-variable
5+
6+
from pytest_mock import MockType
7+
from simcore_service_api_server._service_studies import StudyService
8+
from simcore_service_api_server.models.schemas.studies import StudyID
9+
10+
11+
async def test_list_jobs_no_study_id(
12+
study_service: StudyService,
13+
mocked_webserver_rpc_api: dict[str, MockType],
14+
):
15+
# Test with default parameters
16+
jobs, page_meta = await study_service.list_jobs()
17+
18+
assert isinstance(jobs, list)
19+
mocked_webserver_rpc_api["list_projects_marked_as_jobs"].assert_called_once()
20+
21+
# Check pagination info
22+
assert page_meta.total >= 0
23+
assert page_meta.limit > 0
24+
assert page_meta.offset == 0
25+
26+
# Verify proper prefix was used
27+
call_kwargs = mocked_webserver_rpc_api[
28+
"list_projects_marked_as_jobs"
29+
].call_args.kwargs
30+
assert call_kwargs["job_parent_resource_name_prefix"] == "study"
31+
32+
33+
async def test_list_jobs_with_study_id(
34+
study_service: StudyService,
35+
mocked_webserver_rpc_api: dict[str, MockType],
36+
):
37+
# Test with a specific study ID
38+
study_id = StudyID("test-study-id")
39+
jobs, page_meta = await study_service.list_jobs(study_id=study_id)
40+
41+
assert isinstance(jobs, list)
42+
43+
# Verify proper prefix was used with study ID
44+
call_kwargs = mocked_webserver_rpc_api[
45+
"list_projects_marked_as_jobs"
46+
].call_args.kwargs
47+
assert call_kwargs["job_parent_resource_name_prefix"] == f"study/{study_id}"
48+
49+
# Check pagination parameters were passed correctly
50+
assert call_kwargs["offset"] == 0
51+
assert call_kwargs["limit"] > 0

0 commit comments

Comments
 (0)