Skip to content

Commit 992ef20

Browse files
committed
split tests
1 parent 395d2a3 commit 992ef20

File tree

3 files changed

+124
-91
lines changed

3 files changed

+124
-91
lines changed

services/web/server/tests/unit/with_dbs/04/garbage_collector/conftest.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,36 @@
1+
# pylint: disable=redefined-outer-name
2+
# pylint: disable=too-many-arguments
3+
# pylint: disable=too-many-positional-arguments
4+
# pylint: disable=unused-argument
5+
# pylint: disable=unused-variable
6+
import asyncio
7+
from collections.abc import AsyncIterator, Awaitable, Callable
8+
19
import pytest
10+
import sqlalchemy as sa
11+
from aiohttp.test_utils import TestClient
12+
from models_library.projects import ProjectID
13+
from pytest_simcore.helpers.assert_checks import assert_status
14+
from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict
15+
from pytest_simcore.helpers.typing_env import EnvVarsDict
16+
from redis.asyncio import Redis
17+
from servicelib.aiohttp import status
18+
from servicelib.aiohttp.application import create_safe_application
19+
from servicelib.aiohttp.application_setup import is_setup_completed
20+
from simcore_service_webserver.application_settings import setup_settings
21+
from simcore_service_webserver.db.plugin import setup_db
22+
from simcore_service_webserver.director_v2.plugin import setup_director_v2
23+
from simcore_service_webserver.login.plugin import setup_login
24+
from simcore_service_webserver.notifications.plugin import setup_notifications
25+
from simcore_service_webserver.products.plugin import setup_products
26+
from simcore_service_webserver.projects.plugin import setup_projects
27+
from simcore_service_webserver.rabbitmq import setup_rabbitmq
28+
from simcore_service_webserver.resource_manager.plugin import setup_resource_manager
29+
from simcore_service_webserver.rest.plugin import setup_rest
30+
from simcore_service_webserver.security.plugin import setup_security
31+
from simcore_service_webserver.session.plugin import setup_session
32+
from simcore_service_webserver.socketio.plugin import setup_socketio
33+
from simcore_service_webserver.users.plugin import setup_users
234

335

436
@pytest.fixture(scope="session")
@@ -30,3 +62,82 @@ def app_environment(
3062
"GARBAGE_COLLECTOR_INTERVAL_S": "30",
3163
},
3264
)
65+
66+
67+
@pytest.fixture
68+
async def client(
69+
aiohttp_client: Callable,
70+
app_environment: EnvVarsDict,
71+
postgres_db: sa.engine.Engine,
72+
mock_orphaned_services,
73+
redis_client: Redis,
74+
mock_dynamic_scheduler_rabbitmq: None,
75+
) -> TestClient:
76+
app = create_safe_application()
77+
78+
assert "WEBSERVER_GARBAGE_COLLECTOR" not in app_environment
79+
80+
settings = setup_settings(app)
81+
assert settings.WEBSERVER_GARBAGE_COLLECTOR is not None
82+
assert settings.WEBSERVER_PROJECTS is not None
83+
84+
setup_db(app)
85+
setup_session(app)
86+
setup_security(app)
87+
setup_rest(app)
88+
setup_login(app)
89+
setup_users(app)
90+
setup_socketio(app)
91+
assert setup_projects(app)
92+
setup_director_v2(app)
93+
assert setup_resource_manager(app)
94+
setup_rabbitmq(app)
95+
setup_notifications(app)
96+
setup_products(app)
97+
98+
assert is_setup_completed("simcore_service_webserver.resource_manager", app)
99+
100+
# NOTE: garbage_collector is disabled and instead explicitly called using
101+
# garbage_collectorgc_core.collect_garbage
102+
assert not is_setup_completed("simcore_service_webserver.garbage_collector", app)
103+
104+
return await aiohttp_client(app)
105+
106+
107+
@pytest.fixture
108+
async def close_project() -> Callable[[TestClient, ProjectID, str], Awaitable[None]]:
109+
"""Closes a project by sending a request to the close_project endpoint."""
110+
111+
async def _close_project(
112+
client: TestClient, project_uuid: ProjectID, client_session_id: str
113+
) -> None:
114+
url = client.app.router["close_project"].url_for(project_id=f"{project_uuid}")
115+
resp = await client.post(url, json=client_session_id)
116+
await assert_status(resp, status.HTTP_204_NO_CONTENT)
117+
118+
return _close_project
119+
120+
121+
@pytest.fixture
122+
async def open_project(
123+
close_project: Callable[[TestClient, ProjectID, str], Awaitable[None]],
124+
) -> AsyncIterator[Callable[[TestClient, ProjectID, str], Awaitable[None]]]:
125+
_opened_projects: list[tuple[TestClient, ProjectID, str]] = []
126+
127+
async def _open_project(
128+
client: TestClient, project_uuid: ProjectID, client_session_id: str
129+
) -> None:
130+
url = client.app.router["open_project"].url_for(project_id=f"{project_uuid}")
131+
resp = await client.post(url, json=client_session_id)
132+
await assert_status(resp, status.HTTP_200_OK)
133+
_opened_projects.append((client, project_uuid, client_session_id))
134+
135+
yield _open_project
136+
# cleanup, if we cannot close that is because the user_role might not allow it
137+
await asyncio.gather(
138+
*(
139+
close_project(client, project_uuid, client_session_id)
140+
for client, project_uuid, client_session_id in _opened_projects
141+
),
142+
return_exceptions=True,
143+
)

