| """L2+ 共用 fixture:每測試重置 DB(in-memory)+ disable rate-limit。""" |
| from __future__ import annotations |
|
|
| import os |
| import tempfile |
|
|
| import pytest |
|
|
| |
| os.environ.setdefault("KBV5_DB", ":memory:") |
| os.environ.setdefault("KBV5_ENV", "dev") |
| os.environ.setdefault("JWT_SECRET", "test-secret-please-change-me-32chars-or-longer-ok") |
| os.environ.setdefault("KBV5_SEED", "0") |
| os.environ.setdefault("KBV5_RATE_LIMIT", "0") |
| os.environ.setdefault("ALLOWED_EMAIL_DOMAINS", "demo.local,x.tw") |
| os.environ.setdefault("KBV5_DISABLE_EMBEDDINGS", "1") |
| os.environ.setdefault("FEATURE_GUEST", "1") |
| os.environ.setdefault("KBV5_HIBP_OFFLINE", "1") |
| |
| os.environ.setdefault("KBV5_VARIANT_DICT", os.path.join(tempfile.gettempdir(), "kbv5_test_variants.json")) |
| |
| os.environ.setdefault("KBV5_VAULT_DIR", os.path.join(tempfile.gettempdir(), "kbv5_test_vault")) |
| os.environ.setdefault("KBV5_HISTORY_DIR", os.path.join(tempfile.gettempdir(), "kbv5_test_history")) |
| os.environ.setdefault("KBV5_TRASH_DIR", os.path.join(tempfile.gettempdir(), "kbv5_test_trash")) |
|
|
|
|
| @pytest.fixture(autouse=True) |
| def _isolate_db(monkeypatch): |
| """每個 test 用獨立 in-memory DB,並重置 jwt secret 快取與 limiter。""" |
| import app.db as db |
| from app import rate_limit as rl |
| from app.auth import jwt_utils |
|
|
| |
| db._GLOBAL_CONN = None |
| jwt_utils.reset_secret_for_tests() |
| |
| try: |
| from app.services import embeddings as _emb |
| _emb.reset_for_tests() |
| except Exception: |
| pass |
| |
| try: |
| from app.services import variant_gen as _vg |
| p = _vg.dict_path() |
| if p.exists(): |
| p.unlink() |
| _vg.reload_dict() |
| except Exception: |
| pass |
|
|
| |
| rl.disable_for_tests() |
|
|
| yield |
|
|
| |
| if db._GLOBAL_CONN is not None: |
| try: |
| db._GLOBAL_CONN.close() |
| except Exception: |
| pass |
| db._GLOBAL_CONN = None |
|
|