mirror of
https://github.com/panatgithub/AnkiHeadingSync.git
synced 2026-07-22 17:10:28 +00:00
English: Ensure that decks with unknown statistics are not incorrectly treated as empty candidates for cleanup. 中文:确保统计信息未知的牌组不会被错误地视为待清理的空牌组。
1.7 KiB
1.7 KiB
Empty Deck Cleanup Fix Gap Report
审查范围
本次修复只覆盖空牌组候选判定链路:
AnkiGateway.getDeckStatsAnkiConnectGateway.getDeckStatsCleanupEmptyDecksUseCase- 空牌组清理相关测试
当前缺口
1. gateway 把缺失统计直接映射成 0
AnkiConnectGateway.getDeckStats 当前实现:
- 调用
getDeckStats - 对每个请求 deck 读取
rawStats[deckName]?.total_in_deck ?? 0
问题:
- 返回对象缺 key 时,会把 unknown 误判成
0 - 返回结构不符合预期时,也会把 unknown 误判成
0 - 这违反了
missing != empty
2. use case 继续把 unknown 当 empty
CleanupEmptyDecksUseCase 当前实现有两处同类问题:
listCandidates()直接用noteCount === 0,但上游已经把 unknown 压成了 0execute()用(currentDeckStatsByName.get(deckName) ?? 0) === 0判定可删除,missing stats 会再次被当成空牌组
3. test fake 也把缺失统计默认成 0
FakeManualSyncAnkiGateway.getDeckStats() 目前对缺失 deck 返回 { noteCount: 0 }。
这让测试层也继承了同样的危险默认值,无法覆盖“deck 列表存在,但 stats 缺失”的场景。
4. 现有测试只覆盖理想返回
当前测试只覆盖:
- 请求 deck 与返回 stats 一一对应
total_in_deck明确为 0 或正数
缺少:
- 返回缺 key
- 返回空对象
- 只返回部分 deck
- 返回结构不含
total_in_deck
修复目标
本次修复必须把判定收紧为:
- 只有 Anki 明确返回
total_in_deck === 0才算 empty - 缺失/未知/结构不匹配一律视为 unknown
- unknown 不进入 cleanup candidates
- stats 不完整时宁可少列,不可多列