services/web/server/tests/unit/with_dbs/04/garbage_collector/test_garbage_collector.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# pylint: disable=redefined-outer-name
2+
# pylint: disable=too-many-arguments
3+
# pylint: disable=too-many-positional-arguments
4+
# pylint: disable=unused-argument
5+
# pylint: disable=unused-variable
6+
17
import asyncio
28
from collections.abc import Awaitable, Callable
39
from typing import Any
@@ -13,6 +19,7 @@
1319
from models_library.api_schemas_dynamic_scheduler.dynamic_services import (
1420
DynamicServiceStop,
1521
)
22+
from models_library.projects import ProjectID
1623
from pytest_mock import MockerFixture
1724
from pytest_simcore.helpers.assert_checks import assert_status
1825
from pytest_simcore.helpers.webserver_parametrizations import MockedStorageSubsystem
@@ -368,7 +375,8 @@ async def test_services_remain_after_closing_one_out_of_two_tabs(
368375
create_socketio_connection: Callable,
369376
client_session_id_factory: Callable[[], str],
370377
expected_save_state: bool,
371-
open_project: Callable,
378+
open_project: Callable[[TestClient, ProjectID, str], Awaitable[None]],
379+
close_project: Callable[[TestClient, ProjectID, str], Awaitable[None]],
372380
):
373381
# create server with delay set to DELAY
374382
service = await create_dynamic_service_mock(
@@ -414,6 +422,7 @@ async def test_services_remain_after_closing_one_out_of_two_tabs(
414422
],
415423
)
416424
async def test_websocket_disconnected_remove_or_maintain_files_based_on_role(
425+
fast_service_deletion_delay: int,
417426
director_v2_service_mock: aioresponses,
418427
client,
419428
logged_user,
@@ -426,7 +435,7 @@ async def test_websocket_disconnected_remove_or_maintain_files_based_on_role(
426435
storage_subsystem_mock, # when guest user logs out garbage is collected
427436
expect_call: bool,
428437
expected_save_state: bool,
429-
open_project: Callable,
438+
open_project: Callable[[TestClient, ProjectID, str], Awaitable[None]],
430439
mocked_notifications_plugin: dict[str, mock.Mock],
431440
):
432441
user_id = logged_user["id"]
@@ -446,7 +455,7 @@ async def test_websocket_disconnected_remove_or_maintain_files_based_on_role(
446455
await assert_status(r, status.HTTP_200_OK)
447456

448457
# ensure sufficient time is wasted here
449-
await asyncio.sleep(SERVICE_DELETION_DELAY + 1)
458+
await asyncio.sleep(fast_service_deletion_delay + 1)
450459
await gc_core.collect_garbage(client.app)
451460

452461
# assert dynamic service is removed

services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py

Lines changed: 1 addition & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -5,53 +5,33 @@
55
# pylint: disable=unused-variable
66

77

8-
import asyncio
98
from asyncio import Future
10-
from collections.abc import AsyncIterator, Awaitable, Callable
9+
from collections.abc import AsyncIterator, Callable
1110
from pathlib import Path
1211
from typing import Any
1312
from unittest import mock
1413

1514
import pytest
1615
import socketio
1716
import socketio.exceptions
18-
import sqlalchemy as sa
1917
from aiohttp.test_utils import TestClient
2018
from aioresponses import aioresponses
2119
from pytest_mock import MockerFixture
2220
from pytest_simcore.helpers.assert_checks import assert_status
23-
from pytest_simcore.helpers.typing_env import EnvVarsDict
2421
from pytest_simcore.helpers.webserver_projects import NewProject
25-
from redis.asyncio import Redis
2622
from servicelib.aiohttp import status
27-
from servicelib.aiohttp.application import create_safe_application
28-
from servicelib.aiohttp.application_setup import is_setup_completed
2923
from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE
3024
from simcore_postgres_database.models.users import UserRole
31-
from simcore_service_webserver.application_settings import setup_settings
32-
from simcore_service_webserver.db.plugin import setup_db
33-
from simcore_service_webserver.director_v2.plugin import setup_director_v2
34-
from simcore_service_webserver.login.plugin import setup_login
35-
from simcore_service_webserver.notifications.plugin import setup_notifications
36-
from simcore_service_webserver.products.plugin import setup_products
3725
from simcore_service_webserver.projects._projects_service import (
3826
remove_project_dynamic_services,
3927
submit_delete_project_task,
4028
)
41-
from simcore_service_webserver.projects.plugin import setup_projects
42-
from simcore_service_webserver.rabbitmq import setup_rabbitmq
43-
from simcore_service_webserver.resource_manager.plugin import setup_resource_manager
4429
from simcore_service_webserver.resource_manager.registry import (
4530
RedisResourceRegistry,
4631
UserSessionDict,
4732
get_registry,
4833
)
49-
from simcore_service_webserver.rest.plugin import setup_rest
50-
from simcore_service_webserver.security.plugin import setup_security
51-
from simcore_service_webserver.session.plugin import setup_session
52-
from simcore_service_webserver.socketio.plugin import setup_socketio
5334
from simcore_service_webserver.users.exceptions import UserNotFoundError
54-
from simcore_service_webserver.users.plugin import setup_users
5535
from simcore_service_webserver.users.users_service import delete_user_without_projects
5636
from tenacity.asyncio import AsyncRetrying
5737
from tenacity.retry import retry_if_exception_type
@@ -60,73 +40,6 @@
6040
from yarl import URL
6141

6242

63-
async def close_project(client, project_uuid: str, client_session_id: str) -> None:
64-
url = client.app.router["close_project"].url_for(project_id=project_uuid)
65-
resp = await client.post(url, json=client_session_id)
66-
await assert_status(resp, status.HTTP_204_NO_CONTENT)
67-
68-
69-
@pytest.fixture
70-
async def open_project() -> AsyncIterator[Callable[..., Awaitable[None]]]:
71-
_opened_projects = []
72-
73-
async def _open_project(client, project_uuid: str, client_session_id: str) -> None:
74-
url = client.app.router["open_project"].url_for(project_id=project_uuid)
75-
resp = await client.post(url, json=client_session_id)
76-
await assert_status(resp, status.HTTP_200_OK)
77-
_opened_projects.append((client, project_uuid, client_session_id))
78-
79-
yield _open_project
80-
# cleanup, if we cannot close that is because the user_role might not allow it
81-
await asyncio.gather(
82-
*(
83-
close_project(client, project_uuid, client_session_id)
84-
for client, project_uuid, client_session_id in _opened_projects
85-
),
86-
return_exceptions=True,
87-
)
88-
89-
90-
@pytest.fixture
91-
async def client(
92-
aiohttp_client: Callable,
93-
app_environment: EnvVarsDict,
94-
postgres_db: sa.engine.Engine,
95-
mock_orphaned_services,
96-
redis_client: Redis,
97-
mock_dynamic_scheduler_rabbitmq: None,
98-
) -> TestClient:
99-
app = create_safe_application()
100-
101-
assert "WEBSERVER_GARBAGE_COLLECTOR" not in app_environment
102-
103-
settings = setup_settings(app)
104-
assert settings.WEBSERVER_GARBAGE_COLLECTOR is not None
105-
assert settings.WEBSERVER_PROJECTS is not None
106-
107-
setup_db(app)
108-
setup_session(app)
109-
setup_security(app)
110-
setup_rest(app)
111-
setup_login(app)
112-
setup_users(app)
113-
setup_socketio(app)
114-
assert setup_projects(app)
115-
setup_director_v2(app)
116-
assert setup_resource_manager(app)
117-
setup_rabbitmq(app)
118-
setup_notifications(app)
119-
setup_products(app)
120-
121-
assert is_setup_completed("simcore_service_webserver.resource_manager", app)
122-
123-
# NOTE: garbage_collector is disabled and instead explicitly called using
124-
# garbage_collectorgc_core.collect_garbage
125-
assert not is_setup_completed("simcore_service_webserver.garbage_collector", app)
126-
127-
return await aiohttp_client(app)
128-
129-
13043
@pytest.fixture
13144
def mock_storage_delete_data_folders(mocker: MockerFixture) -> mock.Mock:
13245
mocker.patch(

0 commit comments

Comments
 (0)