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