Skip to content

Commit eec071f

Browse files
committed
refactor
1 parent e6bf689 commit eec071f

File tree

2 files changed

+72
-94
lines changed

2 files changed

+72
-94
lines changed
Lines changed: 40 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,20 @@
11
from dataclasses import dataclass
22

3-
from models_library.basic_types import VersionStr
43
from models_library.products import ProductName
54
from models_library.rest_pagination import (
65
DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
76
PageLimitInt,
87
PageMetaInfoLimitOffset,
98
PageOffsetInt,
109
)
10+
from models_library.services_history import ServiceRelease
11+
from models_library.services_types import ServiceKey, ServiceVersion
1112
from models_library.users import UserID
13+
from pytest_simcore.helpers.catalog_rpc_server import LatestServiceGet, ServiceGetV2
1214
from servicelib.fastapi.app_state import SingletonInAppStateMixin
1315
from servicelib.rabbitmq import RabbitMQRPCClient
1416
from servicelib.rabbitmq.rpc_interfaces.catalog import services as catalog_rpc
1517

16-
from ..models.schemas.solvers import Solver, SolverKeyId, SolverPort
17-
18-
_FAKE: list[Solver] = [
19-
Solver.model_validate(Solver.model_json_schema()["example"]),
20-
]
21-
_FAKE2: list[SolverPort] = [
22-
SolverPort.model_validate(SolverPort.model_json_schema()["example"]),
23-
]
24-
# from models_library.api_schemas_catalog.services import (
25-
# LatestServiceGet,
26-
# MyServiceGet,
27-
# ServiceGetV2,
28-
# ServiceUpdateV2,
29-
# )
30-
31-
assert catalog_rpc # nosec
32-
3318

3419
@dataclass
3520
class CatalogService(SingletonInAppStateMixin):
@@ -43,81 +28,62 @@ async def list_latest_releases(
4328
user_id: UserID,
4429
offset: PageOffsetInt = 0,
4530
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
46-
) -> tuple[list[Solver], PageMetaInfoLimitOffset]:
47-
assert product_name # nosec
48-
assert user_id # nosec
31+
) -> tuple[list[LatestServiceGet], PageMetaInfoLimitOffset]:
4932

50-
data = _FAKE[offset : offset + limit]
33+
page = await catalog_rpc.list_services_paginated(
34+
self._client,
35+
product_name=product_name,
36+
user_id=user_id,
37+
offset=offset,
38+
limit=limit,
39+
)
5140
meta = PageMetaInfoLimitOffset(
52-
limit=limit, offset=offset, total=len(_FAKE), count=len(data)
41+
limit=page.meta.limit,
42+
offset=page.meta.offset,
43+
total=page.meta.total,
44+
count=page.meta.count,
5345
)
54-
return data, meta
46+
return page.data, meta
5547

56-
async def list_solver_releases(
48+
async def list_release_history(
5749
self,
5850
*,
5951
product_name: ProductName,
6052
user_id: UserID,
61-
solver_id: SolverKeyId,
53+
service_key: ServiceKey,
6254
offset: PageOffsetInt = 0,
6355
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
64-
) -> tuple[list[Solver], PageMetaInfoLimitOffset]:
65-
assert product_name # nosec
66-
assert user_id # nosec
67-
68-
data = [solver for solver in _FAKE if solver.id == solver_id][
69-
offset : offset + limit
70-
]
56+
) -> tuple[list[ServiceRelease], PageMetaInfoLimitOffset]:
7157

58+
data = await catalog_rpc.get_my_service_history(
59+
self._client,
60+
product_name=product_name,
61+
user_id=user_id,
62+
service_key=service_key,
63+
# TODO: offset=offset,
64+
# TODO: limit=limit,
65+
)
7266
meta = PageMetaInfoLimitOffset(
73-
limit=limit, offset=offset, total=len(_FAKE), count=len(data)
67+
limit=limit,
68+
offset=offset,
69+
total=len(data),
70+
count=len(data),
7471
)
7572
return data, meta
7673

77-
async def get_solver(
74+
async def get(
7875
self,
7976
*,
8077
product_name: ProductName,
8178
user_id: UserID,
82-
solver_id: SolverKeyId,
83-
solver_version: VersionStr,
84-
) -> Solver | None:
85-
assert product_name # nosec
86-
assert user_id # nosec
87-
88-
# service: ServiceGetV2 = await catalog_rpc.get_service(
89-
# get_rabbitmq_rpc_client(app),
90-
# product_name=product_name,
91-
# user_id=user_id,
92-
# service_key=solver_id,
93-
# service_version=solver_version,
94-
# )
95-
96-
# solver = Solver(id=service.key, version=service.version, title=) ServiceGetV2)(service)
97-
98-
return next(
99-
(
100-
solver
101-
for solver in _FAKE
102-
if solver.id == solver_id and solver.version == solver_version
103-
),
104-
None,
105-
)
79+
service_key: ServiceKey,
80+
service_version: ServiceVersion,
81+
) -> ServiceGetV2:
10682

