diff --git a/api/tests/requirements.txt b/api/tests/requirements.txt index e49f4d9fb4bf..79f209adf2fa 100644 --- a/api/tests/requirements.txt +++ b/api/tests/requirements.txt @@ -1,27 +1,27 @@ aiohappyeyeballs==2.6.1 # via aiohttp -aiohttp==3.12.12 +aiohttp==3.12.13 # via # -c ../../requirements/constraints.txt # -r requirements.in -aiosignal==1.3.2 +aiosignal==1.4.0 # via aiohttp -attrs==25.1.0 +attrs==25.3.0 # via # aiohttp # jsonschema # referencing -certifi==2025.1.31 +certifi==2025.6.15 # via # -c ../../requirements/constraints.txt # requests -charset-normalizer==3.4.1 +charset-normalizer==3.4.2 # via requests -coverage==7.6.12 +coverage==7.9.2 # via # -r requirements.in # pytest-cov -frozenlist==1.5.0 +frozenlist==1.7.0 # via # aiohttp # aiosignal @@ -29,11 +29,11 @@ idna==3.10 # via # requests # yarl -iniconfig==2.0.0 +iniconfig==2.1.0 # via pytest isodate==0.7.2 # via openapi-core -jsonschema==4.23.0 +jsonschema==4.24.0 # via # openapi-core # openapi-schema-validator @@ -42,29 +42,29 @@ jsonschema-path==0.3.4 # via # openapi-core # openapi-spec-validator -jsonschema-specifications==2024.10.1 +jsonschema-specifications==2025.4.1 # via # jsonschema # openapi-schema-validator -lazy-object-proxy==1.10.0 +lazy-object-proxy==1.11.0 # via openapi-spec-validator markupsafe==3.0.2 # via werkzeug -more-itertools==10.6.0 +more-itertools==10.7.0 # via openapi-core -multidict==6.1.0 +multidict==6.6.3 # via # aiohttp # yarl -openapi-core==0.19.4 +openapi-core==0.19.5 # via -r requirements.in openapi-schema-validator==0.6.3 # via # openapi-core # openapi-spec-validator -openapi-spec-validator==0.7.1 +openapi-spec-validator==0.7.2 # via openapi-core -packaging==24.2 +packaging==25.0 # via # pytest # pytest-sugar @@ -72,22 +72,26 @@ parse==1.20.2 # via openapi-core pathable==0.4.4 # via jsonschema-path -pluggy==1.5.0 - # via pytest -propcache==0.3.0 +pluggy==1.6.0 + # via + # pytest + # pytest-cov +propcache==0.3.2 # via # aiohttp # yarl -pytest==8.3.5 +pygments==2.19.2 + # via pytest +pytest==8.4.1 # via # -r requirements.in # pytest-asyncio # pytest-cov # pytest-instafail # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements.in pytest-instafail==0.5.0 # via -r requirements.in @@ -103,23 +107,27 @@ referencing==0.35.1 # jsonschema # jsonschema-path # jsonschema-specifications -requests==2.32.3 +requests==2.32.4 # via jsonschema-path rfc3339-validator==0.1.4 # via openapi-schema-validator -rpds-py==0.23.1 +rpds-py==0.26.0 # via # jsonschema # referencing six==1.17.0 # via rfc3339-validator -termcolor==2.5.0 +termcolor==3.1.0 # via pytest-sugar -urllib3==2.3.0 +typing-extensions==4.14.0 + # via + # aiosignal + # openapi-core +urllib3==2.5.0 # via # -c ../../requirements/constraints.txt # requests -werkzeug==3.1.3 +werkzeug==3.1.1 # via openapi-core -yarl==1.18.3 +yarl==1.20.1 # via aiohttp diff --git a/packages/aws-library/requirements/_test.txt b/packages/aws-library/requirements/_test.txt index 03936ad2eb04..9e5d9bb8686b 100644 --- a/packages/aws-library/requirements/_test.txt +++ b/packages/aws-library/requirements/_test.txt @@ -163,7 +163,9 @@ pint==0.24.4 platformdirs==4.3.6 # via pint pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov ply==3.11 # via jsonpath-ng pprintpp==0.4.0 @@ -184,9 +186,13 @@ pydantic-core==2.27.2 # via # -c requirements/_base.txt # pydantic +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest pyparsing==3.2.1 # via moto -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -196,17 +202,17 @@ pytest==8.3.5 # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in pytest-benchmark==5.1.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/packages/celery-library/requirements/_test.txt b/packages/celery-library/requirements/_test.txt index 3f0d678e663d..58acd301d1a4 100644 --- a/packages/celery-library/requirements/_test.txt +++ b/packages/celery-library/requirements/_test.txt @@ -93,7 +93,9 @@ pint==0.24.4 platformdirs==4.3.8 # via pint pluggy==1.6.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff prompt-toolkit==3.0.51 @@ -106,7 +108,11 @@ psutil==7.0.0 # pytest-celery py-cpuinfo==9.0.0 # via pytest-benchmark -pytest==8.3.5 +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -117,13 +123,13 @@ pytest==8.3.5 # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in pytest-benchmark==5.1.0 # via -r requirements/_test.in pytest-celery==1.2.0 # via -r requirements/_test.in -pytest-cov==6.1.1 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-docker-tools==3.1.9 # via pytest-celery @@ -131,7 +137,7 @@ pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/packages/celery-library/setup.cfg b/packages/celery-library/setup.cfg index 5b10d2dc1874..21600ef13506 100644 --- a/packages/celery-library/setup.cfg +++ b/packages/celery-library/setup.cfg @@ -15,6 +15,7 @@ test = pytest [tool:pytest] asyncio_mode = auto +asyncio_default_fixture_loop_scope = function [mypy] plugins = diff --git a/packages/common-library/requirements/_test.txt b/packages/common-library/requirements/_test.txt index 9737c253a396..a75e8b078c32 100644 --- a/packages/common-library/requirements/_test.txt +++ b/packages/common-library/requirements/_test.txt @@ -17,7 +17,9 @@ packaging==24.2 # pytest # pytest-sugar pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff pydantic==2.10.6 @@ -33,7 +35,9 @@ pydantic-settings==2.7.0 # via # -c requirements/../../../requirements/constraints.txt # -r requirements/_test.in -pytest==8.3.5 +pygments==2.19.2 + # via pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -42,15 +46,15 @@ pytest==8.3.5 # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/packages/dask-task-models-library/requirements/_test.txt b/packages/dask-task-models-library/requirements/_test.txt index 9daa7aacc472..238509a93386 100644 --- a/packages/dask-task-models-library/requirements/_test.txt +++ b/packages/dask-task-models-library/requirements/_test.txt @@ -22,10 +22,16 @@ pint==0.24.4 platformdirs==4.3.8 # via pint pluggy==1.6.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff -pytest==8.3.5 +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -34,15 +40,15 @@ pytest==8.3.5 # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.1.1 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/packages/models-library/requirements/_test.txt b/packages/models-library/requirements/_test.txt index f54c9d6f0f7f..2d4089b21f81 100644 --- a/packages/models-library/requirements/_test.txt +++ b/packages/models-library/requirements/_test.txt @@ -31,14 +31,18 @@ pint==0.24.4 platformdirs==4.3.6 # via pint pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff propcache==0.3.0 # via yarl psutil==7.0.0 # via -r requirements/_test.in -pytest==8.3.5 +pygments==2.19.2 + # via pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -47,15 +51,15 @@ pytest==8.3.5 # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/packages/models-library/requirements/_tools.txt b/packages/models-library/requirements/_tools.txt index 14338d3333de..6f0ab186e210 100644 --- a/packages/models-library/requirements/_tools.txt +++ b/packages/models-library/requirements/_tools.txt @@ -60,8 +60,10 @@ platformdirs==4.3.6 # virtualenv pre-commit==4.1.0 # via -r requirements/../../../requirements/devenv.txt -pygments==2.19.1 - # via rich +pygments==2.19.2 + # via + # -c requirements/_test.txt + # rich pylint==3.3.4 # via -r requirements/../../../requirements/devenv.txt pyproject-hooks==1.2.0 diff --git a/packages/notifications-library/requirements/_test.txt b/packages/notifications-library/requirements/_test.txt index 406c59828186..057f5f048440 100644 --- a/packages/notifications-library/requirements/_test.txt +++ b/packages/notifications-library/requirements/_test.txt @@ -60,7 +60,9 @@ packaging==24.2 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff propcache==0.3.0 @@ -68,7 +70,11 @@ propcache==0.3.0 # -c requirements/_base.txt # aiohttp # yarl -pytest==8.3.5 +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -77,15 +83,15 @@ pytest==8.3.5 # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/packages/postgres-database/requirements/_test.txt b/packages/postgres-database/requirements/_test.txt index 5753352ab054..48293adb1f49 100644 --- a/packages/postgres-database/requirements/_test.txt +++ b/packages/postgres-database/requirements/_test.txt @@ -30,24 +30,28 @@ packaging==24.2 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov psycopg2-binary==2.9.10 # via # -c requirements/_base.txt # aiopg # sqlalchemy -pytest==8.3.5 +pygments==2.19.2 + # via pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-docker # pytest-instafail -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker==3.2.0 +pytest-docker==3.2.3 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in diff --git a/packages/pytest-simcore/src/pytest_simcore/asyncio_event_loops.py b/packages/pytest-simcore/src/pytest_simcore/asyncio_event_loops.py new file mode 100644 index 000000000000..a08a48f0b106 --- /dev/null +++ b/packages/pytest-simcore/src/pytest_simcore/asyncio_event_loops.py @@ -0,0 +1,63 @@ +""" +Our choice of plugin to test asyncio functionality is pytest-asyncio + +Some other pytest plugins, e.g. pytest-aiohttp, define their own event loop +policies and event loops, which can conflict with pytest-asyncio. + +This files unifies the event loop policy and event loop used by pytest-asyncio throughout +all the tests in this repository. + +""" + +import asyncio + +import pytest +import uvloop + + +@pytest.fixture(scope="session") +def event_loop_policy(): + """Override the event loop policy to use uvloop which is the one we use in production + + SEE https://pytest-asyncio.readthedocs.io/en/stable/how-to-guides/uvloop.html + """ + return uvloop.EventLoopPolicy() + + +async def test_using_uvloop_event_loop(): + """Tests that `pytest_simcore.asyncio_event_loops` plugin is used and has an effect + + Manually import and add it your test-suite to run this test. + """ + assert isinstance(asyncio.get_event_loop_policy(), uvloop.EventLoopPolicy) + + +@pytest.fixture +async def loop() -> asyncio.AbstractEventLoop: + """Override the event loop inside `aiohttp.pytest_plugin` with the one from `pytest-asyncio`. + + This provides the necessary fixtures to use pytest-asyncio with aiohttp!!! + + USAGE: + + pytest_plugins = [ + "aiohttp.pytest_plugin", # No need to install pytest-aiohttp separately + ] + + + ERRORS: + Otherwise error like this will be raised: + + > if connector._loop is not loop: + > raise RuntimeError("Session and connector has to use same event loop") + E RuntimeError: Session and connector has to use same event loop + + .venv/lib/python3.11/site-packages/aiohttp/client.py:375: RuntimeError + + > if connector._loop is not loop: + > raise RuntimeError("Session and connector has to use same event loop") + >E RuntimeError: Session and connector has to use same event loop + + .venv/lib/python3.11/site-packages/aiohttp/client.py:375: RuntimeError + """ + return asyncio.get_running_loop() diff --git a/packages/service-integration/requirements/_base.txt b/packages/service-integration/requirements/_base.txt index 332dcc970010..be0b2d6b7c13 100644 --- a/packages/service-integration/requirements/_base.txt +++ b/packages/service-integration/requirements/_base.txt @@ -107,8 +107,10 @@ pydantic-settings==2.7.0 # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/models-library/requirements/_base.in pygments==2.19.1 - # via rich -pytest==8.3.5 + # via + # pytest + # rich +pytest==8.4.1 # via -r requirements/_base.in python-dateutil==2.9.0.post0 # via arrow diff --git a/packages/service-integration/requirements/_test.txt b/packages/service-integration/requirements/_test.txt index 19f48613efac..ee014572fd97 100644 --- a/packages/service-integration/requirements/_test.txt +++ b/packages/service-integration/requirements/_test.txt @@ -19,14 +19,19 @@ pluggy==1.5.0 # via # -c requirements/_base.txt # pytest -pytest==8.3.5 + # pytest-cov +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -c requirements/_base.txt # -r requirements/_test.in # pytest-cov # pytest-instafail # pytest-sugar -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in diff --git a/packages/service-library/requirements/_test.in b/packages/service-library/requirements/_test.in index 239a389cbc06..8df4e1886179 100644 --- a/packages/service-library/requirements/_test.in +++ b/packages/service-library/requirements/_test.in @@ -41,3 +41,4 @@ types_aiofiles types_tqdm types-psutil types-psycopg2 +uvloop diff --git a/packages/service-library/requirements/_test.txt b/packages/service-library/requirements/_test.txt index 18f392574627..c3137531eb99 100644 --- a/packages/service-library/requirements/_test.txt +++ b/packages/service-library/requirements/_test.txt @@ -141,7 +141,9 @@ pillow==11.1.0 pip==25.0.1 # via -r requirements/_test.in pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff propcache==0.3.0 @@ -152,7 +154,12 @@ propcache==0.3.0 # yarl py-cpuinfo==9.0.0 # via pytest-benchmark -pytest==8.3.5 +pygments==2.19.1 + # via + # -c requirements/_base.txt + # -c requirements/_fastapi.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-aiohttp @@ -167,27 +174,27 @@ pytest==8.3.5 # pytest-xdist pytest-aiohttp==1.1.0 # via -r requirements/_test.in -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via # -r requirements/_test.in # pytest-aiohttp pytest-benchmark==5.1.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker==3.2.0 +pytest-docker==3.2.3 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in pytest-sugar==1.0.0 # via -r requirements/_test.in -pytest-xdist==3.6.1 +pytest-xdist==3.8.0 # via -r requirements/_test.in python-dateutil==2.9.0.post0 # via @@ -274,6 +281,10 @@ urllib3==2.3.0 # docker # requests # types-requests +uvloop==0.21.0 + # via + # -c requirements/_fastapi.txt + # -r requirements/_test.in yarl==1.18.3 # via # -c requirements/_aiohttp.txt diff --git a/packages/service-library/src/servicelib/fastapi/cancellation_middleware.py b/packages/service-library/src/servicelib/fastapi/cancellation_middleware.py index 8116869af5db..0f7003137bbe 100644 --- a/packages/service-library/src/servicelib/fastapi/cancellation_middleware.py +++ b/packages/service-library/src/servicelib/fastapi/cancellation_middleware.py @@ -10,7 +10,7 @@ _logger = logging.getLogger(__name__) -class _TerminateTaskGroupError(Exception): +class _ClientDisconnectedError(Exception): pass @@ -21,9 +21,9 @@ async def _message_poller( message = await receive() if message["type"] == "http.disconnect": _logger.debug( - "client disconnected, terminating request to %s!", request.url + "client disconnected the request to %s!", request.url, stacklevel=2 ) - raise _TerminateTaskGroupError + raise _ClientDisconnectedError # Puts the message in the queue await queue.put(message) @@ -72,9 +72,9 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: ) await handler_task poller_task.cancel() - except* _TerminateTaskGroupError: + except* _ClientDisconnectedError: if not handler_task.done(): _logger.info( - "The client disconnected. request to %s was cancelled.", + "The client disconnected. The request to %s was cancelled.", request.url, ) diff --git a/packages/service-library/tests/aiohttp/test_client_session.py b/packages/service-library/tests/aiohttp/test_client_session.py index 74b91655c31a..792c254ee73b 100644 --- a/packages/service-library/tests/aiohttp/test_client_session.py +++ b/packages/service-library/tests/aiohttp/test_client_session.py @@ -6,7 +6,7 @@ from collections.abc import Callable, Iterator from typing import Any -import pytest +import pytest_asyncio from aiohttp import web from aiohttp.client import ClientSession from aiohttp.test_utils import TestServer @@ -18,8 +18,8 @@ ) -@pytest.fixture -def server(event_loop, aiohttp_server: Callable) -> Iterator[TestServer]: +@pytest_asyncio.fixture(loop_scope="function", scope="function") +async def server(aiohttp_server: Callable) -> Iterator[TestServer]: async def echo(request): got = await request.json() return web.json_response(data=got) @@ -31,7 +31,7 @@ async def echo(request): assert not app.get(APP_CLIENT_SESSION_KEY) - test_server = event_loop.run_until_complete(aiohttp_server(app)) + test_server = await aiohttp_server(app) assert isinstance(app[APP_CLIENT_SESSION_KEY], ClientSession) assert not app[APP_CLIENT_SESSION_KEY].closed diff --git a/packages/service-library/tests/aiohttp/test_monitor_slow_callbacks.py b/packages/service-library/tests/aiohttp/test_monitor_slow_callbacks.py index 6c428eb485d4..cb30d1f73385 100644 --- a/packages/service-library/tests/aiohttp/test_monitor_slow_callbacks.py +++ b/packages/service-library/tests/aiohttp/test_monitor_slow_callbacks.py @@ -8,33 +8,35 @@ from collections.abc import Iterable import pytest +import pytest_asyncio from servicelib.aiohttp import monitor_slow_callbacks -from servicelib.aiohttp.aiopg_utils import DatabaseError from tenacity import retry from tenacity.stop import stop_after_attempt from tenacity.wait import wait_fixed -async def slow_task(delay): - time.sleep(delay) # noqa: ASYNC101 +async def _slow_function(delay): + time.sleep(delay) # noqa: ASYNC251 @retry(wait=wait_fixed(1), stop=stop_after_attempt(2)) -async def fails_to_reach_pg_db(): - raise DatabaseError +async def _raising_function(): + msg = "This function is expected to raise an error" + raise RuntimeError(msg) -@pytest.fixture -def incidents_manager(event_loop) -> dict: +@pytest_asyncio.fixture(loop_scope="function", scope="function") +async def incidents_manager() -> dict: incidents = [] monitor_slow_callbacks.enable(slow_duration_secs=0.2, incidents=incidents) - asyncio.ensure_future(slow_task(0.3), loop=event_loop) # noqa: RUF006 - asyncio.ensure_future(slow_task(0.3), loop=event_loop) # noqa: RUF006 - asyncio.ensure_future(slow_task(0.4), loop=event_loop) # noqa: RUF006 + event_loop = asyncio.get_running_loop() + asyncio.ensure_future(_slow_function(0.3), loop=event_loop) # noqa: RUF006 + asyncio.ensure_future(_slow_function(0.3), loop=event_loop) # noqa: RUF006 + asyncio.ensure_future(_slow_function(0.4), loop=event_loop) # noqa: RUF006 incidents_pg = None # aiopg_utils.monitor_pg_responsiveness.enable() - asyncio.ensure_future(fails_to_reach_pg_db(), loop=event_loop) # noqa: RUF006 + asyncio.ensure_future(_raising_function(), loop=event_loop) # noqa: RUF006 return {"slow_callback": incidents, "posgres_responsive": incidents_pg} @@ -46,6 +48,10 @@ def disable_monitoring() -> Iterable[None]: asyncio.events.Handle._run = original_handler # noqa: SLF001 +@pytest.mark.skip( + reason="log_slow_callbacks is not supported out-of-the-box with uvloop." + " SEE https://github.com/ITISFoundation/osparc-simcore/issues/8047" +) async def test_slow_task_incident(disable_monitoring: None, incidents_manager: dict): await asyncio.sleep(2) assert len(incidents_manager["slow_callback"]) == 3 diff --git a/packages/service-library/tests/aiohttp/test_requests_validation.py b/packages/service-library/tests/aiohttp/test_requests_validation.py index 97c2b317b6ac..5cd12a4ee101 100644 --- a/packages/service-library/tests/aiohttp/test_requests_validation.py +++ b/packages/service-library/tests/aiohttp/test_requests_validation.py @@ -7,6 +7,7 @@ from uuid import UUID import pytest +import pytest_asyncio from aiohttp import web from aiohttp.test_utils import TestClient, make_mocked_request from common_library.json_serialization import json_dumps @@ -98,8 +99,8 @@ def create_fake(cls, faker: Faker): return cls(x=faker.pyint(), y=faker.pybool(), z=Sub.create_fake(faker)) -@pytest.fixture -def client(event_loop, aiohttp_client: Callable, faker: Faker) -> TestClient: +@pytest_asyncio.fixture(loop_scope="function", scope="function") +async def client(aiohttp_client: Callable, faker: Faker) -> TestClient: """ Some app that: @@ -162,7 +163,7 @@ async def _middleware(request: web.Request, handler): # adds handler app.add_routes([web.get("/projects/{project_uuid}", _handler)]) - return event_loop.run_until_complete(aiohttp_client(app)) + return await aiohttp_client(app) @pytest.fixture diff --git a/packages/service-library/tests/conftest.py b/packages/service-library/tests/conftest.py index 979a3731071d..9c04c4cc9027 100644 --- a/packages/service-library/tests/conftest.py +++ b/packages/service-library/tests/conftest.py @@ -17,6 +17,7 @@ from settings_library.redis import RedisDatabase, RedisSettings pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.docker_compose", "pytest_simcore.docker_registry", "pytest_simcore.docker_swarm", diff --git a/packages/service-library/tests/fastapi/test_cancellation_middleware.py b/packages/service-library/tests/fastapi/test_cancellation_middleware.py index add93851f540..1eac0cc1ae63 100644 --- a/packages/service-library/tests/fastapi/test_cancellation_middleware.py +++ b/packages/service-library/tests/fastapi/test_cancellation_middleware.py @@ -2,6 +2,7 @@ import asyncio import logging +import threading from collections.abc import Iterator from threading import Thread from unittest.mock import AsyncMock @@ -9,6 +10,7 @@ import httpx import pytest import uvicorn +import uvloop from fastapi import APIRouter, BackgroundTasks, FastAPI from pytest_simcore.helpers.logging_tools import log_context from servicelib.fastapi.cancellation_middleware import RequestCancellationMiddleware @@ -18,8 +20,11 @@ @pytest.fixture -def server_done_event() -> asyncio.Event: - return asyncio.Event() +def server_done_event() -> threading.Event: + # This allows communicate an event between the thread where the server is running + # and the test thread. It is used to signal that the server has completed its task + # WARNING: do not user asyncio.Event here as it is not thread-safe! + return threading.Event() @pytest.fixture @@ -29,7 +34,7 @@ def server_cancelled_mock() -> AsyncMock: @pytest.fixture def fastapi_router( - server_done_event: asyncio.Event, server_cancelled_mock: AsyncMock + server_done_event: threading.Event, server_cancelled_mock: AsyncMock ) -> APIRouter: router = APIRouter() @@ -77,22 +82,29 @@ async def sleep_with_background_task( def fastapi_app(fastapi_router: APIRouter) -> FastAPI: app = FastAPI() app.include_router(fastapi_router) - app.add_middleware(RequestCancellationMiddleware) + + app.add_middleware(RequestCancellationMiddleware) # Middleware under test return app @pytest.fixture def uvicorn_server(fastapi_app: FastAPI) -> Iterator[URL]: - random_port = unused_port() + + server_host = "127.0.0.1" + server_port = unused_port() + server_url = f"http://{server_host}:{server_port}" + with log_context( logging.INFO, - msg=f"with uvicorn server on 127.0.0.1:{random_port}", + msg=f"with uvicorn server on {server_url}", ) as ctx: + config = uvicorn.Config( fastapi_app, - host="127.0.0.1", - port=random_port, + host=server_host, + port=server_port, log_level="error", + loop="uvloop", ) server = uvicorn.Server(config) @@ -102,20 +114,16 @@ def uvicorn_server(fastapi_app: FastAPI) -> Iterator[URL]: @retry(wait=wait_fixed(0.1), stop=stop_after_delay(10), reraise=True) def wait_for_server_ready() -> None: - with httpx.Client() as client: - response = client.get(f"http://127.0.1:{random_port}/") - assert ( - response.is_success - ), f"Server did not start successfully: {response.status_code} {response.text}" + response = httpx.get(f"{server_url}/") + assert ( + response.is_success + ), f"Server did not start successfully: {response.status_code} {response.text}" wait_for_server_ready() - ctx.logger.info( - "server ready at: %s", - f"http://127.0.0.1:{random_port}", - ) + ctx.logger.info("server ready at: %s", server_url) - yield URL(f"http://127.0.0.1:{random_port}") + yield URL(server_url) server.should_exit = True thread.join(timeout=10) @@ -123,43 +131,50 @@ def wait_for_server_ready() -> None: async def test_server_cancels_when_client_disconnects( uvicorn_server: URL, - server_done_event: asyncio.Event, + server_done_event: threading.Event, server_cancelled_mock: AsyncMock, ): + # Implementation of RequestCancellationMiddleware is under test here + assert isinstance(asyncio.get_running_loop(), uvloop.Loop) + async with httpx.AsyncClient(base_url=f"{uvicorn_server}") as client: - # check standard call still complete as expected + # 1. check standard call still complete as expected with log_context(logging.INFO, msg="client calling endpoint"): response = await client.get("/sleep", params={"sleep_time": 0.1}) + assert response.status_code == 200 assert response.json() == {"message": "Slept for 0.1 seconds"} - async with asyncio.timeout(10): - await server_done_event.wait() + + server_done_event.wait(10) server_done_event.clear() - # check slow call get cancelled + # 2. check slow call get cancelled with log_context( logging.INFO, msg="client calling endpoint for cancellation" ) as ctx: with pytest.raises(httpx.ReadTimeout): - response = await client.get( - "/sleep", params={"sleep_time": 10}, timeout=0.1 + await client.get( + "/sleep", + params={"sleep_time": 10}, + timeout=0.1, # <--- this will enforce the client to disconnect from the server ! ) ctx.logger.info("client disconnected from server") - async with asyncio.timeout(5): - await server_done_event.wait() + # request should have been cancelled after the ReadTimoeut! + server_done_event.wait(5) server_cancelled_mock.assert_called_once() server_cancelled_mock.reset_mock() server_done_event.clear() + # 3. check background tasks get cancelled as well sadly # NOTE: shows that FastAPI BackgroundTasks get cancelled too! - # check background tasks get cancelled as well sadly with log_context(logging.INFO, msg="client calling endpoint for cancellation"): response = await client.get( "/sleep-with-background-task", params={"sleep_time": 2}, ) assert response.status_code == 200 - async with asyncio.timeout(5): - await server_done_event.wait() + + # request should have been cancelled after the ReadTimoeut! + server_done_event.wait(5) server_cancelled_mock.assert_called_once() diff --git a/packages/settings-library/requirements/_test.txt b/packages/settings-library/requirements/_test.txt index fb8381375d51..6a2a4716993a 100644 --- a/packages/settings-library/requirements/_test.txt +++ b/packages/settings-library/requirements/_test.txt @@ -11,19 +11,25 @@ packaging==24.2 # pytest # pytest-sugar pluggy==1.5.0 - # via pytest -pytest==8.3.5 + # via + # pytest + # pytest-cov +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-cov # pytest-instafail # pytest-mock # pytest-sugar -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/packages/simcore-sdk/requirements/_test.txt b/packages/simcore-sdk/requirements/_test.txt index 5073a88afd73..ba5bd76f8ce4 100644 --- a/packages/simcore-sdk/requirements/_test.txt +++ b/packages/simcore-sdk/requirements/_test.txt @@ -200,7 +200,9 @@ pathable==0.4.4 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov ply==3.11 # via jsonpath-ng pprintpp==0.4.0 @@ -223,9 +225,13 @@ pydantic-core==2.27.2 # via # -c requirements/_base.txt # pydantic +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest pyparsing==3.2.1 # via moto -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -235,21 +241,21 @@ pytest==8.3.5 # pytest-mock # pytest-sugar # pytest-xdist -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in pytest-sugar==1.0.0 # via -r requirements/_test.in -pytest-xdist==3.6.1 +pytest-xdist==3.8.0 # via -r requirements/_test.in python-dateutil==2.9.0.post0 # via diff --git a/requirements/base.Makefile b/requirements/base.Makefile index 35823f26d16c..a2ee7be1ddfd 100644 --- a/requirements/base.Makefile +++ b/requirements/base.Makefile @@ -15,7 +15,7 @@ UPGRADE_OPTION := $(if $(upgrade),--upgrade-package "$(upgrade)",$(DO_CLEAN_OR_U objects = $(sort $(wildcard *.in)) outputs := $(objects:.in=.txt) -reqs: $(outputs) ## pip-compiles all requirements/*.in -> requirements/*.txt; make reqs upgrade=foo will only upgrade package foo +reqs: $(outputs) ## pip-compiles all requirements/*.in -> requirements/*.txt; make reqs upgrade=foo will only upgrade package foo; make reqs startswith=pytest will upgrade packages starting with pytest touch: @$(foreach p,${objects},touch ${p};) @@ -36,6 +36,12 @@ help: ## this colorful help @echo "" @awk --posix 'BEGIN {FS = ":.*?## "} /^[[:alpha:][:space:]_-]+:.*?## / {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) @echo "" + @echo "Examples:" + @echo " make reqs # Upgrade all packages" + @echo " make reqs upgrade=pytest # Upgrade only pytest package" + @echo " make reqs startswith=pytest # Upgrade all packages starting with 'pytest'" + @echo " make reqs clean=1 # Clean and rebuild all requirements" + @echo "" # ------------------------------------------------------------------------------------------ @@ -44,10 +50,28 @@ help: ## this colorful help # extracting subsets of requiremenst like e.g _dask-distributed.* # %.txt: %.in - cd ..; \ - uv pip compile $(UPGRADE_OPTION) \ - --no-header \ - --output-file requirements/$@ requirements/$< + @if [ -n "$(startswith)" ]; then \ + MATCHING_PACKAGES=$$(grep '^$(startswith)' $@ 2>/dev/null | cut -d= -f1); \ + if [ -z "$$MATCHING_PACKAGES" ]; then \ + echo "No packages starting with '$(startswith)' found in $@. Skipping."; \ + exit 0; \ + fi; \ + STARTSWITH_UPGRADE=$$(echo "$$MATCHING_PACKAGES" | xargs -n1 echo --upgrade-package); \ + cd ..; \ + uv pip compile $$STARTSWITH_UPGRADE \ + --no-header \ + --output-file requirements/$@ requirements/$<; \ + elif [ -n "$(upgrade)" ]; then \ + cd ..; \ + uv pip compile --upgrade-package "$(upgrade)" \ + --no-header \ + --output-file requirements/$@ requirements/$<; \ + else \ + cd ..; \ + uv pip compile $(DO_CLEAN_OR_UPGRADE) \ + --no-header \ + --output-file requirements/$@ requirements/$<; \ + fi _test.txt: _base.txt diff --git a/requirements/tools/Makefile b/requirements/tools/Makefile index ee094b80ef94..87e3afdcd4b6 100644 --- a/requirements/tools/Makefile +++ b/requirements/tools/Makefile @@ -24,6 +24,9 @@ SERVICES_DIR := $(abspath $(REPODIR)/services) IMAGE := local/requirements/tools UPGRADE_OPTION := $(if $(upgrade),upgrade=$(upgrade),) +STARTSWITH_OPTION := $(if $(startswith),startswith=$(startswith),) +UPGRADE_OR_STARTSWITH_OPTION := $(if $(upgrade),upgrade=$(upgrade),$(if $(startswith),startswith=$(startswith),)) +UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION := $(if $(upgrade),upgrade=$(upgrade),$(if $(startswith),startswith=$(startswith),$(if $(clean),clean=$(clean),))) # tools MAKE_C := $(MAKE) --directory @@ -70,20 +73,20 @@ touch: ## touches all package requirement inputs only-tools: ## upgrades tools repo wide # Upgrading ONLY _tools.in - @$(foreach p,${_tools-in},echo Touching $(p);touch $(p);$(MAKE_C) $(dir $(p)) reqs $(UPGRADE_OPTION);) + @$(foreach p,${_tools-in},echo Touching $(p);touch $(p);$(MAKE_C) $(dir $(p)) reqs $(UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION);) -reqs: ## updates test & tooling requirements - # Upgrading $(upgrade) requirements - @$(foreach p,${_target-inputs},echo Touching $(p);touch $(p);$(MAKE_C) $(dir $(p)) reqs $(UPGRADE_OPTION);) +reqs: guard-UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION ## updates test & tooling requirements + # Upgrading $(upgrade)$(startswith)$(if $(clean), cleaning) requirements + @$(foreach p,${_target-inputs},echo Touching $(p);touch $(p);$(MAKE_C) $(dir $(p)) reqs $(UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION);) -reqs-all: guard-UPGRADE_OPTION ## updates a given package repository-wise IN ALL `requirements/` folders (e.g. make reqs-all upgrade=foo==1.2.3 ) - # Upgrading $(upgrade) ALL requirements - @$(foreach p,${_all-in},echo Touching $(p);touch $(p);$(MAKE_C) $(dir $(p)) reqs $(UPGRADE_OPTION);) +reqs-all: guard-UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION ## updates a given package or pattern repository-wise IN ALL `requirements/` folders (e.g. make reqs-all upgrade=foo==1.2.3 or make reqs-all startswith=pytest or make reqs-all clean=1) + # Upgrading $(upgrade)$(startswith)$(if $(clean), cleaning) ALL requirements + @$(foreach p,${_all-in},echo Touching $(p);touch $(p);$(MAKE_C) $(dir $(p)) reqs $(UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION);) -reqs-services: guard-UPGRADE_OPTION ## updates a given package on all services [and not packages] (e.g. make reqs-services upgrade=foo==1.2.3 ) - # Upgrading $(upgrade) in services - @$(foreach p,${_services-in},echo Touching $(p);touch $(p);$(MAKE_C) $(dir $(p)) reqs $(UPGRADE_OPTION);) +reqs-services: guard-UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION ## updates a given package or pattern on all services [and not packages] (e.g. make reqs-services upgrade=foo==1.2.3 or make reqs-services startswith=pytest or make reqs-services clean=1) + # Upgrading $(upgrade)$(startswith)$(if $(clean), cleaning) in services + @$(foreach p,${_services-in},echo Touching $(p);touch $(p);$(MAKE_C) $(dir $(p)) reqs $(UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION);) reqs-ci: ## upgrades requirements for pylint recipe in CI @@ -112,7 +115,7 @@ run: build ## Runs upgrade in a container [WARNING! UNDER DEV. USE CAREFULY] --user=$(shell id -u):$(shell id -g) \ --entrypoint=/bin/bash \ ${IMAGE_NAME} \ - -c "cd requirements/tools; make reqs $(if $(upgrade),upgrade=$(upgrade),)" + -c "cd requirements/tools; make reqs $(UPGRADE_OR_STARTSWITH_OR_CLEAN_OPTION)" .PHONY: shell @@ -134,6 +137,21 @@ help: ## this colorful help @echo "" @awk --posix 'BEGIN {FS = ":.*?## "} /^[[:alpha:][:space:]_-]+:.*?## / {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) @echo "" + @echo "Examples:" + @echo " make reqs # Upgrade all test & tooling requirements" + @echo " make reqs upgrade=pytest # Upgrade only pytest package in test & tooling" + @echo " make reqs startswith=pytest # Upgrade all packages starting with 'pytest' in test & tooling" + @echo " make reqs clean=1 # Clean and rebuild all test & tooling requirements" + @echo "" + @echo " make reqs-all upgrade=fastapi # Upgrade fastapi in ALL requirements files" + @echo " make reqs-all startswith=pydantic # Upgrade all packages starting with pydantic repo-wide" + @echo " make reqs-all clean=1 # Clean and rebuild ALL requirements" + @echo "" + @echo " make reqs-services upgrade=uvicorn # Upgrade uvicorn only in services" + @echo " make reqs-services startswith=sqlalchemy # Upgrade all packages starting with sqlalchemy in services folder" + @echo "" + @echo " make only-tools upgrade=black # Upgrade black only in tools requirements" + @echo "" .PHONY: guard-% diff --git a/services/agent/requirements/_test.txt b/services/agent/requirements/_test.txt index c25f0cd5cb21..ce023f0a6ce5 100644 --- a/services/agent/requirements/_test.txt +++ b/services/agent/requirements/_test.txt @@ -188,7 +188,9 @@ packaging==24.2 pathable==0.4.4 # via jsonschema-path pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov ply==3.11 # via jsonpath-ng propcache==0.3.0 @@ -209,19 +211,23 @@ pydantic-core==2.27.2 # via # -c requirements/_base.txt # pydantic +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest pyparsing==3.2.1 # via moto -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-mock -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/agent/tests/conftest.py b/services/agent/tests/conftest.py index 97df58d4e5a7..624669ce7f48 100644 --- a/services/agent/tests/conftest.py +++ b/services/agent/tests/conftest.py @@ -12,6 +12,7 @@ from settings_library.r_clone import S3Provider pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.aws_server", "pytest_simcore.docker_compose", "pytest_simcore.docker_swarm", diff --git a/services/api-server/requirements/_test.txt b/services/api-server/requirements/_test.txt index d678e2c3c1cb..e68fe8f3b135 100644 --- a/services/api-server/requirements/_test.txt +++ b/services/api-server/requirements/_test.txt @@ -225,7 +225,9 @@ pbr==6.1.1 # jschema-to-python # sarif-om pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov propcache==0.2.1 # via # -c requirements/_base.txt @@ -252,6 +254,10 @@ pydantic-core==2.27.1 # via # -c requirements/_base.txt # pydantic +pygments==2.18.0 + # via + # -c requirements/_base.txt + # pytest pyinstrument==5.0.0 # via # -c requirements/_base.txt @@ -262,20 +268,20 @@ pyrsistent==0.20.0 # via # -c requirements/_base.txt # jsonschema -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-docker # pytest-mock -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker==3.2.0 +pytest-docker==3.2.3 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/api-server/tests/conftest.py b/services/api-server/tests/conftest.py index 16d33d3afc0b..9aed52589566 100644 --- a/services/api-server/tests/conftest.py +++ b/services/api-server/tests/conftest.py @@ -16,6 +16,7 @@ CURRENT_DIR = Path(sys.argv[0] if __name__ == "__main__" else __file__).resolve().parent pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.docker_compose", "pytest_simcore.docker_swarm", diff --git a/services/autoscaling/requirements/_test.txt b/services/autoscaling/requirements/_test.txt index 669083ffa99e..a9e727a7372e 100644 --- a/services/autoscaling/requirements/_test.txt +++ b/services/autoscaling/requirements/_test.txt @@ -173,7 +173,9 @@ packaging==25.0 pathable==0.4.4 # via jsonschema-path pluggy==1.6.0 - # via pytest + # via + # pytest + # pytest-cov ply==3.11 # via jsonpath-ng pprintpp==0.4.0 @@ -195,9 +197,13 @@ pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest pyparsing==3.2.3 # via moto -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -205,13 +211,13 @@ pytest==8.3.5 # pytest-icdiff # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.1.1 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/autoscaling/tests/unit/conftest.py b/services/autoscaling/tests/unit/conftest.py index a49ec4e46b2e..1df513887265 100644 --- a/services/autoscaling/tests/unit/conftest.py +++ b/services/autoscaling/tests/unit/conftest.py @@ -100,6 +100,7 @@ from types_aiobotocore_ec2.type_defs import TagTypeDef pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.aws_server", "pytest_simcore.aws_ec2_service", "pytest_simcore.aws_iam_service", diff --git a/services/catalog/requirements/_test.txt b/services/catalog/requirements/_test.txt index 5259a3c8cf24..b7704247c021 100644 --- a/services/catalog/requirements/_test.txt +++ b/services/catalog/requirements/_test.txt @@ -113,7 +113,9 @@ packaging==24.2 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov propcache==0.3.0 # via # -c requirements/_base.txt @@ -123,7 +125,11 @@ ptvsd==4.3.2 # via -r requirements/_test.in py-cpuinfo==9.0.0 # via pytest-benchmark -pytest==8.3.5 +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-aiohttp @@ -134,15 +140,15 @@ pytest==8.3.5 # pytest-mock pytest-aiohttp==1.1.0 # via -r requirements/_test.in -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via pytest-aiohttp pytest-benchmark==5.1.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker==3.2.0 +pytest-docker==3.2.3 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/catalog/tests/unit/conftest.py b/services/catalog/tests/unit/conftest.py index e4419941687a..3cc1e633efcf 100644 --- a/services/catalog/tests/unit/conftest.py +++ b/services/catalog/tests/unit/conftest.py @@ -36,6 +36,7 @@ from simcore_service_catalog.core.settings import ApplicationSettings pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.docker_compose", "pytest_simcore.docker_registry", diff --git a/services/clusters-keeper/requirements/_test.txt b/services/clusters-keeper/requirements/_test.txt index 37a4405b53c8..b40d0223cbdd 100644 --- a/services/clusters-keeper/requirements/_test.txt +++ b/services/clusters-keeper/requirements/_test.txt @@ -197,7 +197,9 @@ parse==1.20.2 pathable==0.4.4 # via jsonschema-path pluggy==1.6.0 - # via pytest + # via + # pytest + # pytest-cov ply==3.11 # via jsonpath-ng propcache==0.3.1 @@ -222,19 +224,23 @@ pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest pyparsing==3.2.3 # via moto -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-mock -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.1.1 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/clusters-keeper/tests/unit/conftest.py b/services/clusters-keeper/tests/unit/conftest.py index a80776951ded..43bb1bacde14 100644 --- a/services/clusters-keeper/tests/unit/conftest.py +++ b/services/clusters-keeper/tests/unit/conftest.py @@ -39,6 +39,7 @@ from types_aiobotocore_ec2.literals import InstanceTypeType pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.aws_ec2_service", "pytest_simcore.aws_server", "pytest_simcore.docker", diff --git a/services/dask-sidecar/requirements/_test.txt b/services/dask-sidecar/requirements/_test.txt index c8760dadb48f..ed2fec551e6b 100644 --- a/services/dask-sidecar/requirements/_test.txt +++ b/services/dask-sidecar/requirements/_test.txt @@ -182,7 +182,9 @@ packaging==25.0 pathable==0.4.4 # via jsonschema-path pluggy==1.6.0 - # via pytest + # via + # pytest + # pytest-cov ply==3.11 # via jsonpath-ng pprintpp==0.4.0 @@ -207,11 +209,15 @@ pydantic-core==2.33.2 # pydantic pyftpdlib==2.0.1 # via pytest-localftpserver +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest pyopenssl==25.1.0 # via pytest-localftpserver pyparsing==3.2.3 # via moto -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -221,9 +227,9 @@ pytest==8.3.5 # pytest-localftpserver # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.1.1 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in @@ -231,7 +237,7 @@ pytest-instafail==0.5.0 # via -r requirements/_test.in pytest-localftpserver==1.3.2 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-sugar==1.0.0 # via -r requirements/_test.in diff --git a/services/datcore-adapter/requirements/_test.txt b/services/datcore-adapter/requirements/_test.txt index 4ff7b32ba9a1..7bd5df777ef4 100644 --- a/services/datcore-adapter/requirements/_test.txt +++ b/services/datcore-adapter/requirements/_test.txt @@ -57,10 +57,16 @@ packaging==24.2 # pytest # pytest-sugar pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff -pytest==8.3.5 +pygments==2.17.2 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -70,21 +76,21 @@ pytest==8.3.5 # pytest-mock # pytest-sugar # pytest-xdist -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in pytest-sugar==1.0.0 # via -r requirements/_test.in -pytest-xdist==3.6.1 +pytest-xdist==3.8.0 # via -r requirements/_test.in requests==2.32.3 # via diff --git a/services/datcore-adapter/tests/unit/conftest.py b/services/datcore-adapter/tests/unit/conftest.py index 6090efe85ae2..65120234b3e3 100644 --- a/services/datcore-adapter/tests/unit/conftest.py +++ b/services/datcore-adapter/tests/unit/conftest.py @@ -25,6 +25,7 @@ from starlette.testclient import TestClient pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.environment_configs", "pytest_simcore.repository_paths", diff --git a/services/director-v2/requirements/_test.txt b/services/director-v2/requirements/_test.txt index 3ae174181ca0..2aa4efba8e82 100644 --- a/services/director-v2/requirements/_test.txt +++ b/services/director-v2/requirements/_test.txt @@ -215,7 +215,9 @@ pathspec==0.12.1 pillow==11.2.1 # via bokeh pluggy==1.6.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff propcache==0.3.1 @@ -227,7 +229,11 @@ psutil==7.0.0 # via # -c requirements/_base.txt # distributed -pytest==8.3.5 +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -236,19 +242,19 @@ pytest==8.3.5 # pytest-icdiff # pytest-mock # pytest-xdist -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.1.1 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker==3.2.1 +pytest-docker==3.2.3 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in -pytest-xdist==3.6.1 +pytest-xdist==3.8.0 # via -r requirements/_test.in python-dateutil==2.9.0.post0 # via diff --git a/services/director-v2/tests/conftest.py b/services/director-v2/tests/conftest.py index ee63f868c350..c2b2ea89ac27 100644 --- a/services/director-v2/tests/conftest.py +++ b/services/director-v2/tests/conftest.py @@ -37,6 +37,7 @@ from starlette.testclient import ASGI3App, TestClient pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.dask_scheduler", "pytest_simcore.db_entries_mocks", "pytest_simcore.docker_compose", diff --git a/services/director/requirements/_test.txt b/services/director/requirements/_test.txt index 2b8407ed13ab..18b17d1eb5d1 100644 --- a/services/director/requirements/_test.txt +++ b/services/director/requirements/_test.txt @@ -82,7 +82,9 @@ packaging==24.2 # pytest # pytest-sugar pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov propcache==0.2.0 # via # -c requirements/_base.txt @@ -90,7 +92,11 @@ propcache==0.2.0 # yarl py-cpuinfo==9.0.0 # via pytest-benchmark -pytest==8.3.5 +pygments==2.18.0 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -100,17 +106,17 @@ pytest==8.3.5 # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in pytest-benchmark==5.1.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker==3.2.0 +pytest-docker==3.2.3 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/director/tests/unit/conftest.py b/services/director/tests/unit/conftest.py index 15b7627e29d6..71e373f5f169 100644 --- a/services/director/tests/unit/conftest.py +++ b/services/director/tests/unit/conftest.py @@ -19,6 +19,7 @@ pytest_plugins = [ "fixtures.fake_services", + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.docker", "pytest_simcore.docker_compose", diff --git a/services/docker-api-proxy/requirements/_test.txt b/services/docker-api-proxy/requirements/_test.txt index 3e7c5f24b356..c2738b7eb7c8 100644 --- a/services/docker-api-proxy/requirements/_test.txt +++ b/services/docker-api-proxy/requirements/_test.txt @@ -217,7 +217,9 @@ packaging==24.2 pamqp==3.3.0 # via aiormq pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov propcache==0.3.0 # via # aiohttp @@ -290,20 +292,22 @@ pydantic-settings==2.7.0 # -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in # -r requirements/../../../packages/settings-library/requirements/_base.in pygments==2.19.1 - # via rich + # via + # pytest + # rich pyinstrument==5.0.1 # via -r requirements/../../../packages/service-library/requirements/_base.in -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-mock -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in python-dateutil==2.9.0.post0 # via arrow diff --git a/services/dynamic-scheduler/requirements/_test.txt b/services/dynamic-scheduler/requirements/_test.txt index 0764b2c842b6..23dd9f7720f5 100644 --- a/services/dynamic-scheduler/requirements/_test.txt +++ b/services/dynamic-scheduler/requirements/_test.txt @@ -81,14 +81,20 @@ pathspec==0.12.1 playwright==1.50.0 # via -r requirements/_test.in pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff priority==2.0.0 # via hypercorn pyee==12.1.1 # via playwright -pytest==8.3.5 +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -96,13 +102,13 @@ pytest==8.3.5 # pytest-icdiff # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/dynamic-scheduler/tests/conftest.py b/services/dynamic-scheduler/tests/conftest.py index 2cb7f135829c..4a4aaf8c5015 100644 --- a/services/dynamic-scheduler/tests/conftest.py +++ b/services/dynamic-scheduler/tests/conftest.py @@ -21,6 +21,7 @@ from simcore_service_dynamic_scheduler.core.application import create_app pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.docker_compose", "pytest_simcore.docker_swarm", diff --git a/services/dynamic-sidecar/requirements/_test.txt b/services/dynamic-sidecar/requirements/_test.txt index 3eb70c505b8f..4a0e39d14faa 100644 --- a/services/dynamic-sidecar/requirements/_test.txt +++ b/services/dynamic-sidecar/requirements/_test.txt @@ -92,23 +92,29 @@ packaging==24.2 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov propcache==0.3.0 # via # -c requirements/_base.txt # aiohttp # yarl -pytest==8.3.5 +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-mock -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in python-dateutil==2.9.0.post0 # via diff --git a/services/dynamic-sidecar/tests/conftest.py b/services/dynamic-sidecar/tests/conftest.py index b0cf6b67413e..bb6820d2df72 100644 --- a/services/dynamic-sidecar/tests/conftest.py +++ b/services/dynamic-sidecar/tests/conftest.py @@ -35,6 +35,7 @@ logger = logging.getLogger(__name__) pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.docker_compose", "pytest_simcore.docker_registry", "pytest_simcore.docker_swarm", diff --git a/services/dynamic-sidecar/tests/integration/conftest.py b/services/dynamic-sidecar/tests/integration/conftest.py index 8c7e5e795331..8c9f5426bd34 100644 --- a/services/dynamic-sidecar/tests/integration/conftest.py +++ b/services/dynamic-sidecar/tests/integration/conftest.py @@ -7,6 +7,7 @@ from simcore_postgres_database.models.users import users pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.postgres_service", "pytest_simcore.simcore_storage_service", "pytest_simcore.rabbit_service", diff --git a/services/efs-guardian/tests/conftest.py b/services/efs-guardian/tests/conftest.py index 96585f4c87b5..6cdf23bdc23f 100644 --- a/services/efs-guardian/tests/conftest.py +++ b/services/efs-guardian/tests/conftest.py @@ -14,6 +14,7 @@ from pytest_simcore.helpers.typing_env import EnvVarsDict pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.docker_compose", "pytest_simcore.docker_registry", diff --git a/services/invitations/requirements/_test.txt b/services/invitations/requirements/_test.txt index 0b1bfff0ba68..f969e2699b49 100644 --- a/services/invitations/requirements/_test.txt +++ b/services/invitations/requirements/_test.txt @@ -46,16 +46,22 @@ packaging==24.2 # pytest # pytest-sugar pluggy==1.5.0 - # via pytest -pytest==8.3.5 + # via + # pytest + # pytest-cov +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/invitations/tests/unit/conftest.py b/services/invitations/tests/unit/conftest.py index ef2ec565d545..e7a12b0426c2 100644 --- a/services/invitations/tests/unit/conftest.py +++ b/services/invitations/tests/unit/conftest.py @@ -16,6 +16,7 @@ from simcore_service_invitations.services.invitations import InvitationInputs pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.repository_paths", ] diff --git a/services/migration/requirements/_test.txt b/services/migration/requirements/_test.txt index 7a3f4ac712bf..506c6fb6cf15 100644 --- a/services/migration/requirements/_test.txt +++ b/services/migration/requirements/_test.txt @@ -32,21 +32,25 @@ packaging==24.2 pathspec==0.12.1 # via mypy pluggy==1.5.0 + # via + # pytest + # pytest-cov +pygments==2.19.2 # via pytest -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-docker # pytest-mock -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker==3.2.0 +pytest-docker==3.2.3 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/notifications/requirements/_test.txt b/services/notifications/requirements/_test.txt index 483fca1f9a3a..ef6e717d0844 100644 --- a/services/notifications/requirements/_test.txt +++ b/services/notifications/requirements/_test.txt @@ -49,18 +49,24 @@ packaging==24.2 # -c requirements/_base.txt # pytest pluggy==1.5.0 - # via pytest -pytest==8.3.5 + # via + # pytest + # pytest-cov +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-mock -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/notifications/tests/conftest.py b/services/notifications/tests/conftest.py index ba95f08d2e1f..422f58a9122c 100644 --- a/services/notifications/tests/conftest.py +++ b/services/notifications/tests/conftest.py @@ -9,6 +9,7 @@ from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict, setenvs_from_dict pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.docker_compose", "pytest_simcore.docker_swarm", "pytest_simcore.environment_configs", diff --git a/services/payments/requirements/_test.txt b/services/payments/requirements/_test.txt index 5c9dd457bc80..b3768a681001 100644 --- a/services/payments/requirements/_test.txt +++ b/services/payments/requirements/_test.txt @@ -97,7 +97,9 @@ packaging==24.2 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff propcache==0.2.0 @@ -105,7 +107,11 @@ propcache==0.2.0 # -c requirements/_base.txt # aiohttp # yarl -pytest==8.3.5 +pygments==2.18.0 + # via + # -c requirements/_base.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -113,13 +119,13 @@ pytest==8.3.5 # pytest-icdiff # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/resource-usage-tracker/requirements/_test.txt b/services/resource-usage-tracker/requirements/_test.txt index 4c1d3c43b79f..b00474781812 100644 --- a/services/resource-usage-tracker/requirements/_test.txt +++ b/services/resource-usage-tracker/requirements/_test.txt @@ -180,7 +180,9 @@ pathable==0.4.4 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov ply==3.11 # via jsonpath-ng py-partiql-parser==0.6.1 @@ -196,22 +198,26 @@ pydantic-core==2.27.1 # via # -c requirements/_base.txt # pydantic +pygments==2.17.2 + # via + # -c requirements/_base.txt + # pytest pyparsing==3.1.2 # via # -c requirements/_base.txt # moto -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-cov # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/resource-usage-tracker/tests/unit/conftest.py b/services/resource-usage-tracker/tests/unit/conftest.py index fa1b857904ce..a2e1b67a169d 100644 --- a/services/resource-usage-tracker/tests/unit/conftest.py +++ b/services/resource-usage-tracker/tests/unit/conftest.py @@ -27,6 +27,7 @@ from simcore_service_resource_usage_tracker.core.settings import ApplicationSettings pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.docker_compose", "pytest_simcore.docker_registry", diff --git a/services/storage/requirements/_base.txt b/services/storage/requirements/_base.txt index 9dbabb397fb5..335bbc91f5f8 100644 --- a/services/storage/requirements/_base.txt +++ b/services/storage/requirements/_base.txt @@ -612,7 +612,7 @@ protobuf==5.29.3 # via # googleapis-common-protos # opentelemetry-proto -psutil==6.1.1 +psutil==7.0.0 # via # -r requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/_base.in # -r requirements/../../../packages/celery-library/requirements/../../../packages/service-library/requirements/_base.in diff --git a/services/storage/requirements/_test.txt b/services/storage/requirements/_test.txt index f407e0638ed2..e82ca013b3d2 100644 --- a/services/storage/requirements/_test.txt +++ b/services/storage/requirements/_test.txt @@ -203,6 +203,7 @@ kombu==5.5.3 # via # -c requirements/_base.txt # celery + # pytest-celery lazy-object-proxy==1.10.0 # via openapi-spec-validator lupa==2.4 @@ -245,7 +246,9 @@ pathable==0.4.4 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov ply==3.11 # via jsonpath-ng pprintpp==0.4.0 @@ -259,7 +262,7 @@ propcache==0.2.1 # -c requirements/_base.txt # aiohttp # yarl -psutil==6.1.1 +psutil==7.0.0 # via # -c requirements/_base.txt # pytest-celery @@ -276,9 +279,13 @@ pydantic-core==2.27.2 # via # -c requirements/_base.txt # pydantic +pygments==2.19.1 + # via + # -c requirements/_base.txt + # pytest pyparsing==3.2.1 # via moto -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -288,19 +295,19 @@ pytest==8.3.5 # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in -pytest-celery==1.1.3 +pytest-celery==1.2.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker-tools==3.1.3 +pytest-docker-tools==3.1.9 # via pytest-celery pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in diff --git a/services/storage/tests/conftest.py b/services/storage/tests/conftest.py index ad37ba752e66..e7f365b66cb2 100644 --- a/services/storage/tests/conftest.py +++ b/services/storage/tests/conftest.py @@ -87,6 +87,7 @@ from yarl import URL pytest_plugins = [ + "pytest_simcore.asyncio_event_loops", "pytest_simcore.aws_s3_service", "pytest_simcore.aws_server", "pytest_simcore.cli_runner", diff --git a/services/web/server/requirements/_test.txt b/services/web/server/requirements/_test.txt index 0ef44ff2b5b2..1259d6d3eae0 100644 --- a/services/web/server/requirements/_test.txt +++ b/services/web/server/requirements/_test.txt @@ -179,7 +179,9 @@ packaging==24.1 pathspec==0.12.1 # via mypy pluggy==1.5.0 - # via pytest + # via + # pytest + # pytest-cov pprintpp==0.4.0 # via pytest-icdiff propcache==0.3.1 @@ -202,13 +204,14 @@ pydantic-core==2.27.1 pygments==2.15.1 # via # -c requirements/_base.txt + # pytest # rich pyrsistent==0.18.1 # via # -c requirements/_base.txt # jsonschema # referencing -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio @@ -220,25 +223,25 @@ pytest==8.3.5 # pytest-mock # pytest-sugar # pytest-xdist -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in pytest-benchmark==5.1.0 # via -r requirements/_test.in -pytest-cov==6.0.0 +pytest-cov==6.2.1 # via -r requirements/_test.in -pytest-docker==3.2.0 +pytest-docker==3.2.3 # via -r requirements/_test.in pytest-icdiff==0.9 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in pytest-sugar==1.0.0 # via -r requirements/_test.in -pytest-xdist==3.6.1 +pytest-xdist==3.8.0 # via -r requirements/_test.in python-dateutil==2.8.2 # via diff --git a/services/web/server/tests/conftest.py b/services/web/server/tests/conftest.py index 4ecee99005b1..3a8917a78985 100644 --- a/services/web/server/tests/conftest.py +++ b/services/web/server/tests/conftest.py @@ -3,7 +3,6 @@ # pylint: disable=unused-argument # pylint: disable=unused-variable -import asyncio import contextlib import json import logging @@ -66,6 +65,7 @@ # imports the fixtures for the integration tests pytest_plugins = [ "aiohttp.pytest_plugin", + "pytest_simcore.asyncio_event_loops", "pytest_simcore.cli_runner", "pytest_simcore.db_entries_mocks", "pytest_simcore.docker_compose", @@ -488,11 +488,3 @@ def mock_dynamic_scheduler(mocker: MockerFixture) -> None: "simcore_service_webserver.dynamic_scheduler.api.update_projects_networks", autospec=True, ) - - -@pytest.fixture -async def loop( - event_loop: asyncio.AbstractEventLoop, -) -> asyncio.AbstractEventLoop: - """Override the event loop inside pytest-aiohttp with the one from pytest-asyncio.""" - return event_loop diff --git a/services/web/server/tests/unit/isolated/test_exception_handling.py b/services/web/server/tests/unit/isolated/test_exception_handling.py index 775fe452a213..1b7052afb1e6 100644 --- a/services/web/server/tests/unit/isolated/test_exception_handling.py +++ b/services/web/server/tests/unit/isolated/test_exception_handling.py @@ -98,7 +98,7 @@ async def _handler(request: web.Request): app.add_routes(routes) # 3. testing from the client side - client: TestClient = await aiohttp_client(app) + client = await aiohttp_client(app) # success resp = await client.post("/ok") diff --git a/services/web/server/tests/unit/with_dbs/03/test_login_auth_app.py b/services/web/server/tests/unit/with_dbs/03/test_login_auth_app.py index 351de51e218f..9a69ba26b281 100644 --- a/services/web/server/tests/unit/with_dbs/03/test_login_auth_app.py +++ b/services/web/server/tests/unit/with_dbs/03/test_login_auth_app.py @@ -37,7 +37,7 @@ async def auth_app( return app -@pytest_asyncio.fixture(loop_scope="function") +@pytest_asyncio.fixture(loop_scope="function", scope="function") async def web_server( postgres_db: sa.engine.Engine, auth_app: web.Application, diff --git a/services/web/server/tests/unit/with_dbs/03/users/conftest.py b/services/web/server/tests/unit/with_dbs/03/users/conftest.py index 2b99f9e01f67..8911ab95d35d 100644 --- a/services/web/server/tests/unit/with_dbs/03/users/conftest.py +++ b/services/web/server/tests/unit/with_dbs/03/users/conftest.py @@ -3,11 +3,11 @@ # pylint: disable=unused-variable # pylint: disable=too-many-arguments -import asyncio from collections.abc import AsyncGenerator, AsyncIterable, Callable from typing import Any import pytest +import pytest_asyncio import sqlalchemy as sa from aiohttp import web from aiohttp.test_utils import TestServer @@ -22,9 +22,8 @@ from sqlalchemy.ext.asyncio import AsyncEngine -@pytest.fixture -def web_server( - event_loop: asyncio.AbstractEventLoop, +@pytest_asyncio.fixture(loop_scope="function", scope="function") +async def web_server( app_environment: EnvVarsDict, # configs postgres_db: sa.engine.Engine, # db-ready webserver_test_server_port: int, @@ -37,9 +36,7 @@ def web_server( setup_settings(app) setup_db(app) - return event_loop.run_until_complete( - aiohttp_server(app, port=webserver_test_server_port) - ) + return await aiohttp_server(app, port=webserver_test_server_port) @pytest.fixture diff --git a/services/web/server/tests/unit/with_dbs/conftest.py b/services/web/server/tests/unit/with_dbs/conftest.py index c3f0e45e3f63..e446da4e19c9 100644 --- a/services/web/server/tests/unit/with_dbs/conftest.py +++ b/services/web/server/tests/unit/with_dbs/conftest.py @@ -205,7 +205,7 @@ async def _print_mail_to_stdout( ) -@pytest_asyncio.fixture(loop_scope="function") +@pytest_asyncio.fixture(loop_scope="function", scope="function") async def web_server( app_environment: EnvVarsDict, postgres_db: sa.engine.Engine, diff --git a/tests/e2e-playwright/requirements/_test.txt b/tests/e2e-playwright/requirements/_test.txt index 43eb1c9e8d01..69a616a9d9a3 100644 --- a/tests/e2e-playwright/requirements/_test.txt +++ b/tests/e2e-playwright/requirements/_test.txt @@ -78,7 +78,11 @@ pydantic-core==2.27.2 # pydantic pyee==12.1.1 # via playwright -pytest==8.3.5 +pygments==2.19.2 + # via + # -r requirements/_test_wo_playwright.txt + # pytest +pytest==8.4.1 # via # -r requirements/_test_wo_playwright.txt # pytest-base-url diff --git a/tests/e2e-playwright/requirements/_test_wo_playwright.txt b/tests/e2e-playwright/requirements/_test_wo_playwright.txt index 6bb18aa518fe..6dfdf593d177 100644 --- a/tests/e2e-playwright/requirements/_test_wo_playwright.txt +++ b/tests/e2e-playwright/requirements/_test_wo_playwright.txt @@ -47,7 +47,9 @@ pydantic==2.10.6 # via -r requirements/_test_wo_playwright.in pydantic-core==2.27.2 # via pydantic -pytest==8.3.5 +pygments==2.19.2 + # via pytest +pytest==8.4.1 # via # pytest-html # pytest-instafail diff --git a/tests/environment-setup/requirements/requirements.txt b/tests/environment-setup/requirements/requirements.txt index be1f58f4078c..6f6d70422b94 100644 --- a/tests/environment-setup/requirements/requirements.txt +++ b/tests/environment-setup/requirements/requirements.txt @@ -22,13 +22,15 @@ pydantic==2.10.6 # -r requirements/requirements.in pydantic-core==2.27.2 # via pydantic -pytest==8.3.5 +pygments==2.19.2 + # via pytest +pytest==8.4.1 # via # -r requirements/requirements.in # pytest-asyncio # pytest-instafail # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/requirements.in pytest-instafail==0.5.0 # via -r requirements/requirements.in diff --git a/tests/public-api/requirements/_base.txt b/tests/public-api/requirements/_base.txt index 79d2ca83c91f..404bdbe440f5 100644 --- a/tests/public-api/requirements/_base.txt +++ b/tests/public-api/requirements/_base.txt @@ -60,7 +60,7 @@ pydantic-settings==2.7.0 # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/settings-library/requirements/_base.in # osparc -pygments==2.19.1 +pygments==2.19.2 # via rich python-dateutil==2.9.0.post0 # via osparc-client diff --git a/tests/public-api/requirements/_test.txt b/tests/public-api/requirements/_test.txt index fc3bed1b4b55..1c234e977136 100644 --- a/tests/public-api/requirements/_test.txt +++ b/tests/public-api/requirements/_test.txt @@ -64,11 +64,13 @@ propcache==0.3.0 # via # aiohttp # yarl -pytest==8.3.5 +pygments==2.19.2 + # via pytest +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in python-dotenv==1.0.1 # via -r requirements/_test.in diff --git a/tests/swarm-deploy/requirements/_test.txt b/tests/swarm-deploy/requirements/_test.txt index 720d2d69967a..ce55e5031413 100644 --- a/tests/swarm-deploy/requirements/_test.txt +++ b/tests/swarm-deploy/requirements/_test.txt @@ -514,23 +514,25 @@ pydantic-settings==2.7.0 # -r requirements/../../../packages/simcore-sdk/requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in # -r requirements/../../../packages/simcore-sdk/requirements/../../../packages/settings-library/requirements/_base.in pygments==2.19.1 - # via rich + # via + # pytest + # rich pyinstrument==5.0.1 # via # -r requirements/../../../packages/service-library/requirements/_base.in # -r requirements/../../../packages/simcore-sdk/requirements/../../../packages/service-library/requirements/_base.in -pytest==8.3.5 +pytest==8.4.1 # via # -r requirements/_test.in # pytest-asyncio # pytest-instafail # pytest-mock # pytest-sugar -pytest-asyncio==0.26.0 +pytest-asyncio==1.0.0 # via -r requirements/_test.in pytest-instafail==0.5.0 # via -r requirements/_test.in -pytest-mock==3.14.0 +pytest-mock==3.14.1 # via -r requirements/_test.in pytest-runner==6.0.1 # via -r requirements/_test.in