175 lines
3.6 KiB
Go
175 lines
3.6 KiB
Go
|
|
package service
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"testing"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// TestCaptchaService_Constants 测试验证码服务常量
|
|||
|
|
func TestCaptchaService_Constants(t *testing.T) {
|
|||
|
|
if redisKeyPrefix != "captcha:" {
|
|||
|
|
t.Errorf("redisKeyPrefix = %s, want 'captcha:'", redisKeyPrefix)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if paddingValue != 3 {
|
|||
|
|
t.Errorf("paddingValue = %d, want 3", paddingValue)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestRedisData_Structure 测试RedisData结构
|
|||
|
|
func TestRedisData_Structure(t *testing.T) {
|
|||
|
|
data := RedisData{
|
|||
|
|
Tx: 100,
|
|||
|
|
Ty: 200,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if data.Tx != 100 {
|
|||
|
|
t.Errorf("RedisData.Tx = %d, want 100", data.Tx)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if data.Ty != 200 {
|
|||
|
|
t.Errorf("RedisData.Ty = %d, want 200", data.Ty)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestGenerateCaptchaData_Logic 测试生成验证码的逻辑部分
|
|||
|
|
func TestGenerateCaptchaData_Logic(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
captchaID string
|
|||
|
|
wantErr bool
|
|||
|
|
errContains string
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "有效的captchaID",
|
|||
|
|
captchaID: "test-uuid-123",
|
|||
|
|
wantErr: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "空的captchaID应该失败",
|
|||
|
|
captchaID: "",
|
|||
|
|
wantErr: true,
|
|||
|
|
errContains: "生成验证码唯一标识失败",
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
// 测试UUID验证逻辑
|
|||
|
|
if tt.captchaID == "" {
|
|||
|
|
if !tt.wantErr {
|
|||
|
|
t.Error("空captchaID应该返回错误")
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
if tt.wantErr {
|
|||
|
|
t.Error("非空captchaID不应该返回错误")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestVerifyCaptchaData_Logic 测试验证验证码的逻辑部分
|
|||
|
|
func TestVerifyCaptchaData_Logic(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
dx int
|
|||
|
|
tx int
|
|||
|
|
ty int
|
|||
|
|
padding int
|
|||
|
|
wantValid bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "精确匹配",
|
|||
|
|
dx: 100,
|
|||
|
|
tx: 100,
|
|||
|
|
ty: 200,
|
|||
|
|
padding: 3,
|
|||
|
|
wantValid: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "在误差范围内(+3)",
|
|||
|
|
dx: 103,
|
|||
|
|
tx: 100,
|
|||
|
|
ty: 200,
|
|||
|
|
padding: 3,
|
|||
|
|
wantValid: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "在误差范围内(-3)",
|
|||
|
|
dx: 97,
|
|||
|
|
tx: 100,
|
|||
|
|
ty: 200,
|
|||
|
|
padding: 3,
|
|||
|
|
wantValid: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "超出误差范围(+4)",
|
|||
|
|
dx: 104,
|
|||
|
|
tx: 100,
|
|||
|
|
ty: 200,
|
|||
|
|
padding: 3,
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "超出误差范围(-4)",
|
|||
|
|
dx: 96,
|
|||
|
|
tx: 100,
|
|||
|
|
ty: 200,
|
|||
|
|
padding: 3,
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
// 验证逻辑:dx应该在[tx-padding, tx+padding]范围内
|
|||
|
|
diff := tt.dx - tt.tx
|
|||
|
|
if diff < 0 {
|
|||
|
|
diff = -diff
|
|||
|
|
}
|
|||
|
|
isValid := diff <= tt.padding
|
|||
|
|
if isValid != tt.wantValid {
|
|||
|
|
t.Errorf("Validation failed: got %v, want %v (dx=%d, tx=%d, padding=%d)", isValid, tt.wantValid, tt.dx, tt.tx, tt.padding)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestVerifyCaptchaData_RedisKey 测试Redis键生成逻辑
|
|||
|
|
func TestVerifyCaptchaData_RedisKey(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
id string
|
|||
|
|
expected string
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "生成正确的Redis键",
|
|||
|
|
id: "test-id-123",
|
|||
|
|
expected: "captcha:test-id-123",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "空ID",
|
|||
|
|
id: "",
|
|||
|
|
expected: "captcha:",
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
redisKey := redisKeyPrefix + tt.id
|
|||
|
|
if redisKey != tt.expected {
|
|||
|
|
t.Errorf("Redis key = %s, want %s", redisKey, tt.expected)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestGenerateCaptchaData_ExpireTime 测试过期时间
|
|||
|
|
func TestGenerateCaptchaData_ExpireTime(t *testing.T) {
|
|||
|
|
expectedExpireTime := 300 * time.Second
|
|||
|
|
if expectedExpireTime != 5*time.Minute {
|
|||
|
|
t.Errorf("Expire time should be 5 minutes")
|
|||
|
|
}
|
|||
|
|
}
|