diff --git a/tests/test_golden.py b/tests/test_golden.py index 3414712..bd5c08f 100644 --- a/tests/test_golden.py +++ b/tests/test_golden.py @@ -15,6 +15,7 @@ tests/golden/responses.json 是**删除 Flask 之前**从 Flask 应用捕获的 """ import hashlib import json +import shutil import sqlite3 import time from pathlib import Path @@ -23,6 +24,7 @@ import pytest from fastapi.testclient import TestClient import auth_system +import core.db as core_db from core import session as cs _GOLDEN = Path(__file__).parent / 'golden' / 'responses.json' @@ -34,8 +36,12 @@ def _load_cases(): def _session_for(role): - """按当前库中该角色用户的 login_seq 造一份合法会话 Cookie。""" - conn = sqlite3.connect('data/site.db') + """按当前库中该角色用户的 login_seq 造一份合法会话 Cookie。 + + 读的是 `auth_system.DB_PATH`(而非写死 'data/site.db')——fixture 已把它 + 指向临时副本,这样造 Cookie 与请求命中的是同一个库。 + """ + conn = sqlite3.connect(str(auth_system.DB_PATH)) conn.row_factory = sqlite3.Row try: where = "role = 'admin'" if role == 'admin' else "role != 'admin' AND status = 1" @@ -52,9 +58,28 @@ def _session_for(role): }) +def _copy_db(src: Path, dst: Path) -> None: + """复制站点库到临时目录(含 WAL 边车文件,保证副本与生产一致)。""" + shutil.copyfile(src, dst) + for suffix in ('-wal', '-shm'): + side = Path(str(src) + suffix) + if side.exists(): + shutil.copyfile(side, Path(str(dst) + suffix)) + + @pytest.fixture() def client(tmp_path, monkeypatch): - # 站点库仍用生产 data/site.db(只读),密钥 patch 成固定值以便造 Cookie + # 站点库取生产数据的**副本**,不是生产库本身。 + # 曾经直接指向 data/site.db 并注释为「只读」——但快照里 2 条 POST /download + # 会走 reserve_and_open 开账、失败后 settle_refund 退款,即**每次跑测试都往 + # 生产库插 2 行 rejected 台账**(净余额为 0,但污染台账与后台视图,还会 + # 把 users.last_active 顶到测试时刻)。改成副本后契约保真度不变(同一份数据), + # 写入全部落在 tmp_path。 + _copy_db(Path('data/site.db'), tmp_path / 'site.db') + monkeypatch.setattr(auth_system, 'DATA_DIR', tmp_path) + monkeypatch.setattr(auth_system, 'DB_PATH', tmp_path / 'site.db') + monkeypatch.setattr(core_db, 'DATA_DIR', tmp_path) + monkeypatch.setattr(core_db, 'DB_PATH', tmp_path / 'site.db') monkeypatch.setattr('web.deps.secret_key', lambda: SECRET) monkeypatch.setattr(auth_system, 'get_secret_key', lambda: SECRET) from web.app import create_app