Coverage for docs_src/app_testing/tutorial004.py: 100%

23 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-09-09 09:16 +0000

1from contextlib import asynccontextmanager 1mnopqr

2 

3from fastapi import FastAPI 1mnopqr

4from fastapi.testclient import TestClient 1mnopqr

5 

6items = {} 1mnopqr

7 

8 

9@asynccontextmanager 1mnopqr

10async def lifespan(app: FastAPI): 1mnopqr

11 items["foo"] = {"name": "Fighters"} 1abcdefghijkl

12 items["bar"] = {"name": "Tenders"} 1abcdefghijkl

13 yield 1abcdefghijkl

14 # clean up items 

15 items.clear() 1abcdefghijkl

16 

17 

18app = FastAPI(lifespan=lifespan) 1mnopqr

19 

20 

21@app.get("/items/{item_id}") 1mnopqr

22async def read_items(item_id: str): 1mnopqr

23 return items[item_id] 1abcdefghijkl

24 

25 

26def test_read_items(): 1mnopqr

27 # Before the lifespan starts, "items" is still empty 

28 assert items == {} 1abcdefghijkl

29 

30 with TestClient(app) as client: 1abcdefghijkl

31 # Inside the "with TestClient" block, the lifespan starts and items added 

32 assert items == {"foo": {"name": "Fighters"}, "bar": {"name": "Tenders"}} 1abcdefghijkl

33 

34 response = client.get("/items/foo") 1abcdefghijkl

35 assert response.status_code == 200 1abcdefghijkl

36 assert response.json() == {"name": "Fighters"} 1abcdefghijkl

37 

38 # After the requests is done, the items are still there 

39 assert items == {"foo": {"name": "Fighters"}, "bar": {"name": "Tenders"}} 1abcdefghijkl

40 

41 # The end of the "with TestClient" block simulates terminating the app, so 

42 # the lifespan ends and items are cleaned up 

43 assert items == {} 1abcdefghijkl