Files
nl-video-api/test_apis.go
2025-08-03 00:11:15 +08:00

236 lines
8.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"time"
)
// API测试结构
type APITest struct {
Name string
Method string
URL string
Headers map[string]string
Body string
Expected int // 期望的HTTP状态码
}
// 响应结构
type Response struct {
Code int `json:"code"`
Message string `json:"message"`
Data interface{} `json:"data"`
}
func main() {
baseURL := "http://localhost:16001"
// 定义所有需要测试的API
tests := []APITest{
// 用户端API
{Name: "用户注册", Method: "POST", URL: "/api/v1/auth/auth/register", Expected: 200},
{Name: "用户登录", Method: "POST", URL: "/api/v1/auth/auth/login", Expected: 200},
{Name: "获取用户信息", Method: "GET", URL: "/api/v1/auth/auth/profile", Expected: 200},
{Name: "更新用户信息", Method: "POST", URL: "/api/v1/auth/auth/profile", Expected: 200},
{Name: "刷新令牌", Method: "POST", URL: "/api/v1/auth/auth/refresh", Expected: 200},
{Name: "用户退出", Method: "POST", URL: "/api/v1/auth/auth/logout", Expected: 200},
// 影片相关API
{Name: "获取影片列表", Method: "GET", URL: "/api/v1/movies", Expected: 200},
{Name: "获取影片详情", Method: "GET", URL: "/api/v1/movies/1", Expected: 200},
{Name: "搜索影片", Method: "GET", URL: "/api/v1/movies/search?keyword=test", Expected: 200},
{Name: "获取推荐影片", Method: "GET", URL: "/api/v1/movies/recommend", Expected: 200},
{Name: "获取热门影片", Method: "GET", URL: "/api/v1/movies/hot", Expected: 200},
{Name: "获取最新影片", Method: "GET", URL: "/api/v1/movies/new", Expected: 200},
{Name: "按分类获取影片", Method: "GET", URL: "/api/v1/movies/category/1", Expected: 200},
// 集数相关API
{Name: "获取影片集数", Method: "GET", URL: "/api/v1/episodes/movie/1", Expected: 200},
{Name: "获取集数详情", Method: "GET", URL: "/api/v1/episodes/1", Expected: 200},
{Name: "获取视频信息", Method: "GET", URL: "/api/v1/episodes/video/info", Expected: 200},
// 用户收藏API
{Name: "添加收藏", Method: "POST", URL: "/api/v1/user/collect/add", Expected: 200},
{Name: "取消收藏", Method: "POST", URL: "/api/v1/user/collect/remove", Expected: 200},
{Name: "获取收藏列表", Method: "GET", URL: "/api/v1/user/collect/list", Expected: 200},
{Name: "检查收藏状态", Method: "GET", URL: "/api/v1/user/collect/check", Expected: 200},
// 观看历史API
{Name: "添加观看记录", Method: "POST", URL: "/api/v1/user/history/add", Expected: 200},
{Name: "获取观看历史", Method: "GET", URL: "/api/v1/user/history/list", Expected: 200},
{Name: "获取观看记录", Method: "GET", URL: "/api/v1/user/history/get", Expected: 200},
{Name: "删除观看记录", Method: "POST", URL: "/api/v1/user/history/delete", Expected: 200},
{Name: "清空观看历史", Method: "POST", URL: "/api/v1/user/history/clear", Expected: 200},
// 轮播图API
{Name: "获取轮播图", Method: "GET", URL: "/api/v1/banner/list", Expected: 200},
// VIP相关API
{Name: "获取VIP等级", Method: "GET", URL: "/api/v1/vip/levels", Expected: 200},
{Name: "获取我的VIP", Method: "GET", URL: "/api/v1/vip/my", Expected: 200},
// 订单相关API
{Name: "创建订单", Method: "POST", URL: "/api/v1/payment/create", Expected: 200},
{Name: "获取订单列表", Method: "GET", URL: "/api/v1/payment/list", Expected: 200},
{Name: "获取订单详情", Method: "GET", URL: "/api/v1/payment/1", Expected: 200},
// 附件相关API
{Name: "上传附件", Method: "POST", URL: "/api/v1/attachment/upload", Expected: 200},
{Name: "获取附件列表", Method: "GET", URL: "/api/v1/attachment/list", Expected: 200},
// 配置相关API
{Name: "获取公共配置", Method: "GET", URL: "/api/v1/config/public", Expected: 200},
// 日志相关API
{Name: "获取我的日志", Method: "GET", URL: "/api/v1/log/my", Expected: 200},
// 管理员端API
{Name: "管理员注册", Method: "POST", URL: "/api/v1/admin/register", Expected: 200},
{Name: "管理员登录", Method: "POST", URL: "/api/v1/admin/login", Expected: 200},
{Name: "获取管理员信息", Method: "GET", URL: "/api/v1/admin/profile", Expected: 200},
{Name: "更新管理员信息", Method: "POST", URL: "/api/v1/admin/profile", Expected: 200},
{Name: "刷新管理员令牌", Method: "POST", URL: "/api/v1/admin/refresh", Expected: 200},
{Name: "管理员退出", Method: "POST", URL: "/api/v1/admin/logout", Expected: 200},
// 管理员-影片管理
{Name: "管理员创建影片", Method: "POST", URL: "/api/v1/movies", Expected: 200},
{Name: "管理员更新影片", Method: "POST", URL: "/api/v1/movies/update", Expected: 200},
{Name: "管理员批量更新影片", Method: "POST", URL: "/api/v1/movies/batch-update", Expected: 200},
{Name: "管理员删除影片", Method: "DELETE", URL: "/api/v1/movies/1", Expected: 200},
{Name: "管理员上传海报", Method: "POST", URL: "/api/v1/movies/upload/poster", Expected: 200},
{Name: "管理员上传视频", Method: "POST", URL: "/api/v1/movies/upload/video", Expected: 200},
// 管理员-集数管理
{Name: "管理员创建集数", Method: "POST", URL: "/api/v1/episodes", Expected: 200},
{Name: "管理员更新集数", Method: "POST", URL: "/api/v1/episodes/update", Expected: 200},
{Name: "管理员批量创建集数", Method: "POST", URL: "/api/v1/episodes/batch", Expected: 200},
{Name: "管理员批量更新状态", Method: "POST", URL: "/api/v1/episodes/batch-status", Expected: 200},
{Name: "管理员删除集数", Method: "DELETE", URL: "/api/v1/episodes/1", Expected: 200},
{Name: "管理员上传视频", Method: "POST", URL: "/api/v1/episodes/upload/video", Expected: 200},
{Name: "管理员生成缩略图", Method: "POST", URL: "/api/v1/episodes/thumbnail", Expected: 200},
}
fmt.Println("开始测试API接口...")
fmt.Println(strings.Repeat("=", 60))
successCount := 0
failCount := 0
for i, test := range tests {
fmt.Printf("[%d/%d] 测试: %s\n", i+1, len(tests), test.Name)
success := testAPI(baseURL+test.URL, test.Method, test.Headers, test.Body, test.Expected)
if success {
fmt.Printf("✅ 成功\n")
successCount++
} else {
fmt.Printf("❌ 失败\n")
failCount++
}
fmt.Println()
// 避免请求过快
time.Sleep(100 * time.Millisecond)
}
fmt.Println(strings.Repeat("=", 60))
fmt.Printf("测试完成!成功: %d, 失败: %d, 总计: %d\n", successCount, failCount, len(tests))
if failCount == 0 {
fmt.Println("🎉 所有API接口测试通过")
} else {
fmt.Printf("⚠️ 有 %d 个接口测试失败,请检查相关代码\n", failCount)
}
}
func testAPI(url, method string, headers map[string]string, body string, expectedStatus int) bool {
client := &http.Client{
Timeout: 10 * time.Second,
}
var req *http.Request
var err error
if body != "" {
req, err = http.NewRequest(method, url, strings.NewReader(body))
} else {
req, err = http.NewRequest(method, url, nil)
}
if err != nil {
fmt.Printf("创建请求失败: %v\n", err)
return false
}
// 设置默认头部
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "API-Test-Client/1.0")
// 设置自定义头部
for key, value := range headers {
req.Header.Set(key, value)
}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("请求失败: %v\n", err)
return false
}
defer resp.Body.Close()
// 读取响应体
respBody, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return false
}
// 检查HTTP状态码
if resp.StatusCode != expectedStatus {
fmt.Printf("HTTP状态码不匹配: 期望 %d, 实际 %d\n", expectedStatus, resp.StatusCode)
fmt.Printf("响应内容: %s\n", string(respBody))
return false
}
// 尝试解析JSON响应
var response Response
if err := json.Unmarshal(respBody, &response); err != nil {
fmt.Printf("JSON解析失败: %v\n", err)
fmt.Printf("响应内容: %s\n", string(respBody))
return false
}
// 检查业务逻辑响应码
if response.Code != 0 && response.Code != 200 {
fmt.Printf("业务错误码: %d, 消息: %s\n", response.Code, response.Message)
// 对于某些预期的错误(如未登录、数据不存在等),不算作失败
if isExpectedError(response.Code) {
return true
}
return false
}
fmt.Printf("✅ 响应正常: %s\n", response.Message)
return true
}
// 判断是否为预期的错误码
func isExpectedError(code int) bool {
expectedErrors := []int{
401, // 未登录
404, // 数据不存在
403, // 权限不足
400, // 参数错误
}
for _, expectedCode := range expectedErrors {
if code == expectedCode {
return true
}
}
return false
}