Files
meida_backend/tests
xsl 140a63effa feat(identity): refresh token rotation with server-side revocable sessions
id_session 落地:opaque refresh(token_urlsafe(48))+ sha256 哈希存储 +
一次性轮换(旧行撤销与新行同一事务)+ logout 幂等撤销 + 已撤销重放检测
告警(V1 不做家族连坐);错误码 40103/40104/40105 接入。新增 POST
/auth/refresh、POST /auth/logout;dev-token 扩展为双令牌,旧字段
access_token/token_type/expires_in/user_id 原名保留,新增
refresh_token/refresh_expires_in(smoke.sh 不受影响)。

测试:tests/unit/test_refresh_tokens.py 覆盖 token 长度/字符域/唯一性、
哈希稳定性与不可逆(7 例,不连网不连库);tests/integration/
test_auth_refresh.py 覆盖轮换后新 access 可调 /quota、旧 refresh 二次
使用 40105、logout 后失效 40105、伪造 40103、TTL=0 过期 40104(5 例)。
门禁全绿:ruff check/format、mypy 两段、lint-imports 4 契约、
单测 176 通过、集成 8 通过。

偏差说明:1) SessionIssued 较任务文档字段清单增加 user_id ——
/auth/refresh 换发 access JWT 必须知道用户,opaque refresh 本身不携带
信息,只能随签发结果带回;2) 过期分支「顺手落库 revoked=true」在 HTTP
路径会随 401 的统一回滚一起丢失(仅事务内标记,已注释说明,不影响判定
语义);3) repo 撤销用 SELECT FOR UPDATE + ORM 变更而非 UPDATE
rowcount —— 对齐 billing.repo 现行模式,且 rowcount 在 mypy 下类型
不可用。
2026-08-14 16:21:52 +08:00
..

tests/

目录 内容 依赖
unit/ 领域逻辑、LLM 网关、脱敏、错误码 无。不许连库、不许发网络请求
integration/ 带 PostgreSQL / Redis 的链路 make up,或 testcontainers
golden/ 黄金集回归(检索 / 规则 / 报告) 尚未建立,见下
make test-unit                       # 默认只跑 unit(integration 自动跳过)
MEIDA_RUN_INTEGRATION=1 uv run pytest -m integration

覆盖率门槛

pytest 对 packages/llm 与 packages/domain 统计覆盖率,低于阈值即失败。 这两个包是 mypy strict 的范围,也是业务正确性的核心,其他层靠集成测试覆盖。

绝对不要做的事

  • 不要在单测里调用真实的 DeepSeek。scripts/smoke.sh 是唯一会真的花钱的 入口。单测用 httpx.MockTransport 或 tests/unit/test_gateway.py 里的 FakeProvider。
  • 不要 time.sleep()。熔断器、预算闸门都支持注入时钟。
  • 不要断言日志文本。断言行为。

黄金集(还没建,但这是最重要的一道防线)

架构 §16.2:

AI 改代码时最容易破坏的是那些「没有断言保护的隐性行为」。检索链路和规则引擎 必须有一套固定输入 → 期望输出的样本集。

M2 落地知识库时必须同步建立(FR-KB-11,≥ 100 条用例): 检索 Top-5 命中率 ≥ 80%、硬过滤零漏、规则命中正确性、报告结构完整性、 硬性禁忌违反数 = 0。指标退化即阻断合并。

已覆盖的关键不变量

测试 保护的是什么
test_prompt_cache_prefix.py 固定前缀不含易变 token,否则输入成本翻数倍
test_daily_budget.py 日成本超限时拒绝非关键调用,不是只告警
test_gateway.py 路由、故障转移、熔断、结构化重试、每次调用都记成本
test_quota_domain.py 预扣三段式;退还幂等;服务端硬校验
test_task_state.py 任务状态机没有非法跃迁
test_log_redaction.py 手机号 / 令牌 / 密钥 / 诊断结论不进日志
test_response_envelope.py 每个错误码都有文案;配额文案不含价格字样