Skip to content

Commit 7ce86bd

Browse files
Resolve pytest warnings (#127)
Why === Running `pytest` reports two warnings, it should not. What changed ============ - `client` depends on `NoError`, but since by the time pytest is initialized the package has already been imported, pytest raises a warning. Move `client` (and `server`, for completeness,) out into a plugin. - `tool.pytest.ini_options.env` isn't recognized without `pytest-env` Test plan ========= CI
1 parent 5c96f74 commit 7ce86bd

File tree

4 files changed

+82
-62
lines changed

4 files changed

+82
-62
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ dev-dependencies = [
4343
"pytest>=7.4.0",
4444
"pytest-asyncio>=0.21.1",
4545
"pytest-cov>=4.1.0",
46+
"pytest-env>=1.1.5",
4647
"pytest-mock>=3.11.1",
4748
"ruff>=0.0.278",
4849
"types-protobuf>=4.24.0.20240311",

tests/conftest.py

Lines changed: 2 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,20 @@
1-
import asyncio
2-
import logging
3-
from typing import Any, AsyncGenerator, Literal, Mapping
1+
from typing import Any, Mapping
42

53
import nanoid
64
import pytest
75
from opentelemetry import trace
86
from opentelemetry.sdk.trace import TracerProvider
97
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
108
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
11-
from websockets.server import serve
129

13-
from replit_river.client import Client
14-
from replit_river.client_transport import UriAndMetadata
1510
from replit_river.error_schema import RiverError
1611
from replit_river.rpc import (
1712
GenericRpcHandler,
1813
TransportMessage,
1914
)
20-
from replit_river.server import Server
21-
from replit_river.transport_options import TransportOptions
22-
from tests.river_fixtures.logging import NoErrors
2315

2416
# Modular fixtures
25-
pytest_plugins = ["tests.river_fixtures.logging"]
17+
pytest_plugins = ["tests.river_fixtures.logging", "tests.river_fixtures.clientserver"]
2618

2719
HandlerMapping = Mapping[tuple[str, str], tuple[str, GenericRpcHandler]]
2820

@@ -68,58 +60,6 @@ def deserialize_error(response: dict) -> RiverError:
6860
return RiverError.model_validate(response)
6961

7062

71-
@pytest.fixture
72-
def transport_options() -> TransportOptions:
73-
return TransportOptions()
74-
75-
76-
@pytest.fixture
77-
def server_handlers(handlers: HandlerMapping) -> HandlerMapping:
78-
return handlers
79-
80-
81-
@pytest.fixture
82-
def server(
83-
transport_options: TransportOptions, server_handlers: HandlerMapping
84-
) -> Server:
85-
server = Server(server_id="test_server", transport_options=transport_options)
86-
server.add_rpc_handlers(server_handlers)
87-
return server
88-
89-
90-
@pytest.fixture
91-
async def client(
92-
server: Server,
93-
transport_options: TransportOptions,
94-
no_logging_error: NoErrors,
95-
) -> AsyncGenerator[Client, None]:
96-
async def websocket_uri_factory() -> UriAndMetadata[None]:
97-
return {
98-
"uri": "ws://localhost:8765",
99-
"metadata": None,
100-
}
101-
102-
try:
103-
async with serve(server.serve, "localhost", 8765):
104-
client: Client[Literal[None]] = Client[None](
105-
uri_and_metadata_factory=websocket_uri_factory,
106-
client_id="test_client",
107-
server_id="test_server",
108-
transport_options=transport_options,
109-
)
110-
try:
111-
yield client
112-
finally:
113-
logging.debug("Start closing test client : %s", "test_client")
114-
await client.close()
115-
finally:
116-
await asyncio.sleep(1)
117-
logging.debug("Start closing test server")
118-
await server.close()
119-
# Server should close normally
120-
no_logging_error()
121-
122-
12363
@pytest.fixture(scope="session")
12464
def span_exporter() -> InMemorySpanExporter:
12565
exporter = InMemorySpanExporter()
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import asyncio
2+
import logging
3+
from typing import AsyncGenerator, Literal
4+
5+
import pytest
6+
from websockets.server import serve
7+
8+
from replit_river.client import Client
9+
from replit_river.client_transport import UriAndMetadata
10+
from replit_river.server import Server
11+
from replit_river.transport_options import TransportOptions
12+
from tests.conftest import HandlerMapping
13+
from tests.river_fixtures.logging import NoErrors # noqa: E402
14+
15+
16+
@pytest.fixture
17+
def transport_options() -> TransportOptions:
18+
return TransportOptions()
19+
20+
21+
@pytest.fixture
22+
def server_handlers(handlers: HandlerMapping) -> HandlerMapping:
23+
return handlers
24+
25+
26+
@pytest.fixture
27+
def server(
28+
transport_options: TransportOptions, server_handlers: HandlerMapping
29+
) -> Server:
30+
server = Server(server_id="test_server", transport_options=transport_options)
31+
server.add_rpc_handlers(server_handlers)
32+
return server
33+
34+
35+
@pytest.fixture
36+
async def client(
37+
server: Server,
38+
transport_options: TransportOptions,
39+
no_logging_error: NoErrors,
40+
) -> AsyncGenerator[Client, None]:
41+
async def websocket_uri_factory() -> UriAndMetadata[None]:
42+
return {
43+
"uri": "ws://localhost:8765",
44+
"metadata": None,
45+
}
46+
47+
try:
48+
async with serve(server.serve, "localhost", 8765):
49+
client: Client[Literal[None]] = Client[None](
50+
uri_and_metadata_factory=websocket_uri_factory,
51+
client_id="test_client",
52+
server_id="test_server",
53+
transport_options=transport_options,
54+
)
55+
try:
56+
yield client
57+
finally:
58+
logging.debug("Start closing test client : %s", "test_client")
59+
await client.close()
60+
finally:
61+
await asyncio.sleep(1)
62+
logging.debug("Start closing test server")
63+
await server.close()
64+
# Server should close normally
65+
no_logging_error()

uv.lock

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)