Skip to content

Commit 29626fb

Browse files
committed
pytest-asyncio update
1 parent 21b3e1c commit 29626fb

File tree

6 files changed

+40
-32
lines changed

6 files changed

+40
-32
lines changed

packages/service-library/src/servicelib/aiohttp/incidents.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from collections.abc import Callable
1+
from collections.abc import Callable, Iterator
22
from dataclasses import dataclass, field
33
from typing import Any, Generic, TypeVar
44

@@ -27,6 +27,9 @@ def __len__(self) -> int:
2727
# called also for __bool__
2828
return len(self._items)
2929

30+
def __iter__(self) -> Iterator[ItemT]:
31+
return iter(self._items)
32+
3033
def clear(self) -> None:
3134
self._items.clear()
3235
self._hits = 0
@@ -72,3 +75,9 @@ class BaseIncident:
7275
@dataclass
7376
class SlowCallback(BaseIncident):
7477
delay_secs: float
78+
79+
def __lt__(self, other: "SlowCallback") -> bool:
80+
"""Enable sorting by delay_secs (shorter delays are considered 'less than' longer delays)"""
81+
if not isinstance(other, SlowCallback):
82+
return NotImplemented
83+
return self.delay_secs < other.delay_secs

packages/service-library/tests/aiohttp/test_client_session.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# pylint: disable=unused-argument
33
# pylint: disable=unused-variable
44

5+
import asyncio
56
import json
67
from collections.abc import Callable, Iterator
78
from typing import Any
@@ -19,7 +20,7 @@
1920

2021

2122
@pytest.fixture
22-
def server(event_loop, aiohttp_server: Callable) -> Iterator[TestServer]:
23+
def server(aiohttp_server: Callable) -> Iterator[TestServer]:
2324
async def echo(request):
2425
got = await request.json()
2526
return web.json_response(data=got)
@@ -31,7 +32,7 @@ async def echo(request):
3132

3233
assert not app.get(APP_CLIENT_SESSION_KEY)
3334

34-
test_server = event_loop.run_until_complete(aiohttp_server(app))
35+
test_server = asyncio.get_event_loop().run_until_complete(aiohttp_server(app))
3536

3637
assert isinstance(app[APP_CLIENT_SESSION_KEY], ClientSession)
3738
assert not app[APP_CLIENT_SESSION_KEY].closed

packages/service-library/tests/aiohttp/test_monitor_slow_callbacks.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
import pytest
1111
from servicelib.aiohttp import monitor_slow_callbacks
1212
from servicelib.aiohttp.aiopg_utils import DatabaseError
13+
from servicelib.aiohttp.incidents import LimitedOrderedStack, SlowCallback
1314
from tenacity import retry
1415
from tenacity.stop import stop_after_attempt
1516
from tenacity.wait import wait_fixed
1617

1718

18-
async def slow_task(delay):
19-
time.sleep(delay) # noqa: ASYNC101
19+
async def slow_sync_sleeper_task(delay):
20+
time.sleep(delay) # noqa: ASYNC251
2021

2122

2223
@retry(wait=wait_fixed(1), stop=stop_after_attempt(2))
@@ -25,18 +26,30 @@ async def fails_to_reach_pg_db():
2526

2627

2728
@pytest.fixture
28-
def incidents_manager(event_loop) -> dict:
29-
incidents = []
29+
async def incidents_manager() -> dict:
30+
incidents: LimitedOrderedStack[SlowCallback] = LimitedOrderedStack[SlowCallback](
31+
max_size=10
32+
)
3033
monitor_slow_callbacks.enable(slow_duration_secs=0.2, incidents=incidents)
3134

32-
asyncio.ensure_future(slow_task(0.3), loop=event_loop) # noqa: RUF006
33-
asyncio.ensure_future(slow_task(0.3), loop=event_loop) # noqa: RUF006
34-
asyncio.ensure_future(slow_task(0.4), loop=event_loop) # noqa: RUF006
35+
f1 = asyncio.ensure_future(
36+
slow_sync_sleeper_task(0.3), loop=asyncio.get_event_loop()
37+
)
38+
assert f1
39+
f2 = asyncio.ensure_future(
40+
slow_sync_sleeper_task(0.3), loop=asyncio.get_event_loop()
41+
)
42+
assert f2
43+
f3 = asyncio.ensure_future(
44+
slow_sync_sleeper_task(0.4), loop=asyncio.get_event_loop()
45+
)
46+
assert f3
3547

3648
incidents_pg = None # aiopg_utils.monitor_pg_responsiveness.enable()
37-
asyncio.ensure_future(fails_to_reach_pg_db(), loop=event_loop) # noqa: RUF006
49+
f4 = asyncio.ensure_future(fails_to_reach_pg_db(), loop=asyncio.get_event_loop())
50+
assert f4
3851

