# 社交服务 HTTP 完整测试流程 ## 目录 1. [环境准备](#环境准备) 2. [服务启动](#服务启动) 3. [用户准备](#用户准备) 4. [好友功能测试](#好友功能测试) 5. [异常场景测试](#异常场景测试) 6. [测试数据清理](#测试数据清理) 7. [常见问题](#常见问题) --- ## 环境准备 ### 1. 数据库准备 确保 PostgreSQL 数据库已启动并创建了 `top-fans` 数据库: ```sql CREATE DATABASE "top-fans" OWNER haihuizhu ENCODING 'UTF8'; ``` ### 2. 环境变量配置 ```bash # Gateway 配置 export SERVER_PORT=8080 export GIN_MODE=debug export DUBBO_USER_SERVICE_URL="tri://127.0.0.1:20000" export DUBBO_SOCIAL_SERVICE_URL="tri://127.0.0.1:20001" export JWT_SECRET="topfans-secret-key-please-change-in-production" ``` ### 3. 工具准备 推荐使用以下工具之一进行API测试: - **Postman** (推荐) - **curl** 命令行 - **HTTPie** - **Insomnia** --- ## 服务启动 ### 1. 启动 UserService ```bash cd /Users/haihuizhu/infinite_matrix/top-fans/backend/services/userService ./start.sh ``` **预期输出:** ``` Starting User Service... Dubbo-go service started successfully. Press Ctrl+C to exit. ``` **检查端口:** ```bash lsof -i :20000 ``` ### 2. 启动 SocialService ```bash cd /Users/haihuizhu/infinite_matrix/top-fans/backend/services/socialService ./start.sh ``` **预期输出:** ``` Starting Social Service... Social service started successfully. Press Ctrl+C to exit. ``` **检查端口:** ```bash lsof -i :20001 ``` ### 3. 启动 Gateway ```bash cd /Users/haihuizhu/infinite_matrix/top-fans/backend/gateway ./start.sh ``` **预期输出:** ``` Starting Top-Fans Gateway... Gateway server started successfully ``` **检查端口:** ```bash lsof -i :8080 ``` ### 4. 健康检查 ```bash curl http://localhost:8080/health ``` **预期响应:** ```json { "status": "ok", "service": "top-fans-gateway" } ``` --- ## 用户准备 ### 步骤 1: 注册用户 A(张三) ```bash curl -X POST http://localhost:8080/api/v1/auth/register \ -H "Content-Type: application/json" \ -d '{ "mobile": "13800000001", "password": "password123", "star_id": 1, "nickname": "张三" }' ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_expires_at": 1736234567890, "user": { "id": 1, "mobile": "13800000001", "avatar_url": "", "is_active": true }, "fan_profile": { "id": 1, "user_id": 1, "star_id": 1, "nickname": "张三", "level": 1, "social": 0 } } } ``` **保存变量:** - `USER_A_ID`: 1 - `USER_A_TOKEN`: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ### 步骤 2: 注册用户 B(李四) ```bash curl -X POST http://localhost:8080/api/v1/auth/register \ -H "Content-Type: application/json" \ -d '{ "mobile": "13800000002", "password": "password123", "star_id": 1, "nickname": "李四" }' ``` **保存变量:** - `USER_B_ID`: 2 - `USER_B_TOKEN`: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ### 步骤 3: 注册用户 C(王五) ```bash curl -X POST http://localhost:8080/api/v1/auth/register \ -H "Content-Type: application/json" \ -d '{ "mobile": "13800000003", "password": "password123", "star_id": 1, "nickname": "王五" }' ``` **保存变量:** - `USER_C_ID`: 3 - `USER_C_TOKEN`: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... --- ## 好友功能测试 ### API 概览 | 序号 | 功能 | 方法 | 路径 | 说明 | |------|------|------|------|------| | 1 | 查找用户 | GET | `/api/v1/social/search-user` | 根据用户ID查找陌生人信息 | | 2 | 获取随机用户 | GET | `/api/v1/social/random-users` | 获取同一明星下的随机用户(用于推荐加好友) | | 3 | 发送好友请求 | POST | `/api/v1/social/friend-requests` | 向指定用户发送好友请求 | | 4 | 获取好友请求列表 | GET | `/api/v1/social/friend-requests` | 获取收到或发出的好友请求 | | 5 | 处理好友请求 | POST | `/api/v1/social/friend-requests/handle` | 接受或拒绝好友请求 | | 6 | 获取好友列表 | GET | `/api/v1/social/friends` | 获取好友列表(支持分页和搜索) | | 7 | 关键字搜索好友 | GET | `/api/v1/social/friends?keyword=xxx` | 在好友列表中模糊搜索 | | 8 | 检查好友关系 | GET | `/api/v1/social/friendship/check` | 检查是否为好友关系 | | 9 | 获取好友数量 | GET | `/api/v1/social/friends/count` | 获取当前用户的好友数量 | | 10 | 设置好友备注 | PUT | `/api/v1/social/friends/remark` | 设置好友的备注名 | | 11 | 删除好友 | DELETE | `/api/v1/social/friends` | 删除好友关系 | --- ### 测试场景 1: 发送好友请求 #### 1.1 张三向李四发送好友请求 ```bash curl -X POST http://localhost:8080/api/v1/social/friend-requests \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{ "friend_user_id": 2, "message": "你好,我是张三,我们交个朋友吧!" }' ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "request_id": 1, "status": "pending", "created_at": 1736234567890, "expires_at": 1738826567890 } } ``` #### 1.2 查看发出的请求列表(张三) ```bash curl -X GET "http://localhost:8080/api/v1/social/friend-requests?type=sent&page=1&page_size=10" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "has_more": false, "items": [ { "created_at": 1767697774916, "expires_at": 1770289774915, "from_user_fan_level": 1, "from_user_id": 106, "from_user_nickname": "不爱战战", "id": 31, "message": "你好,我是张三,我们交个朋友吧!", "star_id": 87, "status": "pending", "to_user_fan_level": 1, "to_user_id": 2, "to_user_nickname": "爱战战" }, { "created_at": 1767697552714, "expires_at": 1770289552714, "from_user_fan_level": 1, "from_user_id": 106, "from_user_nickname": "不爱战战", "id": 30, "message": "你好,我们交个朋友吧!", "star_id": 87, "status": "pending", "to_user_fan_level": 1, "to_user_id": 108, "to_user_nickname": "张小明" } ], "page": 1, "page_size": 10, "total": 2 } } ``` #### 1.3 查看收到的请求列表(李四) ```bash curl -X GET "http://localhost:8080/api/v1/social/friend-requests?type=received&status=pending&page=1&page_size=10" \ -H "Authorization: Bearer ${USER_B_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "items": [ { "id": 1, "from_user_id": 1, "to_user_id": 2, "star_id": 1, "status": "pending", "message": "你好,我是张三,我们交个朋友吧!", "created_at": 1736234567890, "expires_at": 1738826567890, "from_user_nickname": "张三", "from_user_avatar": "", "from_user_fan_level": 1 } ], "total": 1, "page": 1, "page_size": 10, "has_more": false } } ``` ### 测试场景 2: 接受好友请求 #### 2.1 李四接受张三的好友请求 ```bash curl -X POST http://localhost:8080/api/v1/social/friend-requests/handle \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_B_TOKEN}" \ -d '{ "request_id": 1, "action": "accept" }' ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "action": "accept", "friendship_created": true, "processed_at": 1736234600000 } } ``` #### 2.2 查看张三的好友列表 ```bash curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "items": [ { "id": 1, "user_id": 1, "friend_id": 2, "star_id": 1, "created_at": 1736234600000, "friend_nickname": "李四", "friend_avatar": "", "friend_fan_level": 1, "friend_social": 1 } ], "total": 1, "page": 1, "page_size": 20, "has_more": false } } ``` #### 2.3 查看李四的好友列表 ```bash curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \ -H "Authorization: Bearer ${USER_B_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "items": [ { "id": 2, "user_id": 2, "friend_id": 1, "star_id": 1, "created_at": 1736234600000, "friend_nickname": "张三", "friend_avatar": "", "friend_fan_level": 1, "friend_social": 1 } ], "total": 1, "page": 1, "page_size": 20, "has_more": false } } ``` #### 2.4 查看好友数量 ```bash curl -X GET "http://localhost:8080/api/v1/social/friends/count" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "count": 1 } } ``` ### 测试场景 3: 检查好友关系 ```bash curl -X GET "http://localhost:8080/api/v1/social/friendship/check?friend_user_id=2" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "is_friend": true } } ``` ### 测试场景 4: 设置好友备注 ```bash curl -X PUT http://localhost:8080/api/v1/social/friends/remark \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{ "friend_user_id": 2, "remark": "小李" }' ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "remark": "小李" } } ``` #### 4.1 再次查看好友列表(确认备注) ```bash curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "items": [ { "id": 1, "user_id": 1, "friend_id": 2, "star_id": 1, "created_at": 1736234600000, "remark": "小李", "friend_nickname": "李四", "friend_avatar": "", "friend_fan_level": 1, "friend_social": 1 } ], "total": 1, "page": 1, "page_size": 20, "has_more": false } } ``` ### 测试场景 5: 根据用户ID查找陌生人(用于加好友) **说明:** 在发送好友请求前,可以先查找目标用户的信息,查看是否可以添加为好友。 ```bash # 张三查找李四的信息(假设李四的 user_id 为 2) curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=2" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "user_id": 2, "nickname": "李四", "avatar": "https://example.com/avatar/2.jpg", "fan_level": 1, "relationship_status": "stranger", "can_send_request": true } } ``` **relationship_status 说明:** - `stranger`: 陌生人,可以发送好友请求 - `friend`: 已经是好友 - `pending_sent`: 我已发送请求,等待对方处理 - `pending_received`: 对方已发送请求给我,等待我处理 - `rejected`: 之前被拒绝,在冷静期内(会返回 `cooldown_ends_at` 字段) ### 测试场景 6: 关键字搜索好友 **说明:** 在自己的好友列表中进行模糊搜索(搜索昵称或备注名)。 ```bash curl -X GET "http://localhost:8080/api/v1/social/friends?keyword=小李&page=1&page_size=20" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "items": [ { "id": 1, "user_id": 1, "friend_id": 2, "star_id": 1, "created_at": 1736234600000, "remark": "小李", "friend_nickname": "李四", "friend_avatar": "", "friend_fan_level": 1, "friend_social": 1 } ], "total": 1, "page": 1, "page_size": 20, "has_more": false } } ``` ### 测试场景 7: 拒绝好友请求 #### 6.1 王五向李四发送好友请求 ```bash curl -X POST http://localhost:8080/api/v1/social/friend-requests \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_C_TOKEN}" \ -d '{ "friend_user_id": 2, "message": "李四你好!" }' ``` #### 6.2 李四拒绝王五的好友请求 ```bash curl -X POST http://localhost:8080/api/v1/social/friend-requests/handle \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_B_TOKEN}" \ -d '{ "request_id": 2, "action": "reject" }' ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "action": "reject", "friendship_created": false, "processed_at": 1736234700000 } } ``` #### 6.3 验证好友关系未建立 ```bash curl -X GET "http://localhost:8080/api/v1/social/friendship/check?friend_user_id=2" \ -H "Authorization: Bearer ${USER_C_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "is_friend": false } } ``` ### 测试场景 8: 设置好友备注 ```bash curl -X PUT http://localhost:8080/api/v1/social/friends/remark \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{ "friend_user_id": 2, "remark": "小李" }' ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "remark": "小李" } } ``` ### 测试场景 9: 删除好友 ```bash curl -X DELETE http://localhost:8080/api/v1/social/friends \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{ "friend_user_id": 2 }' ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "success": true } } ``` #### 7.1 验证好友已被删除(张三) ```bash curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "items": [], "total": 0, "page": 1, "page_size": 20, "has_more": false } } ``` #### 7.2 验证好友已被删除(李四) ```bash curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \ -H "Authorization: Bearer ${USER_B_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": { "items": [], "total": 0, "page": 1, "page_size": 20, "has_more": false } } ``` ### 测试场景 10: 获取随机用户 获取同一明星下的随机用户信息(用于推荐加好友等功能)。 #### 10.1 获取单个随机用户(默认) ```bash curl -X GET "http://localhost:8080/api/v1/social/random-users" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": [ { "user_id": 2, "nickname": "李四" } ] } ``` **说明:** - 默认返回 1 个随机用户 - 返回的用户必须是同一 `star_id` 下的活跃用户 - 每次调用返回的用户可能不同(随机算法) #### 10.2 获取多个随机用户 ```bash curl -X GET "http://localhost:8080/api/v1/social/random-users?count=3" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": [ { "user_id": 2, "nickname": "李四" }, { "user_id": 3, "nickname": "王五" }, { "user_id": 4, "nickname": "赵六" } ] } ``` **说明:** - `count` 参数指定返回数量(1-100) - 如果数据库中的用户数量少于请求的数量,返回实际存在的用户数量 - 如果数据库中没有用户,返回空数组 #### 10.3 验证随机性 多次调用接口,验证返回的用户不同: ```bash # 第一次调用 curl -X GET "http://localhost:8080/api/v1/social/random-users" \ -H "Authorization: Bearer ${USER_A_TOKEN}" | jq -r '.data[0].user_id' # 第二次调用 curl -X GET "http://localhost:8080/api/v1/social/random-users" \ -H "Authorization: Bearer ${USER_A_TOKEN}" | jq -r '.data[0].user_id' # 第三次调用 curl -X GET "http://localhost:8080/api/v1/social/random-users" \ -H "Authorization: Bearer ${USER_A_TOKEN}" | jq -r '.data[0].user_id' ``` **说明:** - 多次调用可能返回不同的用户(随机算法) - 如果数据库中只有少量用户,可能会重复返回 #### 10.4 边界情况测试 **测试 1: count 参数为 0 或负数** ```bash curl -X GET "http://localhost:8080/api/v1/social/random-users?count=0" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** 默认返回 1 个用户 **测试 2: count 参数超过最大值** ```bash curl -X GET "http://localhost:8080/api/v1/social/random-users?count=200" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** 最多返回 100 个用户 **测试 3: 数据库中没有用户** 如果当前 `star_id` 下没有任何活跃用户: ```bash curl -X GET "http://localhost:8080/api/v1/social/random-users" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 200, "message": "ok", "data": [] } ``` --- ## 异常场景测试 ### 异常 1: 查找不存在的用户 ```bash curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=99999" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 404, "message": "用户不存在" } ``` ### 异常 2: 查找自己 ```bash curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=1" \ -H "Authorization: Bearer ${USER_A_TOKEN}" ``` **预期响应:** ```json { "code": 400, "message": "不能查找自己" } ``` ### 异常 3: 未登录访问 ```bash curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" ``` **预期响应:** ```json { "code": 401, "message": "未授权" } ``` ### 异常 4: 重复发送好友请求 ```bash # 第一次 curl -X POST http://localhost:8080/api/v1/social/friend-requests \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{"friend_user_id": 2}' # 第二次(重复) curl -X POST http://localhost:8080/api/v1/social/friend-requests \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{"friend_user_id": 2}' ``` **第二次预期响应:** ```json { "code": 400, "message": "已有待处理的好友请求" } ``` ### 异常 5: 添加自己为好友 ```bash curl -X POST http://localhost:8080/api/v1/social/friend-requests \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{"friend_user_id": 1}' ``` **预期响应:** ```json { "code": 400, "message": "不能添加自己为好友" } ``` ### 异常 4: 冷却期内重复请求 ```bash # 假设李四拒绝了张三的请求后,张三立即重新发送 curl -X POST http://localhost:8080/api/v1/social/friend-requests \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{"friend_user_id": 2}' ``` **预期响应:** ```json { "code": 400, "message": "请求已被拒绝,请 7 天后再试" } ``` ### 异常 6: 处理不存在的请求 ```bash curl -X POST http://localhost:8080/api/v1/social/friend-requests/handle \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_B_TOKEN}" \ -d '{ "request_id": 99999, "action": "accept" }' ``` **预期响应:** ```json { "code": 404, "message": "好友请求不存在" } ``` ### 异常 7: 删除不存在的好友 ```bash curl -X DELETE http://localhost:8080/api/v1/social/friends \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{"friend_user_id": 99999}' ``` **预期响应:** ```json { "code": 400, "message": "你们不是好友" } ``` ### 异常 8: 无效的参数 ```bash curl -X POST http://localhost:8080/api/v1/social/friend-requests \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{}' ``` **预期响应:** ```json { "code": 400, "message": "参数错误: Key: 'friend_user_id' Error:Field validation for 'friend_user_id' failed on the 'required' tag" } ``` ### 异常 8: 备注过长 ```bash curl -X PUT http://localhost:8080/api/v1/social/friends/remark \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${USER_A_TOKEN}" \ -d '{ "friend_user_id": 2, "remark": "这是一个超过50个字符的备注名这是一个超过50个字符的备注名这是一个超过50个字符的备注名这是一个超过50个字符的备注名" }' ``` **预期响应:** ```json { "code": 400, "message": "备注长度不能超过50个字符" } ``` --- ## 测试数据清理 ### 方法 1: 通过 API 删除(推荐) 依次删除好友关系和用户数据(通过应用逻辑)。 ### 方法 2: 直接清理数据库 ```sql -- 删除好友关系 DELETE FROM friendships WHERE star_id = 1; -- 删除好友请求 DELETE FROM friend_requests WHERE star_id = 1; -- 删除粉丝档案 DELETE FROM fan_profiles WHERE star_id = 1; -- 删除用户(可选) DELETE FROM users WHERE mobile IN ('13800000001', '13800000002', '13800000003'); ``` --- ## 测试检查清单 - [ ] 所有服务正常启动 - [ ] 健康检查通过 - [ ] 用户注册成功 - [ ] 发送好友请求成功 - [ ] 查看请求列表正确 - [ ] 接受好友请求成功 - [ ] 好友列表显示正确 - [ ] 好友数量统计正确 - [ ] 检查好友关系正确 - [ ] 设置好友备注成功 - [ ] 关键字搜索好友有效 - [ ] 拒绝好友请求成功 - [ ] 删除好友成功 - [ ] 所有异常场景返回正确错误 --- ## 常见问题 ### Q1: 服务启动失败怎么办? 检查: 1. 数据库是否正常运行 2. 端口是否被占用 3. 配置文件是否正确 4. 依赖服务是否已启动 ### Q2: Token 过期怎么办? 重新登录获取新的 Token: ```bash curl -X POST http://localhost:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{ "mobile": "13800000001", "password": "password123" }' ``` ### Q3: 如何查看服务日志? ```bash # UserService 日志 tail -f /path/to/user-service.log # SocialService 日志 tail -f /path/to/social-service.log # Gateway 日志 tail -f /path/to/gateway.log ``` ### Q4: 如何重置测试环境? 1. 停止所有服务 2. 清理数据库(执行上述清理SQL) 3. 重新启动所有服务 4. 重新注册测试用户 --- ## 附录 ### A. 完整的 Postman Collection 可以导入以下 JSON 到 Postman 进行测试: [下载 Postman Collection](./社交服务测试集合.postman_collection.json) ### B. 自动化测试脚本 参考 `tests/social_service_integration_test.sh` 进行自动化测试。 ### C. 性能测试建议 - 使用 Apache Bench 或 wrk 进行压力测试 - 建议并发用户数:100-1000 - 观察响应时间和错误率 --- **文档版本**: v1.0 **最后更新**: 2026-01-06 **维护者**: AI Assistant