topfans/backend/docs/社交服务HTTP完整测试流程.md
2026-04-07 22:29:48 +08:00

23 KiB
Raw Blame History

社交服务 HTTP 完整测试流程

目录

  1. 环境准备
  2. 服务启动
  3. 用户准备
  4. 好友功能测试
  5. 异常场景测试
  6. 测试数据清理
  7. 常见问题

环境准备

1. 数据库准备

确保 PostgreSQL 数据库已启动并创建了 top-fans 数据库:

CREATE DATABASE "top-fans" OWNER haihuizhu ENCODING 'UTF8';

2. 环境变量配置

# 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

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.

检查端口:

lsof -i :20000

2. 启动 SocialService

cd /Users/haihuizhu/infinite_matrix/top-fans/backend/services/socialService
./start.sh

预期输出:

Starting Social Service...
Social service started successfully. Press Ctrl+C to exit.

检查端口:

lsof -i :20001

3. 启动 Gateway

cd /Users/haihuizhu/infinite_matrix/top-fans/backend/gateway
./start.sh

预期输出:

Starting Top-Fans Gateway...
Gateway server started successfully

检查端口:

lsof -i :8080

4. 健康检查

curl http://localhost:8080/health

预期响应:

{
  "status": "ok",
  "service": "top-fans-gateway"
}

用户准备

步骤 1: 注册用户 A张三

curl -X POST http://localhost:8080/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "mobile": "13800000001",
    "password": "password123",
    "star_id": 1,
    "nickname": "张三"
  }'

预期响应:

{
  "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李四

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王五

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 张三向李四发送好友请求

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": "你好,我是张三,我们交个朋友吧!"
  }'

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "request_id": 1,
    "status": "pending",
    "created_at": 1736234567890,
    "expires_at": 1738826567890
  }
}

1.2 查看发出的请求列表(张三)

curl -X GET "http://localhost:8080/api/v1/social/friend-requests?type=sent&page=1&page_size=10" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
    "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 查看收到的请求列表(李四)

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}"

预期响应:

{
  "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 李四接受张三的好友请求

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"
  }'

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "action": "accept",
    "friendship_created": true,
    "processed_at": 1736234600000
  }
}

2.2 查看张三的好友列表

curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "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 查看李四的好友列表

curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
  -H "Authorization: Bearer ${USER_B_TOKEN}"

预期响应:

{
  "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 查看好友数量

curl -X GET "http://localhost:8080/api/v1/social/friends/count" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "count": 1
  }
}

测试场景 3: 检查好友关系

curl -X GET "http://localhost:8080/api/v1/social/friendship/check?friend_user_id=2" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "is_friend": true
  }
}

测试场景 4: 设置好友备注

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": "小李"
  }'

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "remark": "小李"
  }
}

4.1 再次查看好友列表(确认备注)

curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "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查找陌生人用于加好友

说明: 在发送好友请求前,可以先查找目标用户的信息,查看是否可以添加为好友。

# 张三查找李四的信息(假设李四的 user_id 为 2
curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=2" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "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: 关键字搜索好友

说明: 在自己的好友列表中进行模糊搜索(搜索昵称或备注名)。

curl -X GET "http://localhost:8080/api/v1/social/friends?keyword=小李&page=1&page_size=20" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "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 王五向李四发送好友请求

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 李四拒绝王五的好友请求

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"
  }'

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "action": "reject",
    "friendship_created": false,
    "processed_at": 1736234700000
  }
}

6.3 验证好友关系未建立

curl -X GET "http://localhost:8080/api/v1/social/friendship/check?friend_user_id=2" \
  -H "Authorization: Bearer ${USER_C_TOKEN}"

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "is_friend": false
  }
}

测试场景 8: 设置好友备注

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": "小李"
  }'

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "remark": "小李"
  }
}

测试场景 9: 删除好友

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
  }'

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "success": true
  }
}

7.1 验证好友已被删除(张三)

curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "items": [],
    "total": 0,
    "page": 1,
    "page_size": 20,
    "has_more": false
  }
}

7.2 验证好友已被删除(李四)

curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
  -H "Authorization: Bearer ${USER_B_TOKEN}"

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": {
    "items": [],
    "total": 0,
    "page": 1,
    "page_size": 20,
    "has_more": false
  }
}

测试场景 10: 获取随机用户

获取同一明星下的随机用户信息(用于推荐加好友等功能)。

10.1 获取单个随机用户(默认)

curl -X GET "http://localhost:8080/api/v1/social/random-users" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": [
    {
      "user_id": 2,
      "nickname": "李四"
    }
  ]
}

说明:

  • 默认返回 1 个随机用户
  • 返回的用户必须是同一 star_id 下的活跃用户
  • 每次调用返回的用户可能不同(随机算法)

10.2 获取多个随机用户

curl -X GET "http://localhost:8080/api/v1/social/random-users?count=3" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": [
    {
      "user_id": 2,
      "nickname": "李四"
    },
    {
      "user_id": 3,
      "nickname": "王五"
    },
    {
      "user_id": 4,
      "nickname": "赵六"
    }
  ]
}

说明:

  • count 参数指定返回数量1-100
  • 如果数据库中的用户数量少于请求的数量,返回实际存在的用户数量
  • 如果数据库中没有用户,返回空数组

10.3 验证随机性

多次调用接口,验证返回的用户不同:

# 第一次调用
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 或负数

curl -X GET "http://localhost:8080/api/v1/social/random-users?count=0" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应: 默认返回 1 个用户

测试 2: count 参数超过最大值

curl -X GET "http://localhost:8080/api/v1/social/random-users?count=200" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应: 最多返回 100 个用户

测试 3: 数据库中没有用户

如果当前 star_id 下没有任何活跃用户:

curl -X GET "http://localhost:8080/api/v1/social/random-users" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "code": 200,
  "message": "ok",
  "data": []
}

异常场景测试

异常 1: 查找不存在的用户

curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=99999" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "code": 404,
  "message": "用户不存在"
}

异常 2: 查找自己

curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=1" \
  -H "Authorization: Bearer ${USER_A_TOKEN}"

预期响应:

{
  "code": 400,
  "message": "不能查找自己"
}

异常 3: 未登录访问

curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20"

预期响应:

{
  "code": 401,
  "message": "未授权"
}

异常 4: 重复发送好友请求

# 第一次
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}'

第二次预期响应:

{
  "code": 400,
  "message": "已有待处理的好友请求"
}

异常 5: 添加自己为好友

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}'

预期响应:

{
  "code": 400,
  "message": "不能添加自己为好友"
}

异常 4: 冷却期内重复请求

# 假设李四拒绝了张三的请求后,张三立即重新发送
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}'

预期响应:

{
  "code": 400,
  "message": "请求已被拒绝,请 7 天后再试"
}

异常 6: 处理不存在的请求

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"
  }'

预期响应:

{
  "code": 404,
  "message": "好友请求不存在"
}

异常 7: 删除不存在的好友

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}'

预期响应:

{
  "code": 400,
  "message": "你们不是好友"
}

异常 8: 无效的参数

curl -X POST http://localhost:8080/api/v1/social/friend-requests \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${USER_A_TOKEN}" \
  -d '{}'

预期响应:

{
  "code": 400,
  "message": "参数错误: Key: 'friend_user_id' Error:Field validation for 'friend_user_id' failed on the 'required' tag"
}

异常 8: 备注过长

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个字符的备注名"
  }'

预期响应:

{
  "code": 400,
  "message": "备注长度不能超过50个字符"
}

测试数据清理

方法 1: 通过 API 删除(推荐)

依次删除好友关系和用户数据(通过应用逻辑)。

方法 2: 直接清理数据库

-- 删除好友关系
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

curl -X POST http://localhost:8080/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "mobile": "13800000001",
    "password": "password123"
  }'

Q3: 如何查看服务日志?

# 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

B. 自动化测试脚本

参考 tests/social_service_integration_test.sh 进行自动化测试。

C. 性能测试建议

  • 使用 Apache Bench 或 wrk 进行压力测试
  • 建议并发用户数100-1000
  • 观察响应时间和错误率

文档版本: v1.0
最后更新: 2026-01-06
维护者: AI Assistant