Skip to content

Commit 5fb1314

Browse files
author
Andrei Neagu
committed
added tests for service details
1 parent c19c878 commit 5fb1314

File tree

5 files changed

+116
-26
lines changed

5 files changed

+116
-26
lines changed

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/api/frontend/routes/_index.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ def _render_service_details(node_id: NodeID, service: TrackedServiceModel) -> No
6464
def _render_buttons(node_id: NodeID, service: TrackedServiceModel) -> None:
6565

6666
with ui.dialog() as confirm_dialog, ui.card():
67-
6867
ui.markdown(f"Stop service **{node_id}**?")
6968
ui.label("The service will be stopped and its data will be saved.")
7069
with ui.row():

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/api/frontend/routes/_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ async def remove_from_tracking():
7171
ui.notify(f"Service {node_id} removed from tracking")
7272
ui.navigate.to("/")
7373

74-
ui.markdown(f"Remove service **{node_id}** form tracker?")
74+
ui.markdown(f"Remove the service **{node_id}** form the tracker?")
7575
ui.label(
7676
"This action will result in the removal of the service form the internal tracker. "
7777
"This action should be used whn you are facing issues and the service is not "
@@ -87,8 +87,8 @@ async def remove_from_tracking():
8787
).classes("text-red-600")
8888

8989
with ui.row():
90-
ui.button("Remove", color="red", on_click=remove_from_tracking)
91-
ui.button("No", on_click=lambda: confirm_dialog.submit("No"))
90+
ui.button("Remove service", color="red", on_click=remove_from_tracking)
91+
ui.button("Cancel", on_click=lambda: confirm_dialog.submit("Cancel"))
9292

9393
async def display_confirm_dialog():
9494
await confirm_dialog

services/dynamic-scheduler/tests/unit/api_frontend/helpers.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
from typing import Final
99
from uuid import uuid4
1010

11+
from models_library.api_schemas_directorv2.dynamic_services import DynamicServiceGet
12+
from models_library.api_schemas_webserver.projects_nodes import NodeGet
1113
from playwright.async_api import Locator, Page
12-
from pydantic import NonNegativeFloat, NonNegativeInt
14+
from pydantic import NonNegativeFloat, NonNegativeInt, TypeAdapter
1315
from tenacity import AsyncRetrying, stop_after_delay, wait_fixed
1416

