# -*- coding: utf-8 -*- """共享夹具:临时 SQLite 数据库 + TestClient(auth 与 rbac 测试共用)。 方案:monkeypatch config.DATABASE_URL 为临时异步 SQLite,让应用 lifespan 在 TestClient 自身的事件循环内建库/种子,避免异步引擎跨事件循环问题。测试函数 保持同步(TestClient 内部驱动 async 应用)。 """ from __future__ import annotations import pytest from fastapi.testclient import TestClient from app import config as app_config from app.main import app @pytest.fixture() def client(tmp_path, monkeypatch): """把数据库指向临时 SQLite,保证测试隔离。""" monkeypatch.setattr( app_config, "DATABASE_URL", f"sqlite+aiosqlite:///{tmp_path}/test.db", ) # 清掉上一测试残留的 app.state.db,强制 lifespan 用当前 tmp URL 新建库 if hasattr(app.state, "db"): app.state.db = None with TestClient(app) as c: yield c