# CP关系本地真实链路测试用例

本文只记录本地真实链路验证用例。业务动作优先走 gateway HTTP、room/wallet/user/notice 服务和 RocketMQ；SQL 只用于准备本地测试数据和核对最终事实。

## 环境前置

- Docker 本地服务：MySQL、Redis、RocketMQ、gateway-service、room-service、wallet-service、user-service、notice-service。
- `user-service` 必须启用 `cp_relationship_worker`，并消费 `hyapp_room_outbox`。
- `notice-service` 必须消费 `hyapp_user_outbox`，并把 CP 申请/同意/拒绝/关系创建事件投递到腾讯云 IM。
- 本地测试账号 A、B、C 需要是同一个 `app_code=lalu` 下的完整资料用户。
- 本地 CP 礼物需要是 `gift_type_code=cp`，并在礼物配置中写入 `cp_relation_type`。
- 送礼前 A 和 B 必须都在同一个房间的 room-service presence 内。

## T01 CP礼物创建申请

步骤：

1. 准备 A、B 用户和 A 的 COIN 余额。
2. 准备 CP 礼物 `local_cp_gift_cp`，`cp_relation_type=cp`。
3. A 创建房间，A 和 B 都调用进房接口。
4. A 通过 gateway 给 B 送 CP 礼物。

验证：

- `hyapp_room.room_outbox` 有 `RoomGiftSent`，payload 中 `cp_relation_type=cp`、`gift_icon_url` 非空。
- RocketMQ `hyapp_room_outbox` 被 user-service CP consumer 消费。
- `hyapp_user.user_cp_applications` 有 A 到 B 的 pending 申请，`expires_at_ms` 为当前时间加服务端默认 24 小时。
- `hyapp_user.user_cp_gift_event_consumption` 有该 room event 的消费记录。
- `hyapp_user.user_outbox` 有 `UserCPApplicationCreated`。
- 腾讯云 IM 有 A 发给 B 的 C2C 申请消息，`Desc=cp_application_created`，payload 含 `application_id`、`relation_type=cp`、`expires_at_ms`。
- 腾讯云 IM 有发到房间群的申请消息，`Desc=cp_application_created`，payload 含 `recipient_user_id=B`、`room_id`。

## T02 B同意申请建立关系

步骤：

1. 使用 T01 产生的 `application_id`。
2. B 调用 gateway 同意申请接口。

验证：

- `user_cp_applications.status=accepted`。
- `user_cp_relationships` 新增 active 关系，A/B 无序 pair 只有一条 active 关系。
- 同一对用户其他 pending 申请被置为 `blocked`。
- `user_outbox` 有 `UserCPApplicationAccepted` 和 `UserCPRelationshipCreated`。
- 腾讯云 IM 向 A 发送 B 发出的同意结果 C2C 消息，`Desc=cp_application_accepted`。
- 腾讯云 IM 向房间群发送同意结果消息，`Desc=cp_application_accepted`，payload 含 `recipient_user_id=A`。
- 腾讯云 IM 向区域群发送关系创建消息，`Desc=cp_relationship_created`，payload 含 A/B 头像昵称短 ID、礼物 icon 和 `room_id`。

## T03 已有关系后送礼增加亲密值并升级

步骤：

1. 使用服务端默认等级规则，确认 1 级阈值为 0。
2. A 再次给 B 送 CP 礼物。

验证：

- 不新增 pending 申请。
- 原关系 `intimacy_value` 增加礼物结算热度值。
- 原关系 `level_no` 按服务端默认阈值计算。
- `user_outbox` 有 `UserCPRelationshipIntimacyChanged`。

## T04 同一对用户只能同时存在一种关系

步骤：

1. A 给 B 发送兄弟礼物，生成 brother pending 申请。
2. A 给 B 发送姐妹礼物，生成 sister pending 申请。
3. B 接受其中一个申请。
4. B 再尝试接受另一个申请。

验证：

- 第一个接受成功后产生 active 关系。
- 另一个申请不能接受，接口返回冲突提示。
- A/B active 关系仍只有一种。

## T05 同一用户只能同时存在一个关系

步骤：

1. 使用 T02 建立 A/B active 关系。
2. C 给 A 发送 CP 礼物，生成 C 到 A 的 pending 申请。
3. A 尝试同意 C 的申请。

验证：

- 同意接口返回冲突。
- A/B active 关系仍保留。
- C/A 不创建 active 关系。

## T06 申请过期

步骤：

1. 创建一条 pending 申请。
2. 通过 SQL 把 `expires_at_ms` 调整到当前时间之前。
3. B 查询申请列表或尝试同意。

验证：

- 申请状态被固化为 `expired`。
- 同意接口返回 `CONFLICT`，申请被固化为 `expired`，不建立关系。

## T07 拒绝申请

步骤：

1. 创建一条 pending 申请。
2. B 调用拒绝接口。

验证：

- `user_cp_applications.status=rejected`。
- 不创建 active 关系。
- `user_outbox` 有 `UserCPApplicationRejected`。
- 腾讯云 IM 向 A 发送 B 发出的拒绝结果 C2C 消息，`Desc=cp_application_rejected`。
- 腾讯云 IM 向房间群发送拒绝结果消息，`Desc=cp_application_rejected`，payload 含 `recipient_user_id=A`。
