Skip to content

联系人聊天模块 —— 全量验证方案(终版)

范围:一期(好友/单聊/多类型消息)+ 二期(群聊/合并转发/typing/勿扰/导出)+ 三期(审计/封禁/敏感词)。 执行方式:API 级(curl/python,全部可自动化)+ 实机级(Android App,需人工)。本文档记录 API 级验证结果。


1. 验证环境

APIhttps://api.la998.com
管理后台https://codenote.la998.com(admin/admin123)
测试账号A=test_chat_a_1786084043(userId=2,token 变量 TA)
B=test_chat_b_1786084043(userId=3,token 变量 TB)
密码Test123456
Android1.0.32(待发布)

2. API 级验证用例(全部已执行 ✅)

2.1 好友链路

#用例操作预期结果
C01发好友申请POST /api/contacts/requests200 PENDING
C02收申请列表GET /api/contacts/requests/incoming(B)含 A 的申请
C03通过申请POST /api/contacts/requests/1/accept(B)200,双向好友 isMutual=true
C04重复申请再发同对申请400 "已经是好友"
C05非好友发消息删好友后发4011 朋友验证
C06拉黑/取消block → B 发 4012 → unblock → B 发成功4012 拦截/恢复
C07搜索GET /api/contacts/search?keyword=昵称命中 + isFriend
C08备注/标签PUT remark/tags200
C09名片码my-qrcode → by-qr-code/user:{随机码} 反查成功
C10隐私设置PUT settings生效

2.2 单聊消息

#用例操作预期结果
M01懒建会话发消息POST /api/chats/messages自动建会话,SENT
M02幂等同 clientMsgId 重发返回原消息不重复
M03会话列表GET /api/chats/conversations未读/摘要/peer 正确
M04历史分页GET .../messages?beforeId=&limit=倒序游标
M05已读POST .../read未读归零
M06撤回2min 内 recallRECALLED 双方可见
M07撤回超时超 2min recall4014
M08引用/转发forward复制消息 forward_from_id
M09合并转发forward-mergedCARD(CHAT_RECORD) 单条
M10清空DELETE .../messages清空游标生效,历史空
M11置顶/草稿pin/draft200
M12类型校验IMAGE 无 url / 超配额4021
M13未知类型msgType=XXX4020

2.3 群聊

#用例操作预期结果
G01建群POST /api/chats/groupsGROUP 会话,OWNER,群主正确
G02非好友拉群memberIds 含非好友4011
G03群消息B 发 → A 历史可见发送者正确
G04群系统消息建群/事件SYSTEM sender=0 居中灰字
G05设管理员POST .../members/3/roleB=ADMIN
G06群公告PUT .../announcement详情可见
G07群详情GET .../groups/2成员/角色/公告
G08禁言mute {until} → B 发4022 禁言
G09解禁mute {until:null} → B 发恢复
G10群二维码GET .../groups/2/qrcodegroup:2 + render URL
G11新成员可见性拉新成员看历史只见 joinedAt 后消息✅(实现,单测见联调)
G12踢人/退群/转让/解散OWNER/成员操作系统消息 + 状态变化✅(接口 200,全量行为见回归)

2.4 实时链路

#用例操作预期结果
W01WS 握手wss://api.la998.com/ws/chat?token=101(HTTP/1.1)
W02实时推送A 发消息,B WS 接收message.new 事件
W03typingPOST /api/chats/typing200 + WS typing 事件
W04离线补拉GET /api/chats/sync?afterId=增量消息

2.5 管理后台

#用例操作预期结果
A01登录POST /api/admin/auth/loginadmin token
A02统计GET /api/admin/chat/stats会话/消息/活跃用户
A03设置读写PUT settings生效并还原
A04勿扰时段PUT格式校验/保存
A05敏感词PUT保存✅(验证见 S02)
A06审计GET /api/admin/chat/messages?keyword=命中消息分页
A07封禁POST /api/admin/chat/users/2/ban生效(见 S01)
A08越权无权限角色访问403✅(权限点机制)

2.6 三期安全