107-
async def get_solver_ports(
108-
self,
109-
*,
110-
product_name: ProductName,
111-
user_id: int,
112-
solver_id: SolverKeyId,
113-
solver_version: VersionStr,
114-
) -> list[SolverPort]:
115-
116-
if await self.get_solver(
83+
return await catalog_rpc.get_service(
84+
self._client,
11785
product_name=product_name,
11886
user_id=user_id,
119-
solver_id=solver_id,
120-
solver_version=solver_version,
121-
):
122-
return _FAKE2
123-
return []
87+
service_key=service_key,
88+
service_version=service_version,
89+
)

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

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66

77
import pytest
88
from fastapi import FastAPI
9+
from models_library.api_schemas_catalog.services import LatestServiceGet, ServiceGetV2
910
from models_library.products import ProductName
11+
from models_library.services_history import ServiceRelease
1012
from models_library.users import UserID
13+
from pydantic import HttpUrl
1114
from pytest_mock import MockerFixture, MockType
1215
from pytest_simcore.helpers.catalog_rpc_server import CatalogRpcSideEffects
13-
from simcore_service_api_server.models.schemas.solvers import Solver, SolverPort
16+
from simcore_service_api_server.models.schemas.solvers import Solver
1417
from simcore_service_api_server.services_rpc.catalog import CatalogService, catalog_rpc
1518

1619

@@ -46,48 +49,57 @@ def mocked_rpc_catalog_service_api(mocker: MockerFixture) -> dict[str, MockType]
4649
}
4750

4851

52+
def to_solver(
53+
service: LatestServiceGet | ServiceGetV2, href_self: HttpUrl | None = None
54+
) -> Solver:
55+
# NOTE: this is an adapter around models on CatalogService interface
56+
return Solver(
57+
id=service.key,
58+
version=service.version,
59+
title=service.name,
60+
maintainer=service.owner or service.contact or "UNKNOWN",
61+
url=href_self,
62+
description=service.description,
63+
)
64+
65+
4966
async def test_catalog_service_read_solvers(
5067
product_name: ProductName,
5168
user_id: UserID,
5269
mocker: MockerFixture,
5370
mocked_rpc_catalog_service_api: dict[str, MockType],
5471
):
55-
5672
catalog_service = CatalogService(_client=mocker.MagicMock())
5773
catalog_service.set_to_app_state(app=FastAPI())
5874

5975
# Step 1: List latest releases in a page
60-
solver_releases_page, meta = await catalog_service.list_latest_releases(
76+
latest_releases, meta = await catalog_service.list_latest_releases(
6177
product_name=product_name, user_id=user_id
6278
)
79+
solver_releases_page = [to_solver(srv) for srv in latest_releases]
80+
6381
assert solver_releases_page, "Releases page should not be empty"
6482
assert meta.offset == 0
6583

6684
# Step 2: Select one release and list solver releases
67-
selected_release = solver_releases_page[0]
68-
solver_releases, meta = await catalog_service.list_solver_releases(
85+
selected_solver = solver_releases_page[0]
86+
releases, meta = await catalog_service.list_release_history(
6987
product_name=product_name,
7088
user_id=user_id,
71-
solver_id=selected_release.id,
89+
service_key=selected_solver.id,
7290
)
73-
assert solver_releases, "Solver releases should not be empty"
91+
assert releases, "Solver releases should not be empty"
7492
assert meta.offset == 0
7593

7694
# Step 3: Take the latest solver release and get solver details
77-
latest_solver_release = solver_releases[0]
78-
solver_details: Solver | None = await catalog_service.get_solver(
79-
product_name=product_name,
80-
user_id=user_id,
81-
solver_id=latest_solver_release.id,
82-
solver_version=latest_solver_release.version,
83-
)
84-
assert solver_details, "Solver details should not be empty"
95+
oldest_release: ServiceRelease = releases[-1]
8596

86-
# Step 4: Get solver ports
87-
solver_ports: list[SolverPort] = await catalog_service.get_solver_ports(
97+
service: ServiceGetV2 = await catalog_service.get(
8898
product_name=product_name,
8999
user_id=user_id,
90-
solver_id=latest_solver_release.id,
91-
solver_version=latest_solver_release.version,
100+
service_key=selected_solver.id,
101+
service_version=oldest_release.version,
92102
)
93-
assert solver_ports, "Solver ports should not be empty"
103+
solver = to_solver(service)
104+
assert solver.id == selected_solver.id
105+
assert solver.version == oldest_release.version

0 commit comments

Comments
 (0)