193 lines
4.9 KiB
Go
193 lines
4.9 KiB
Go
package bopx_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"code.yun.ink/pkg/bopx"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// TestApiGetSign 测试API签名生成
|
|
func TestApiGetSign(t *testing.T) {
|
|
// 测试用例1: 基本参数签名
|
|
params := map[string]interface{}{
|
|
"name": "huang",
|
|
"age": 18,
|
|
}
|
|
|
|
api := bopx.NewApi()
|
|
sign, err := api.GetSign(context.Background(), "huangxinyun", params)
|
|
if err != nil {
|
|
t.Errorf("GetSign returned error: %v", err)
|
|
}
|
|
|
|
expectedSign := "F84C5DF671D8279B57AC6EED2C140407" // 根据算法计算得出的预期值
|
|
if sign != expectedSign {
|
|
t.Errorf("GetSign() = %v, want %v", sign, expectedSign)
|
|
}
|
|
|
|
// 记录生成的签名值
|
|
t.Logf("Generated sign: %s", sign)
|
|
}
|
|
|
|
// TestApiVerify 测试API签名验证
|
|
func TestApiVerify(t *testing.T) {
|
|
// 测试用例1: 正确签名验证
|
|
params := map[string]interface{}{
|
|
"name": "huang",
|
|
"age": 18,
|
|
}
|
|
|
|
api := bopx.NewApi()
|
|
sign, err := api.GetSign(context.Background(), "huangxinyun", params)
|
|
if err != nil {
|
|
t.Errorf("GetSign returned error: %v", err)
|
|
}
|
|
|
|
params["sign"] = sign
|
|
err = api.Verify(context.Background(), "huangxinyun", params)
|
|
if err != nil {
|
|
t.Errorf("Verify returned error: %v", err)
|
|
}
|
|
|
|
// 测试用例2: 签名参数不存在
|
|
paramsWithoutSign := map[string]interface{}{
|
|
"name": "huang",
|
|
"age": 18,
|
|
}
|
|
|
|
err = api.Verify(context.Background(), "huangxinyun", paramsWithoutSign)
|
|
if err != bopx.ErrorSignParamNotExist {
|
|
t.Errorf("Verify should return ErrorSignParamNotExist, got: %v", err)
|
|
}
|
|
|
|
// 测试用例3: 签名参数不是字符串
|
|
paramsWithInvalidSign := map[string]interface{}{
|
|
"name": "huang",
|
|
"age": 18,
|
|
"sign": 12345, // 非字符串类型
|
|
}
|
|
|
|
err = api.Verify(context.Background(), "huangxinyun", paramsWithInvalidSign)
|
|
if err != bopx.ErrorSignMustBeString {
|
|
t.Errorf("Verify should return ErrorSignMustBeString, got: %v", err)
|
|
}
|
|
|
|
// 测试用例4: 签名不匹配
|
|
paramsWithWrongSign := map[string]interface{}{
|
|
"name": "huang",
|
|
"age": 18,
|
|
"sign": "WRONGSIGN",
|
|
}
|
|
|
|
err = api.Verify(context.Background(), "huangxinyun", paramsWithWrongSign)
|
|
if err != bopx.ErrorSignFail {
|
|
t.Errorf("Verify should return ErrorSignFail, got: %v", err)
|
|
}
|
|
}
|
|
|
|
// TestApiIgnoreKeys 测试忽略键功能
|
|
func TestApiIgnoreKeys(t *testing.T) {
|
|
params := map[string]interface{}{
|
|
"name": "huang",
|
|
"age": 18,
|
|
"platform_key": "ignored",
|
|
"sign": "ignored",
|
|
"key": "ignored",
|
|
}
|
|
|
|
api := bopx.NewApi(bopx.WithIgnoreKeys("platform_key", "sign", "key"))
|
|
sign, err := api.GetSign(context.Background(), "huangxinyun", params)
|
|
if err != nil {
|
|
t.Errorf("GetSign returned error: %v", err)
|
|
}
|
|
|
|
// 验证忽略的键不影响签名结果
|
|
paramsWithoutIgnored := map[string]interface{}{
|
|
"name": "huang",
|
|
"age": 18,
|
|
}
|
|
|
|
signWithoutIgnored, err := api.GetSign(context.Background(), "huangxinyun", paramsWithoutIgnored)
|
|
if err != nil {
|
|
t.Errorf("GetSign returned error: %v", err)
|
|
}
|
|
|
|
if sign != signWithoutIgnored {
|
|
t.Errorf("Signatures with/without ignored keys should be equal. With ignored: %s, without: %s", sign, signWithoutIgnored)
|
|
}
|
|
}
|
|
|
|
// TestApiEmptyParams 测试空参数
|
|
func TestApiEmptyParams(t *testing.T) {
|
|
params := map[string]interface{}{}
|
|
|
|
api := bopx.NewApi(bopx.WithIgnoreKeys("platform_key", "sign", "key"))
|
|
sign, err := api.GetSign(context.Background(), "huangxinyun", params)
|
|
|
|
assert.NotNil(t, err)
|
|
|
|
assert.Equal(t, bopx.ErrorSignParamIsEmpty, err)
|
|
assert.Equal(t, "", sign)
|
|
|
|
}
|
|
|
|
// TestApiSpecialValues 测试特殊值
|
|
func TestApiSpecialValues(t *testing.T) {
|
|
params := map[string]interface{}{
|
|
"empty_string": "",
|
|
"nil_value": nil,
|
|
"zero": 0,
|
|
"special_chars": "!@#$%^&*()_+-=[]{}|;':\",./<>?",
|
|
}
|
|
|
|
api := bopx.NewApi(bopx.WithIgnoreKeys("platform_key", "sign", "key"))
|
|
sign, err := api.GetSign(context.Background(), "testkey", params)
|
|
if err != nil {
|
|
t.Errorf("GetSign returned error: %v", err)
|
|
}
|
|
|
|
if sign == "" {
|
|
t.Error("Sign should not be empty for special values")
|
|
}
|
|
|
|
params["sign"] = sign
|
|
err = api.Verify(context.Background(), "testkey", params)
|
|
if err != nil {
|
|
t.Errorf("Verify returned error: %v", err)
|
|
}
|
|
}
|
|
|
|
// TestApiConsistentResults 测试签名一致性
|
|
func TestApiConsistentResults(t *testing.T) {
|
|
params1 := map[string]interface{}{
|
|
"c": "third",
|
|
"a": "first",
|
|
"b": "second",
|
|
}
|
|
|
|
params2 := map[string]interface{}{
|
|
"b": "second",
|
|
"c": "third",
|
|
"a": "first",
|
|
}
|
|
|
|
api := bopx.NewApi()
|
|
|
|
sign1, err := api.GetSign(context.Background(), "consistentkey", params1)
|
|
if err != nil {
|
|
t.Errorf("GetSign for params1 returned error: %v", err)
|
|
}
|
|
|
|
sign2, err := api.GetSign(context.Background(), "consistentkey", params2)
|
|
if err != nil {
|
|
t.Errorf("GetSign for params2 returned error: %v", err)
|
|
}
|
|
|
|
// 由于参数排序,两种不同顺序的map应该产生相同的签名
|
|
if sign1 != sign2 {
|
|
t.Errorf("Signatures should be consistent regardless of parameter order. sign1: %s, sign2: %s", sign1, sign2)
|
|
}
|
|
}
|