242 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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)
 | ||
| 	})
 | ||
| }
 |