Skip to content

Commit 265efa6

Browse files
committed
✨ Refactor dependency injection in SolverService and add mocked_app_dependencies fixture for improved testability and clarity
1 parent 1c317ac commit 265efa6

File tree

5 files changed

+43
-16
lines changed

5 files changed

+43
-16
lines changed

services/api-server/src/simcore_service_api_server/_service_solvers.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
from typing import Annotated
2-
31
from common_library.pagination_tools import iter_pagination_params
4-
from fastapi import Depends
52
from models_library.basic_types import VersionStr
63
from models_library.products import ProductName
74
from models_library.projects_nodes import Node
@@ -16,7 +13,6 @@
1613
from models_library.users import UserID
1714
from packaging.version import Version
1815

19-
from .api.dependencies.webserver_rpc import get_wb_api_rpc_client
2016
from .models.api_resources import compose_resource_name
2117
from .models.schemas.jobs import Job, JobInputs
2218
from .models.schemas.solvers import Solver, SolverKeyId
@@ -35,8 +31,8 @@ class SolverService:
3531

3632
def __init__(
3733
self,
38-
catalog_service: Annotated[CatalogService, Depends()],
39-
webserver_client: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
34+
catalog_service: CatalogService,
35+
webserver_client: WbApiRpcClient,
4036
):
4137
self._catalog_service = catalog_service
4238
self._webserver_client = webserver_client

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from ...services_http.catalog import CatalogApi
1818
from ..dependencies.application import get_reverse_url_mapper
1919
from ..dependencies.authentication import get_current_user_id, get_product_name
20-
from ..dependencies.services import get_api_client
20+
from ..dependencies.services import get_api_client, get_solver_service
2121
from ..dependencies.webserver_http import AuthSession, get_webserver_session
2222
from ._common import API_SERVER_DEV_FEATURES_ENABLED
2323
from ._constants import (
@@ -153,7 +153,7 @@ async def get_solvers_releases_page(
153153
async def get_solver(
154154
solver_key: SolverKeyId,
155155
user_id: Annotated[int, Depends(get_current_user_id)],
156-
solver_service: Annotated[SolverService, Depends(SolverService)],
156+
solver_service: Annotated[SolverService, Depends(get_solver_service)],
157157
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
158158
product_name: Annotated[str, Depends(get_product_name)],
159159
):
@@ -232,10 +232,10 @@ async def get_solver_release(
232232
solver_key: SolverKeyId,
233233
version: VersionStr,
234234
user_id: Annotated[int, Depends(get_current_user_id)],
235-
solver_service: Annotated[SolverService, Depends(SolverService)],
235+
solver_service: Annotated[SolverService, Depends(get_solver_service)],
236236
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
237237
product_name: Annotated[str, Depends(get_product_name)],
238-
) -> Solver:
238+
):
239239
"""Gets a specific release of a solver"""
240240
try:
241241
solver: Solver = await solver_service.get_solver(

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from ...services_rpc.wb_api_server import WbApiRpcClient
3636
from ..dependencies.application import get_reverse_url_mapper
3737
from ..dependencies.authentication import get_current_user_id, get_product_name
38-
from ..dependencies.services import get_api_client
38+
from ..dependencies.services import get_api_client, get_solver_service
3939
from ..dependencies.webserver_http import AuthSession, get_webserver_session
4040
from ..dependencies.webserver_rpc import (
4141
get_wb_api_rpc_client,
@@ -95,7 +95,7 @@ async def create_solver_job(
9595
version: VersionStr,
9696
inputs: JobInputs,
9797
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
98-
solver_service: Annotated[SolverService, Depends()],
98+
solver_service: Annotated[SolverService, Depends(get_solver_service)],
9999
job_service: Annotated[JobService, Depends()],
100100
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
101101
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],

services/api-server/tests/unit/_with_db/test_product.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ async def test_product_webserver(
3333
assert client
3434

3535
wallet_to_api_keys_map: dict[int, ApiKeyInDB] = {}
36-
wallet_id: int = faker.pyint(min_value=1)
36+
wid: int = faker.pyint(min_value=1)
3737
async for api_key in create_fake_api_keys(2):
38-
wallet_id += faker.pyint(min_value=1)
39-
wallet_to_api_keys_map[wallet_id] = api_key
38+
wid += faker.pyint(min_value=1)
39+
wallet_to_api_keys_map[wid] = api_key
4040

4141
def _check_key_product_compatibility(request: httpx.Request, **kwargs):
4242
assert (

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

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,38 @@ def mocked_catalog_rest_api_base(
458458

459459

460460
@pytest.fixture
461-
def mocked_catalog_rpc_api(mocker: MockerFixture) -> dict[str, MockType]:
461+
def mocked_app_dependencies(app: FastAPI, mocker: MockerFixture) -> Iterator[None]:
462+
"""
463+
Mocks some dependency overrides for the FastAPI app.
464+
"""
465+
from simcore_service_api_server.api.dependencies.rabbitmq import (
466+
get_rabbitmq_rpc_client,
467+
)
468+
from simcore_service_api_server.api.dependencies.webserver_rpc import (
469+
get_wb_api_rpc_client,
470+
)
471+
472+
def _get_rabbitmq_rpc_client_override(app: FastAPI):
473+
return mocker.MagicMock()
474+
475+
async def _get_wb_api_rpc_client_override(app: FastAPI):
476+
return mocker.MagicMock()
477+
478+
app.dependency_overrides[get_rabbitmq_rpc_client] = (
479+
_get_rabbitmq_rpc_client_override
480+
)
481+
app.dependency_overrides[get_wb_api_rpc_client] = _get_wb_api_rpc_client_override
482+
483+
yield
484+
485+
app.dependency_overrides.pop(get_wb_api_rpc_client, None)
486+
app.dependency_overrides.pop(get_rabbitmq_rpc_client, None)
487+
488+
489+
@pytest.fixture
490+
def mocked_catalog_rpc_api(
491+
mocked_app_dependencies: None, mocker: MockerFixture
492+
) -> dict[str, MockType]:
462493
"""
463494
Mocks the catalog's simcore service RPC API for testing purposes.
464495
"""

0 commit comments

Comments
 (0)