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

1from contextlib import contextmanager 1abcdef

2from typing import Any, Generator 1abcdef

3 

4import pytest 1abcdef

5from fastapi import Depends, FastAPI, WebSocket 1abcdef

6from fastapi.testclient import TestClient 1abcdef

7from typing_extensions import Annotated 1abcdef

8 

9 

10class Session: 1abcdef

11 def __init__(self) -> None: 1abcdef

12 self.data = ["foo", "bar", "baz"] 1gmhniojpkqlr

13 self.open = True 1gmhniojpkqlr

14 

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

21 

22 

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

30 

31 

32def dep_session() -> Any: 1abcdef

33 with acquire_session() as s: 1ghijkl

34 yield s 1ghijkl

35 

36 

37def broken_dep_session() -> Any: 1abcdef

38 with acquire_session() as s: 1mnopqr

39 s.open = False 1mnopqr

40 yield s 1mnopqr

41 

42 

43SessionDep = Annotated[Session, Depends(dep_session)] 1abcdef

44BrokenSessionDep = Annotated[Session, Depends(broken_dep_session)] 1abcdef

45 

46app = FastAPI() 1abcdef

47 

48 

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

54 

55 

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 

61 

62 

63client = TestClient(app) 1abcdef

64 

65 

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

74 

75 

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