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
« prev ^ index » next coverage.py v7.6.1, created at 2025-09-09 09:16 +0000
1from contextlib import asynccontextmanager 1mnopqr
3from fastapi import FastAPI 1mnopqr
4from fastapi.testclient import TestClient 1mnopqr
6items = {} 1mnopqr
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
18app = FastAPI(lifespan=lifespan) 1mnopqr
21@app.get("/items/{item_id}") 1mnopqr
22async def read_items(item_id: str): 1mnopqr
23 return items[item_id] 1abcdefghijkl
26def test_read_items(): 1mnopqr
27 # Before the lifespan starts, "items" is still empty
28 assert items == {} 1abcdefghijkl
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
34 response = client.get("/items/foo") 1abcdefghijkl
35 assert response.status_code == 200 1abcdefghijkl
36 assert response.json() == {"name": "Fighters"} 1abcdefghijkl
38 # After the requests is done, the items are still there
39 assert items == {"foo": {"name": "Fighters"}, "bar": {"name": "Tenders"}} 1abcdefghijkl
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