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

1from contextlib import contextmanager 1abcdefg

2from typing import Any, Generator 1abcdefg

3 

4import pytest 1abcdefg

5from fastapi import Depends, FastAPI, WebSocket 1abcdefg

6from fastapi.testclient import TestClient 1abcdefg

7from typing_extensions import Annotated 1abcdefg

8 

9 

10class Session: 1abcdefg

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

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

13 self.open = True 1hoipjqkrlsmtnu

14 

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

21 

22 

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

30 

31 

32def dep_session() -> Any: 1abcdefg

33 with acquire_session() as s: 1hijklmn

34 yield s 1hijklmn

35 

36 

37def broken_dep_session() -> Any: 1abcdefg

38 with acquire_session() as s: 1opqrstu

39 s.open = False 1opqrstu

40 yield s 1opqrstu

41 

42 

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

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

45 

46app = FastAPI() 1abcdefg

47 

48 

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

54 

55 

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 

61 

62 

63client = TestClient(app) 1abcdefg

64 

65 

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

74 

75 

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