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