39-
return {"slow_callback": incidents, "posgres_responsive": incidents_pg}
52+
return {"slow_callback": incidents, "postgres_responsive": incidents_pg}
4053

4154

4255
@pytest.fixture

packages/service-library/tests/aiohttp/test_requests_validation.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# pylint: disable=unused-argument
33
# pylint: disable=unused-variable
44

5+
import asyncio
56
import json
67
from collections.abc import Callable
78
from uuid import UUID
@@ -99,7 +100,7 @@ def create_fake(cls, faker: Faker):
99100

100101

101102
@pytest.fixture
102-
def client(event_loop, aiohttp_client: Callable, faker: Faker) -> TestClient:
103+
def client(aiohttp_client: Callable, faker: Faker) -> TestClient:
103104
"""
104105
Some app that:
105106
@@ -162,7 +163,7 @@ async def _middleware(request: web.Request, handler):
162163
# adds handler
163164
app.add_routes([web.get("/projects/{project_uuid}", _handler)])
164165

165-
return event_loop.run_until_complete(aiohttp_client(app))
166+
return asyncio.get_event_loop().run_until_complete(aiohttp_client(app))
166167

167168

168169
@pytest.fixture
@@ -219,7 +220,6 @@ async def test_parse_request_with_invalid_path_params(
219220
body: MyBody,
220221
headers_params: MyRequestHeadersParams,
221222
):
222-
223223
r = await client.get(
224224
"/projects/invalid-uuid",
225225
params=query_params.as_params(),
@@ -250,7 +250,6 @@ async def test_parse_request_with_invalid_query_params(
250250
body: MyBody,
251251
headers_params: MyRequestHeadersParams,
252252
):
253-
254253
r = await client.get(
255254
f"/projects/{path_params.project_uuid}",
256255
params={},
@@ -281,7 +280,6 @@ async def test_parse_request_with_invalid_body(
281280
query_params: MyRequestQueryParams,
282281
headers_params: MyRequestHeadersParams,
283282
):
284-
285283
r = await client.get(
286284
f"/projects/{path_params.project_uuid}",
287285
params=query_params.as_params(),
@@ -319,7 +317,6 @@ async def test_parse_request_with_invalid_json_body(
319317
query_params: MyRequestQueryParams,
320318
headers_params: MyRequestHeadersParams,
321319
):
322-
323320
r = await client.get(
324321
f"/projects/{path_params.project_uuid}",
325322
params=query_params.as_params(),
@@ -338,7 +335,6 @@ async def test_parse_request_with_invalid_headers_params(
338335
body: MyBody,
339336
headers_params: MyRequestHeadersParams,
340337
):
341-
342338
r = await client.get(
343339
f"/projects/{path_params.project_uuid}",
344340
params=query_params.as_params(),
@@ -364,7 +360,6 @@ async def test_parse_request_with_invalid_headers_params(
364360

365361

366362
def test_parse_request_query_parameters_as_with_order_by_query_models():
367-
368363
OrderQueryModel = create_ordering_query_model_class(
369364
ordering_fields={"modified", "name"}, default=OrderBy(field="name")
370365
)

services/web/server/tests/conftest.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
# pylint: disable=unused-argument
44
# pylint: disable=unused-variable
55

6-
import asyncio
76
import json
87
import logging
98
import random
@@ -479,11 +478,3 @@ def mock_dynamic_scheduler(mocker: MockerFixture) -> None:
479478
"simcore_service_webserver.dynamic_scheduler.api.update_projects_networks",
480479
autospec=True,
481480
)
482-
483-
484-
@pytest.fixture
485-
async def loop(
486-
event_loop: asyncio.AbstractEventLoop,
487-
) -> asyncio.AbstractEventLoop:
488-
"""Override the event loop inside pytest-aiohttp with the one from pytest-asyncio."""
489-
return event_loop

services/web/server/tests/unit/with_dbs/03/users/conftest.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323

2424

2525
@pytest.fixture
26-
def web_server(
27-
event_loop: asyncio.AbstractEventLoop,
26+
async def web_server(
2827
app_environment: EnvVarsDict, # configs
2928
postgres_db: sa.engine.Engine, # db-ready
3029
webserver_test_server_port: int,
@@ -37,7 +36,7 @@ def web_server(
3736
setup_settings(app)
3837
setup_db(app)
3938

40-
return event_loop.run_until_complete(
39+
return asyncio.get_running_loop().run_until_complete(
4140
aiohttp_server(app, port=webserver_test_server_port)
4241
)
4342

0 commit comments

Comments
 (0)