Coverage for tests/test_dependency_after_yield_websockets.py: 100%
52 statements
« prev ^ index » next coverage.py v7.6.1, created at 2025-12-04 08:29 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2025-12-04 08:29 +0000
1from contextlib import contextmanager 1abcdefg
2from typing import Any, Generator 1abcdefg
4import pytest 1abcdefg
5from fastapi import Depends, FastAPI, WebSocket 1abcdefg
6from fastapi.testclient import TestClient 1abcdefg
7from typing_extensions import Annotated 1abcdefg
10class Session: 1abcdefg
11 def __init__(self) -> None: 1abcdefg
12 self.data = ["foo", "bar", "baz"] 1hoipjqkrlsmtnu
13 self.open = True 1hoipjqkrlsmtnu
15 def __iter__(self) -> Generator[str, None, None]: 1abcdefg
16 for item in self.data: 1hoipjqkrlsmtnu
17 if self.open: 1hoipjqkrlsmtnu
18 yield item 1hijklmn
19 else:
20 raise ValueError("Session closed") 1opqrstu
23@contextmanager 1abcdefg
24def acquire_session() -> Generator[Session, None, None]: 1abcdefg
25 session = Session() 1hoipjqkrlsmtnu
26 try: 1hoipjqkrlsmtnu
27 yield session 1hoipjqkrlsmtnu
28 finally:
29 session.open = False 1hoipjqkrlsmtnu
32def dep_session() -> Any: 1abcdefg
33 with acquire_session() as s: 1hijklmn
34 yield s 1hijklmn
37def broken_dep_session() -> Any: 1abcdefg
38 with acquire_session() as s: 1opqrstu
39 s.open = False 1opqrstu
40 yield s 1opqrstu
43SessionDep = Annotated[Session, Depends(dep_session)] 1abcdefg
44BrokenSessionDep = Annotated[Session, Depends(broken_dep_session)] 1abcdefg
46app = FastAPI() 1abcdefg
49@app.websocket("/ws") 1abcdefg
50async def websocket_endpoint(websocket: WebSocket, session: SessionDep): 1abcdefg
51 await websocket.accept() 1hijklmn
52 for item in session: 1hijklmn
53 await websocket.send_text(f"{item}") 1hijklmn
56@app.websocket("/ws-broken") 1abcdefg
57async def websocket_endpoint_broken(websocket: WebSocket, session: BrokenSessionDep): 1abcdefg
58 await websocket.accept() 1opqrstu
59 for item in session: 1opqrstu
60 await websocket.send_text(f"{item}") # pragma no cover
63client = TestClient(app) 1abcdefg
66def test_websocket_dependency_after_yield(): 1abcdefg
67 with client.websocket_connect("/ws") as websocket: 1hijklmn
68 data = websocket.receive_text() 1hijklmn
69 assert data == "foo" 1hijklmn
70 data = websocket.receive_text() 1hijklmn
71 assert data == "bar" 1hijklmn
72 data = websocket.receive_text() 1hijklmn
73 assert data == "baz" 1hijklmn
76def test_websocket_dependency_after_yield_broken(): 1abcdefg
77 with pytest.raises(ValueError, match="Session closed"): 1opqrstu
78 with client.websocket_connect("/ws-broken"): 1opqrstu
79 pass # pragma no cover 1opqrstu