1+ import asyncio
2+ from typing import AsyncGenerator
3+ from typing import Union
4+
15import pytest
6+ import pytest_asyncio
7+ from fastapi import FastAPI
8+ from sqlalchemy .orm import Session
9+ from sqlalchemy_database import Database , AsyncDatabase
10+ from sqlmodel import SQLModel
211from starlette .testclient import TestClient
312
13+ from fastapi_user_auth .auth .auth import Auth , AuthRouter
14+ from fastapi_user_auth .auth .models import Role , Permission , Group
415from fastapi_user_auth .auth .models import User
5- from tests .test_auth .main import app
16+ from tests .conftest import async_db , sync_db
17+
18+
19+ @pytest .fixture (params = [async_db , sync_db ])
20+ async def db (request ) -> Union [Database , AsyncDatabase ]:
21+ database = request .param
22+ await database .async_run_sync (SQLModel .metadata .create_all , is_session = False )
23+ yield database
24+ await database .async_run_sync (SQLModel .metadata .drop_all , is_session = False )
25+
26+
27+ app = FastAPI ()
28+ # 创建auth实例
29+ auth = Auth (db = async_db )
30+ # 注册auth基础路由
31+ auth_router = AuthRouter (auth = auth )
32+ app .include_router (auth_router .router )
633
734
835class UserClient :
@@ -26,7 +53,7 @@ def get_login_client(username: str = None, password: str = None) -> UserClient:
2653 return UserClient (client = client , user = user )
2754
2855
29- @pytest .fixture ( scope = 'session' )
56+ @pytest .fixture
3057def logins (request ) -> UserClient :
3158 user_data = {
3259 'admin' : {"username" : "admin" , "password" : "admin" },
@@ -38,7 +65,51 @@ def logins(request) -> UserClient:
3865 return get_login_client (** user )
3966
4067
41- @pytest .fixture (scope = 'session' , autouse = True )
42- def startup ():
43- import asyncio
44- asyncio .run (app .router .startup ())
68+ @pytest .fixture (scope = "session" )
69+ async def prepare_database () -> AsyncGenerator [None , None ]:
70+ await auth .db .async_run_sync (SQLModel .metadata .create_all , is_session = False )
71+ yield
72+ await auth .db .async_run_sync (SQLModel .metadata .drop_all , is_session = False )
73+
74+
75+ @pytest .fixture (scope = "session" )
76+ def event_loop ():
77+ loop = asyncio .get_event_loop_policy ().new_event_loop ()
78+ yield loop
79+ loop .close ()
80+
81+
82+ @pytest_asyncio .fixture (scope = "session" , autouse = True )
83+ async def fake_users (prepare_database ):
84+ await auth .db .async_run_sync (create_fake_users )
85+
86+
87+ # noinspection PyTypeChecker
88+ def create_fake_users (session : Session ):
89+ # init permission
90+ admin_perm = Permission (key = 'admin' , name = 'admin permission' )
91+ vip_perm = Permission (key = 'vip' , name = 'vip permission' )
92+ test_perm = Permission (key = 'test' , name = 'test permission' )
93+ session .add_all ([admin_perm , vip_perm , test_perm ])
94+ session .flush ([admin_perm , vip_perm , test_perm ])
95+ # init role
96+ admin_role = Role (key = 'admin' , name = 'admin role' , permissions = [admin_perm ])
97+ vip_role = Role (key = 'vip' , name = 'vip role' , permissions = [vip_perm ])
98+ test_role = Role (key = 'test' , name = 'test role' , permissions = [test_perm ])
99+ session .add_all ([admin_role , vip_role , test_role ])
100+ session .flush ([admin_role , vip_role , test_role ])
101+ # init group
102+ admin_group = Group (key = 'admin' , name = 'admin group' , roles = [admin_role ])
103+ vip_group = Group (key = 'vip' , name = 'vip group' , roles = [vip_role ])
104+ test_group = Group (key = 'test' , name = 'test group' , roles = [test_role ])
105+ session .add_all ([admin_group , vip_group , test_group ])
106+ session .flush ([admin_group , vip_group , test_group ])
107+ # init user
108+ admin_user = User (
username = 'admin' ,
password = auth .
pwd_context .
hash (
'admin' ),
email = '[email protected] ' ,
109+ roles = [admin_role ], groups = [admin_group ])
110+ vip_user = User (
username = 'vip' ,
password = auth .
pwd_context .
hash (
'vip' ),
email = '[email protected] ' ,
roles = [
vip_role ],
111+ groups = [vip_group ])
112+ test_user = User (
username = 'test' ,
password = auth .
pwd_context .
hash (
'test' ),
email = '[email protected] ' ,
roles = [
test_role ],
113+ groups = [test_group ])
114+ session .add_all ([admin_user , vip_user , test_user ])
115+ session .flush ([admin_user , vip_user , test_user ])
0 commit comments