1
+ import contextlib
2
+
1
3
import pytest
2
4
import sqlalchemy
3
5
from starlette .applications import Starlette
4
6
from starlette .responses import JSONResponse
7
+ from starlette .routing import Route
5
8
from starlette .testclient import TestClient
6
9
7
10
from databases import Database , DatabaseURL
@@ -29,6 +32,7 @@ def create_test_database():
29
32
"postgresql+aiopg" ,
30
33
"sqlite+aiosqlite" ,
31
34
"postgresql+asyncpg" ,
35
+ "postgresql+psycopg" ,
32
36
]:
33
37
url = str (database_url .replace (driver = None ))
34
38
engine = sqlalchemy .create_engine (url )
@@ -45,6 +49,7 @@ def create_test_database():
45
49
"postgresql+aiopg" ,
46
50
"sqlite+aiosqlite" ,
47
51
"postgresql+asyncpg" ,
52
+ "postgresql+psycopg" ,
48
53
]:
49
54
url = str (database_url .replace (driver = None ))
50
55
engine = sqlalchemy .create_engine (url )
@@ -53,17 +58,13 @@ def create_test_database():
53
58
54
59
def get_app (database_url ):
55
60
database = Database (database_url , force_rollback = True )
56
- app = Starlette ()
57
61
58
- @app . on_event ( "startup" )
59
- async def startup ( ):
62
+ @contextlib . asynccontextmanager
63
+ async def lifespan ( app ):
60
64
await database .connect ()
61
-
62
- @app .on_event ("shutdown" )
63
- async def shutdown ():
65
+ yield
64
66
await database .disconnect ()
65
67
66
- @app .route ("/notes" , methods = ["GET" ])
67
68
async def list_notes (request ):
68
69
query = notes .select ()
69
70
results = await database .fetch_all (query )
@@ -73,14 +74,18 @@ async def list_notes(request):
73
74
]
74
75
return JSONResponse (content )
75
76
76
- @app .route ("/notes" , methods = ["POST" ])
77
77
async def add_note (request ):
78
78
data = await request .json ()
79
79
query = notes .insert ().values (text = data ["text" ], completed = data ["completed" ])
80
80
await database .execute (query )
81
81
return JSONResponse ({"text" : data ["text" ], "completed" : data ["completed" ]})
82
82
83
- return app
83
+ routes = [
84
+ Route ("/notes" , list_notes , methods = ["GET" ]),
85
+ Route ("/notes" , add_note , methods = ["POST" ]),
86
+ ]
87
+
88
+ return Starlette (routes = routes , lifespan = lifespan )
84
89
85
90
86
91
@pytest .mark .parametrize ("database_url" , DATABASE_URLS )
0 commit comments