|
| 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 | + |
1 | 9 | 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 |
2 | 34 |
|
3 | 35 |
|
4 | 36 | @pytest.fixture(scope="session") |
@@ -30,3 +62,82 @@ def app_environment( |
30 | 62 | "GARBAGE_COLLECTOR_INTERVAL_S": "30", |
31 | 63 | }, |
32 | 64 | ) |
| 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 | + ) |
0 commit comments