1517
_HERE: Final[Path] = (
@@ -86,3 +88,17 @@ async def assert_not_contains_text(
8688
with attempt:
8789
locator = async_page.get_by_text(text)
8890
assert await locator.count() < 1, f"found text='{text}' in body"
91+
92+
93+
def get_new_style_service_status(state: str) -> DynamicServiceGet:
94+
return TypeAdapter(DynamicServiceGet).validate_python(
95+
DynamicServiceGet.model_config["json_schema_extra"]["examples"][0]
96+
| {"state": state}
97+
)
98+
99+
100+
def get_legacy_service_status(state: str) -> NodeGet:
101+
return TypeAdapter(NodeGet).validate_python(
102+
NodeGet.model_config["json_schema_extra"]["examples"][0]
103+
| {"service_state": state}
104+
)

services/dynamic-scheduler/tests/unit/api_frontend/test_api_frontend_routes_index.py

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@
77

88
import pytest
99
from fastapi import FastAPI
10-
from helpers import assert_contains_text, assert_not_contains_text, click_on_text
10+
from helpers import (
11+
assert_contains_text,
12+
assert_not_contains_text,
13+
click_on_text,
14+
get_legacy_service_status,
15+
get_new_style_service_status,
16+
)
1117
from models_library.api_schemas_directorv2.dynamic_services import DynamicServiceGet
1218
from models_library.api_schemas_dynamic_scheduler.dynamic_services import (
1319
DynamicServiceStart,
@@ -16,7 +22,6 @@
1622
from models_library.api_schemas_webserver.projects_nodes import NodeGet
1723
from models_library.projects_nodes_io import NodeID
1824
from playwright.async_api import Page
19-
from pydantic import TypeAdapter
2025
from simcore_service_dynamic_scheduler.services.service_tracker import (
2126
set_if_status_changed_for_service,
2227
set_request_as_running,
@@ -34,20 +39,6 @@
3439
]
3540

3641

37-
def _get_new_style_service_status(state: str) -> DynamicServiceGet:
38-
return TypeAdapter(DynamicServiceGet).validate_python(
39-
DynamicServiceGet.model_config["json_schema_extra"]["examples"][0]
40-
| {"state": state}
41-
)
42-
43-
44-
def _get_legacy_service_status(state: str) -> NodeGet:
45-
return TypeAdapter(NodeGet).validate_python(
46-
NodeGet.model_config["json_schema_extra"]["examples"][0]
47-
| {"service_state": state}
48-
)
49-
50-
5142
async def test_index_with_elements(
5243
app_runner: None,
5344
async_page: Page,
@@ -60,10 +51,7 @@ async def test_index_with_elements(
6051

6152
# 1. no content
6253
await assert_contains_text(async_page, "Total tracked services:")
63-
6454
await assert_contains_text(async_page, "0")
65-
reference = async_page.get_by_text("0")
66-
assert await reference.text_content() == "0"
6755
await assert_not_contains_text(async_page, "Details")
6856

6957
# 2. add elements and check
@@ -79,8 +67,8 @@ async def test_index_with_elements(
7967
@pytest.mark.parametrize(
8068
"service_status",
8169
[
82-
_get_new_style_service_status("running"),
83-
_get_legacy_service_status("running"),
70+
get_new_style_service_status("running"),
71+
get_legacy_service_status("running"),
8472
],
8573
)
8674
async def test_main_page(
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# pylint:disable=redefined-outer-name
2+
# pylint:disable=unused-argument
3+
4+
from collections.abc import Callable
5+
from unittest.mock import AsyncMock
6+
7+
import pytest
8+
from fastapi import FastAPI
9+
from helpers import (
10+
assert_contains_text,
11+
click_on_text,
12+
get_legacy_service_status,
13+
get_new_style_service_status,
14+
)
15+
from models_library.api_schemas_directorv2.dynamic_services import DynamicServiceGet
16+
from models_library.api_schemas_dynamic_scheduler.dynamic_services import (
17+
DynamicServiceStart,
18+
)
19+
from models_library.api_schemas_webserver.projects_nodes import NodeGet
20+
from models_library.projects_nodes_io import NodeID
21+
from playwright.async_api import Page
22+
from simcore_service_dynamic_scheduler.services.service_tracker import (
23+
set_if_status_changed_for_service,
24+
set_request_as_running,
25+
)
26+
from tenacity import AsyncRetrying, stop_after_delay, wait_fixed
27+
28+
pytest_simcore_core_services_selection = [
29+
"rabbit",
30+
"redis",
31+
]
32+
33+
pytest_simcore_ops_services_selection = [
34+
# "redis-commander",
35+
]
36+
37+
38+
@pytest.mark.parametrize(
39+
"service_status",
40+
[
41+
get_new_style_service_status("running"),
42+
get_legacy_service_status("running"),
43+
],
44+
)
45+
async def test_service_details(
46+
app_runner: None,
47+
async_page: Page,
48+
server_host_port: str,
49+
node_id: NodeID,
50+
not_initialized_app: FastAPI,
51+
get_dynamic_service_start: Callable[[NodeID], DynamicServiceStart],
52+
mock_remove_tracked_service: AsyncMock,
53+
service_status: NodeGet | DynamicServiceGet,
54+
):
55+
await set_request_as_running(
56+
not_initialized_app, get_dynamic_service_start(node_id)
57+
)
58+
await set_request_as_running(
59+
not_initialized_app, get_dynamic_service_start(node_id)
60+
)
61+
await set_if_status_changed_for_service(
62+
not_initialized_app, node_id, service_status
63+
)
64+
65+
await async_page.goto(server_host_port)
66+
67+
# 1. one service is tracked
68+
await assert_contains_text(async_page, "Total tracked services:")
69+
await assert_contains_text(async_page, "1")
70+
await assert_contains_text(async_page, "Details", instances=1)
71+
72+
# 2. open details page
73+
await click_on_text(async_page, "Details")
74+
75+
# 3. click "Remove from tracking" -> cancel
76+
await click_on_text(async_page, "Remove from tracking")
77+
await click_on_text(async_page, "Cancel")
78+
mock_remove_tracked_service.assert_not_awaited()
79+
80+
# 4. click "Remove from tracking" -> confirm
81+
await click_on_text(async_page, "Remove from tracking")
82+
await click_on_text(async_page, "Remove service")
83+
async for attempt in AsyncRetrying(
84+
reraise=True, wait=wait_fixed(0.1), stop=stop_after_delay(3)
85+
):
86+
with attempt:
87+
mock_remove_tracked_service.assert_awaited_once()

0 commit comments

Comments
 (0)