Files
zyt/artifacts/im-chat-history/archive-tests.md
T
2026-09-09 15:47:48 +08:00

2.7 KiB

IM 归档行为测试交付

新增 server/tests/ImChatArchiveTest.php,直接加载实际 DiagnosisLogicImRoamMessagePagerImChatSyncSession。只替换模型、Db、Cache、时钟和腾讯服务传输层;没有改动业务实现。

覆盖

  • 同患者新旧诊单读取同一归档,返回当前授权诊单 ID;其他患者和历史错误 patient_id 对应的异常账号记录不会混入。
  • callback 的 MsgTime/MsgKey 与 roam 的 MsgTimeStamp/MsgRandom/MsgKey 生成同一 canonical ID,重复到达不重复归档、不改变原诊单归属。
  • callback 必须有整数 SendMsgResult;发送失败跳过,缺失或非法类型抛错。
  • seq_random_from 键只在患者、双向账号、时间都一致时兼容。其他患者、错误账号或不同时间的旧键碰撞不会覆盖原记录,也不会压掉正确的新消息。
  • 多元素消息保存 text/image/file 完整顺序并读回 parts;匹配的旧截断消息修复内容但保留旧键和原始诊单;重复修复幂等,其他患者不变,修复写库失败向上传播。
  • current 范围只使用当前管理员账号;token 精确绑定 admin/diagnosis/patient。换登录人、换诊单、换患者、非法或过期 token 都无法请求腾讯云或修改缓存进度。
  • 医生侧和患者侧分别完整分页,共享相同扫描下界并交换 operator/peer;共享消息幂等,患者侧独有记录仍入库。
  • 只有所有页面持久化且双方视角都成功,才写该医生/患者的完整 checkpoint;值为扫描开始时间。首次下界为 0,下次双方使用完整 checkpoint 减 120 秒。
  • 医生侧或患者侧失败都保留旧 checkpoint;医生侧失败仍尝试患者侧,下一轮从原下界补拉并去重。
  • 单页数据库失败不推进缓存游标,不写完成 checkpoint,原 token 可以原游标重试。81 条消息跨两个 SQL 批次时,第二批失败不会发布完成状态,下一轮补齐且不重复第一批 80 条。
  • callback 和 CLI 同步均不吞写库错误;纯 Session 的双侧切换、其他会话继续处理、失败可见及归档失败传播也有独立断言。

运行结果

php server/tests/ImChatArchiveTest.php
IM_CHAT_ARCHIVE_TEST_OK

php -l server/tests/ImChatArchiveTest.php
No syntax errors detected

测试不会初始化 ThinkPHP 应用环境。模型和 SQL 使用严格内存替身,意外表、SQL 及更新字段会失败;腾讯服务只消费预置响应,没有网络能力。未访问业务数据库、未执行迁移、未产生真实回调或消息。

本测试验证业务方法与分页/持久化边界,不替代真实 MySQL 部署验收。未发现需要额外修改的业务问题,未提交。