Files
tyapi-server/internal/infrastructure/external/xingwei/xingwei_test.go
2025-10-16 18:35:18 +08:00

242 lines
6.9 KiB
Go
Raw 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 xingwei
import (
"context"
"encoding/json"
"testing"
)
func TestXingweiService_CreateSign(t *testing.T) {
// 创建测试配置 - 使用nil logger来避免日志问题
service := NewXingweiService(
"https://sjztyh.chengdaoji.cn/dataCenterManageApi/manage/interface/doc/api/handle",
"test_api_id",
"test_api_key",
nil, // 使用nil logger
)
// 测试签名生成
timestamp := int64(1743474772049)
sign := service.createSign(timestamp)
// 验证签名不为空
if sign == "" {
t.Error("签名不能为空")
}
// 验证签名长度MD5应该是32位十六进制字符串
if len(sign) != 32 {
t.Errorf("签名长度应该是32位实际是%d位", len(sign))
}
t.Logf("生成的签名: %s", sign)
}
func TestXingweiService_CallAPI(t *testing.T) {
// 创建测试配置 - 使用nil logger来避免日志问题
service := NewXingweiService(
"https://sjztyh.chengdaoji.cn/dataCenterManageApi/manage/interface/doc/api/handle",
"test_api_id",
"test_api_key",
nil, // 使用nil logger
)
// 创建测试上下文
ctx := context.Background()
// 测试参数
projectID := "test_project_id"
params := map[string]interface{}{
"test_param": "test_value",
}
// 注意这个测试会实际发送HTTP请求所以可能会失败
// 在实际使用中应该使用mock或者测试服务器
resp, err := service.CallAPI(ctx, projectID, params)
// 由于这是真实的外部API调用我们主要测试错误处理
if err != nil {
t.Logf("预期的错误真实API调用: %v", err)
} else {
t.Logf("API调用成功响应长度: %d", len(resp))
}
}
func TestXingweiService_GenerateRequestID(t *testing.T) {
// 创建测试配置 - 使用nil logger来避免日志问题
service := NewXingweiService(
"https://sjztyh.chengdaoji.cn/dataCenterManageApi/manage/interface/doc/api/handle",
"test_api_id",
"test_api_key",
nil, // 使用nil logger
)
// 测试请求ID生成
requestID1 := service.generateRequestID()
requestID2 := service.generateRequestID()
// 验证请求ID不为空
if requestID1 == "" || requestID2 == "" {
t.Error("请求ID不能为空")
}
// 验证请求ID应该以xingwei_开头
if len(requestID1) < 8 || requestID1[:8] != "xingwei_" {
t.Error("请求ID应该以xingwei_开头")
}
// 验证两次生成的请求ID应该不同
if requestID1 == requestID2 {
t.Error("两次生成的请求ID应该不同")
}
t.Logf("请求ID1: %s", requestID1)
t.Logf("请求ID2: %s", requestID2)
}
func TestGetXingweiErrorMessage(t *testing.T) {
// 测试已知错误码(使用常量)
testCases := []struct {
code int
expected string
}{
{CodeSuccess, "操作成功"},
{CodeSystemError, "系统内部错误"},
{CodeMerchantError, "商家相关报错(商家不存在、商家被禁用、商家余额不足)"},
{CodeAccountExpired, "账户已过期"},
{CodeIPWhitelistMissing, "未添加ip白名单"},
{CodeUnauthorized, "未授权调用该接口"},
{CodeProductIDError, "产品id错误"},
{CodeInterfaceDisabled, "接口被停用"},
{CodeQueryException, "接口查询异常,请联系技术人员"},
{CodeNotFound, "未查询到结果"},
{9999, "未知错误码: 9999"}, // 测试未知错误码
}
for _, tc := range testCases {
result := GetXingweiErrorMessage(tc.code)
if result != tc.expected {
t.Errorf("错误码 %d 的消息不正确,期望: %s, 实际: %s", tc.code, tc.expected, result)
}
}
}
func TestXingweiResponseParsing(t *testing.T) {
// 测试响应结构解析
testCases := []struct {
name string
response string
expectedCode int
}{
{
name: "成功响应",
response: `{"msg": "操作成功", "code": 200, "data": {"result": "test"}}`,
expectedCode: CodeSuccess,
},
{
name: "商家错误",
response: `{"msg": "商家相关报错", "code": 3001, "data": null}`,
expectedCode: CodeMerchantError,
},
{
name: "未查询到结果",
response: `{"msg": "未查询到结果", "code": 6000, "data": null}`,
expectedCode: CodeNotFound,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
var resp XingweiResponse
err := json.Unmarshal([]byte(tc.response), &resp)
if err != nil {
t.Errorf("解析响应失败: %v", err)
return
}
if resp.Code != tc.expectedCode {
t.Errorf("错误码不匹配,期望: %d, 实际: %d", tc.expectedCode, resp.Code)
}
// 测试错误消息获取
errorMsg := GetXingweiErrorMessage(resp.Code)
if errorMsg == "" {
t.Errorf("无法获取错误码 %d 的消息", resp.Code)
}
t.Logf("响应: %+v, 错误消息: %s", resp, errorMsg)
})
}
}
// TestXingweiErrorHandling 测试错误处理逻辑
func TestXingweiErrorHandling(t *testing.T) {
// 注意:这个测试主要验证常量定义和错误消息,不需要实际的服务实例
// 测试查空错误
t.Run("NotFound错误", func(t *testing.T) {
// 模拟返回查空响应
response := `{"msg": "未查询到结果", "code": 6000, "data": null}`
var xingweiResp XingweiResponse
err := json.Unmarshal([]byte(response), &xingweiResp)
if err != nil {
t.Fatalf("解析响应失败: %v", err)
}
// 验证状态码
if xingweiResp.Code != CodeNotFound {
t.Errorf("期望状态码 %d, 实际 %d", CodeNotFound, xingweiResp.Code)
}
// 验证错误消息
errorMsg := GetXingweiErrorMessage(xingweiResp.Code)
if errorMsg != "未查询到结果" {
t.Errorf("期望错误消息 '未查询到结果', 实际 '%s'", errorMsg)
}
t.Logf("查空错误测试通过: 状态码=%d, 消息=%s", xingweiResp.Code, errorMsg)
})
// 测试系统错误
t.Run("SystemError错误", func(t *testing.T) {
response := `{"msg": "系统内部错误", "code": 500, "data": null}`
var xingweiResp XingweiResponse
err := json.Unmarshal([]byte(response), &xingweiResp)
if err != nil {
t.Fatalf("解析响应失败: %v", err)
}
if xingweiResp.Code != CodeSystemError {
t.Errorf("期望状态码 %d, 实际 %d", CodeSystemError, xingweiResp.Code)
}
errorMsg := GetXingweiErrorMessage(xingweiResp.Code)
if errorMsg != "系统内部错误" {
t.Errorf("期望错误消息 '系统内部错误', 实际 '%s'", errorMsg)
}
t.Logf("系统错误测试通过: 状态码=%d, 消息=%s", xingweiResp.Code, errorMsg)
})
// 测试成功响应
t.Run("Success响应", func(t *testing.T) {
response := `{"msg": "操作成功", "code": 200, "data": {"result": "test"}}`
var xingweiResp XingweiResponse
err := json.Unmarshal([]byte(response), &xingweiResp)
if err != nil {
t.Fatalf("解析响应失败: %v", err)
}
if xingweiResp.Code != CodeSuccess {
t.Errorf("期望状态码 %d, 实际 %d", CodeSuccess, xingweiResp.Code)
}
errorMsg := GetXingweiErrorMessage(xingweiResp.Code)
if errorMsg != "操作成功" {
t.Errorf("期望错误消息 '操作成功', 实际 '%s'", errorMsg)
}
t.Logf("成功响应测试通过: 状态码=%d, 消息=%s", xingweiResp.Code, errorMsg)
})
}