Files
meida_backend/tests
xsl 3961b6fbfa feat(admin): minimal console for KB content operations
apps/admin 独立应用:X-Admin-Token 鉴权(空=全部路由不注册=404)、实体/规则
维护与状态机流转、发布编排(publish/archive → 规则缓存 invalidate +
retrieval invalidate_cache 双失效)、素材登记与审核(tryon_ready 门禁透传)、
缺口看板(T-P2-09,FR-ADM-01~05)。V1 共享令牌鉴权,无角色无审计字段,
操作留证靠 structlog request_id。

测试:单测 tests/unit/test_admin_app.py(10 例:空令牌 404、错/缺/非 ASCII
令牌 40100、正确令牌 200 假服务、发布编排接线、幂等重放无副作用);
集成 tests/integration/test_admin_console.py(5 例:顾问全流程不碰客户端
API、双失效副作用可观察、非法跃迁 40900、素材审核门禁、缺口看板排序、
令牌 401)。483 单测 + 43 集成全绿;ruff/mypy/lint-imports 全绿。

偏差说明:
1. packages/retrieval.repo.list_gaps 有缺陷:对 select(KbGap) 的结果调
   .mappings(),行键是实体名而非列名,GapSummary(row) 取 row.gap_id 必然
   AttributeError(该路径无既有测试覆盖,接真库即暴露)。packages/** 本
   任务禁改,故缺口查询在 apps/admin/routers/gaps.py 以等价 SQL 自实现
   (hit_count 降序、同频次按 last_seen_at 降序、limit/offset 语义一致);
   建议合并阶段修复上游后切回 retrieval.list_gaps。
2. 实体 transition 的 target 收全量四态(任务文档示例仅列 reviewing/
   published/archived):按任务测试要求 published→draft 必须返回 40900
   (状态机语义冲突)而非 schema 422;draft 作为目标由服务层跃迁矩阵恒拒。
3. 规则路由以 rule_key 为路径参数(任务文档写 /rules/{id},但 RuleService
   全程以 rule_key 寻址,无按数字 id 的接口,以代码为准)。
4. 发布编排触发面含 archived(撤稿):依据 retrieval.invalidate_cache 的
   自身契约「发布/归档知识后调用」,比文档字面的「发布成功后」多了撤稿
   方向;reviewing 等其余状态不触发。
5. updated_by/author 记 "admin-console":V1 共享令牌无操作者身份,字段
   留渠道来源;运营账号体系属 V2(见包 docstring 的升级路径)。
2026-08-14 21:19:31 +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 每个错误码都有文案;配额文案不含价格字样