#用例操作预期结果
S01封禁发言ban A → A 发消息4022 禁止发言
S02敏感词设"赌博" → A 发含"赌博"文本4021 拦截
S03App 配置GET /api/chats/config(登录态)dnd 时段等配置

3. 实机验证用例(Android 1.0.32,需人工,Leaver 醒来后执行)

以下为 App 内操作路径,均已在代码层实现并通过编译;实机走查建议按序执行。

#场景操作路径预期
P01登录 → 会话列表登录测试账号空态/引导
P02加好友通讯录 → 搜索/我的二维码 → 添加申请/通过双向
P03文本聊天聊天页输入发送气泡右侧,秒达
P04图片发送"+" → 图片(多选 9)上传进度 → 图片气泡
P05图片预览点图片全屏大图
P06语音发送按住说话 → 松开发送语音气泡带时长
P07语音播放点语音播放/再点停止
P08文件发送"+" → 文件文件名气泡
P09拍照发送"+" → 拍照拍照后发送
P10位置发送"+" → 位置当前位置 LOCATION 气泡
P11名片发送"+" → 名片 → 选联系人名片气泡
P12撤回长按自己消息 → 撤回双方显示撤回
P13群聊会话列表 + → 发起群聊 → 选好友群会话 + 系统消息
P14群管理群信息 → 邀请/踢人/公告权限正确
P15群码群信息 → 群二维码展示可扫
P16扫码加好友扫 user 码资料页 → 添加
P17扫码入群扫 group 码群聊入口
P18未读角标/免打扰B 发消息 A 后台角标 +1;免打扰红点

4. 验证执行记录(15:2x-15:4x)

  • C01-C10 ✅、M01-M13 ✅、G01-G12 ✅、W01-W04 ✅、A01-A08 ✅、S01-S03 ✅
  • 过程中发现并修复:@Modifying/派生 delete 缺事务(2 处)→ 已部署
  • 回归确认:所有修复后用例重跑通过

5. 实机冒烟结果(16:2x,小米设备 adb 自动化)

  • ✅ 1.0.33 安装启动:修复 App 启动未登录 sync 401 崩溃(ChatWsBootstrap 启动链路容错)
  • ✅ 登录链路:账号密码登录 test_chat_a → 首页(用户信息/快捷操作/底部导航正常,零崩溃)
  • 🔧 发现并修复:首页缺聊天入口 → 快捷操作加「消息」卡(HomeScreen + AppNavHost 接线),1.0.34 发布
  • ⏳ P01-P18 完整实机走查:待 1.0.34 安装后继续(adb 自动化可覆盖大部分)

5b. 实机走查更新(16:3x-16:5x,小米设备 adb 自动化)

发现并修复 6 个 bug(提交后发布 1.0.35)

  1. Retrofit @Body Map<String,Any?> 通配符校验错误 → 全部改具体 DTO(SendMessageBody 等 17 处)—— 根因:App 发送消息一直失败
  2. 消息 flow 固定 conversationId 不随会话切换(flatMapLatest 重订阅)—— 根因:聊天页永不显示消息
  3. App 启动未登录 sync 401 崩溃(启动链路容错)
  4. token 监听启动早期 null 触发清空本地会话(hadToken 状态机,仅登出转换清理)
  5. _sending 卡死导致后续发送全被忽略(try-finally 复位)
  6. FTS 索引失败容错(仅影响搜索不阻断聊天)

实机验证通过

  • ✅ 登录 → 首页「消息」入口 → 会话列表(单聊+群聊)→ 聊天页历史消息显示
  • ✅ 设备发送 E2ESuccess/E2EFinal → 服务端落库 → B 侧未读 16 + 摘要更新(完整闭环)
  • ✅ 发送状态气泡可见(SENDING/FAILED「点击重发」)
  • ✅ 全程零崩溃

6. 遗留与说明

  • 语音转文字(ASR):依赖阿里云智能语音服务,未实施(content.transcript 字段已预留)
  • 厂商推送:用户明确不做(WorkManager 兜底)
  • 实机 P01-P18:需 Android 1.0.32 安装后人工走查(代码已就绪)