Skip to content

Commit fa8af58

Browse files
committed
tests api-health
1 parent 89d6391 commit fa8af58

File tree

3 files changed

+45
-19
lines changed

3 files changed

+45
-19
lines changed

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ async def check_service_health():
2323
return f"{__name__}@{datetime.datetime.now(tz=datetime.timezone.utc).isoformat()}"
2424

2525

26-
@router.get("/state", include_in_schema=False)
26+
@router.get(
27+
"/state",
28+
include_in_schema=False,
29+
response_model=AppStatusCheck,
30+
response_model_exclude_unset=True,
31+
)
2732
async def get_service_state(
2833
catalog_client: Annotated[CatalogApi, Depends(get_api_client(CatalogApi))],
2934
director2_api: Annotated[DirectorV2Api, Depends(get_api_client(DirectorV2Api))],
@@ -42,18 +47,14 @@ async def get_service_state(
4247
return_exceptions=False,
4348
)
4449

45-
current_status = AppStatusCheck(
50+
return AppStatusCheck(
4651
app_name=PROJECT_NAME,
4752
version=API_VERSION,
4853
services={
4954
api.service_name: {
5055
"healthy": bool(is_healty),
51-
"url": str(api.client.base_url) + api.health_check_path.lstrip("/"),
5256
}
5357
for api, is_healty in zip(apis, healths, strict=True)
5458
},
5559
url=url_for("get_service_state"),
5660
)
57-
resp = current_status.dict(exclude_unset=True)
58-
resp.update(docs_dev_url=url_for("swagger_ui_html"))
59-
return resp

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,18 +211,27 @@ def mocked_directorv2_service_api_base(
211211

212212
# pylint: disable=not-context-manager
213213
with respx.mock(
214-
base_url=settings.API_SERVER_DIRECTOR_V2.api_base_url,
214+
base_url=settings.API_SERVER_DIRECTOR_V2.base_url,
215215
assert_all_called=False,
216216
assert_all_mocked=True, # IMPORTANT: KEEP always True!
217217
) as respx_mock:
218+
218219
assert openapi
220+
assert (
221+
openapi["paths"]["/"]["get"]["operationId"] == "check_service_health__get"
222+
)
223+
224+
respx_mock.get(path="/", name="check_service_health__get").respond(
225+
status.HTTP_200_OK,
226+
json=openapi["components"]["schemas"]["HealthCheckGet"]["example"],
227+
)
219228

220229
yield respx_mock
221230

222231

223232
@pytest.fixture
224233
def mocked_webserver_service_api_base(
225-
app: FastAPI, storage_service_openapi_specs: dict[str, Any]
234+
app: FastAPI, webserver_service_openapi_specs: dict[str, Any]
226235
) -> Iterator[MockRouter]:
227236
"""
228237
Creates a respx.mock to capture calls to webserver API
@@ -232,7 +241,7 @@ def mocked_webserver_service_api_base(
232241
settings: ApplicationSettings = app.state.settings
233242
assert settings.API_SERVER_WEBSERVER
234243

235-
openapi = deepcopy(storage_service_openapi_specs)
244+
openapi = deepcopy(webserver_service_openapi_specs)
236245
assert Version(openapi["info"]["version"]).major == 0
237246

238247
# pylint: disable=not-context-manager
@@ -251,10 +260,10 @@ def mocked_webserver_service_api_base(
251260
]["schema"]["properties"]["data"]["example"]
252261
}
253262

254-
respx_mock.get(path="/v0/", name="healthcheck_readiness_probe").respond(
263+
respx_mock.get(path="/", name="healthcheck_readiness_probe").respond(
255264
status.HTTP_200_OK, json=response_body
256265
)
257-
respx_mock.get(path="/v0/health", name="healthcheck_liveness_probe").respond(
266+
respx_mock.get(path="/health", name="healthcheck_liveness_probe").respond(
258267
status.HTTP_200_OK, json=response_body
259268
)
260269

@@ -328,6 +337,12 @@ def mocked_catalog_service_api_base(
328337
assert_all_called=False,
329338
assert_all_mocked=True,
330339
) as respx_mock:
331-
respx_mock.get("/v0/meta").respond(200, json=schemas["Meta"]["example"])
340+
respx_mock.get("/v0/").respond(
341+
status.HTTP_200_OK,
342+
text="simcore_service_catalog.api.routes.health@2023-07-03T12:59:12.024551+00:00",
343+
)
344+
respx_mock.get("/v0/meta").respond(
345+
status.HTTP_200_OK, json=schemas["Meta"]["example"]
346+
)
332347

333348
yield respx_mock

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from models_library.app_diagnostics import AppStatusCheck
1111
from pydantic import parse_obj_as
1212
from respx import MockRouter
13-
from simcore_service_api_server._meta import API_VERSION, API_VTAG
13+
from simcore_service_api_server._meta import API_VTAG
1414

1515

1616
async def test_check_service_health(client: AsyncClient):
@@ -21,14 +21,24 @@ async def test_check_service_health(client: AsyncClient):
2121

2222
async def test_get_service_state(
2323
client: AsyncClient,
24-
mocked_directorv2_service_api_base: MockRouter,
25-
mocked_webserver_service_api_base: MockRouter,
2624
mocked_catalog_service_api_base: MockRouter,
25+
mocked_directorv2_service_api_base: MockRouter,
2726
mocked_storage_service_api_base: MockRouter,
27+
mocked_webserver_service_api_base: MockRouter,
2828
):
29-
response = await client.get(f"{API_VTAG}/meta")
29+
response = await client.get(f"{API_VTAG}/state")
3030
assert response.status_code == status.HTTP_200_OK
3131

32-
app_status_check = parse_obj_as(AppStatusCheck, response.json())
33-
print(app_status_check.json(indent=1))
34-
assert app_status_check.version == API_VERSION
32+
assert response.json() == {
33+
"app_name": "simcore-service-api-server",
34+
"version": "0.4.5",
35+
"services": {
36+
"catalog": {"healthy": True},
37+
"director_v2": {"healthy": True},
38+
"storage": {"healthy": True},
39+
"webserver": {"healthy": True},
40+
},
41+
"url": "http://api.testserver.io/state",
42+
}
43+
44+
assert parse_obj_as(AppStatusCheck, response.json())

0 commit comments

Comments
 (0)