2025-05-24 14:26:20 +08:00
|
|
|
|
package jwtx
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestGenerateAndParseJwtToken(t *testing.T) {
|
|
|
|
|
// 测试参数
|
2025-06-02 18:21:08 +08:00
|
|
|
|
userId := int64(2043)
|
2025-05-24 14:26:20 +08:00
|
|
|
|
secret := "WUvoIwL-FK0qnlxhvxR9tV6SjfOpeJMpKmY2QvT99lA"
|
|
|
|
|
expireTime := int64(2592000) // 1小时过期
|
|
|
|
|
|
|
|
|
|
// 生成token
|
|
|
|
|
token, err := GenerateJwtToken(userId, secret, expireTime)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("生成JWT令牌失败: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if token == "" {
|
|
|
|
|
t.Fatal("生成的JWT令牌为空")
|
|
|
|
|
}
|
|
|
|
|
fmt.Println(token)
|
|
|
|
|
// 解析token
|
2025-05-28 17:57:22 +08:00
|
|
|
|
parsedUserId, err := ParseJwtToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTA5MjYyNTgsImlhdCI6MTc0ODMzNDI1OCwidXNlcklkIjoxNDN9.V4qV3dAjE6G-xm0KmB6QHCVhy2SmRDGAWcvl32hLNmI", secret)
|
2025-05-24 14:26:20 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("解析JWT令牌失败: %v", err)
|
|
|
|
|
}
|
2025-05-26 17:19:07 +08:00
|
|
|
|
fmt.Printf("解析出的userId: %d\n", parsedUserId)
|
2025-05-24 14:26:20 +08:00
|
|
|
|
// 验证解析出的userId是否正确
|
2025-05-26 17:19:07 +08:00
|
|
|
|
// if parsedUserId != userId {
|
|
|
|
|
// t.Errorf("解析出的userId不匹配: 期望 %d, 实际 %d", userId, parsedUserId)
|
|
|
|
|
// }
|
2025-05-24 14:26:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestTokenExpiration(t *testing.T) {
|
|
|
|
|
// 测试参数
|
|
|
|
|
userId := int64(10086)
|
|
|
|
|
secret := "test_secret_key"
|
|
|
|
|
expireTime := int64(1) // 1秒过期
|
|
|
|
|
|
|
|
|
|
// 生成token
|
|
|
|
|
token, err := GenerateJwtToken(userId, secret, expireTime)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("生成JWT令牌失败: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 等待令牌过期
|
|
|
|
|
time.Sleep(2 * time.Second)
|
|
|
|
|
|
|
|
|
|
// 解析已过期token
|
|
|
|
|
_, err = ParseJwtToken(token, secret)
|
|
|
|
|
if err == nil {
|
|
|
|
|
t.Error("期望令牌过期错误,但没有发生错误")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestInvalidToken(t *testing.T) {
|
|
|
|
|
secret := "test_secret_key"
|
|
|
|
|
|
|
|
|
|
// 测试无效token
|
|
|
|
|
invalidToken := "invalid.token.string"
|
|
|
|
|
_, err := ParseJwtToken(invalidToken, secret)
|
|
|
|
|
if err == nil {
|
|
|
|
|
t.Error("期望无效令牌错误,但没有发生错误")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试密钥不匹配
|
|
|
|
|
userId := int64(10086)
|
|
|
|
|
expireTime := int64(3600)
|
|
|
|
|
token, _ := GenerateJwtToken(userId, "original_secret", expireTime)
|
|
|
|
|
_, err = ParseJwtToken(token, "wrong_secret")
|
|
|
|
|
if err == nil {
|
|
|
|
|
t.Error("期望密钥不匹配错误,但没有发生错误")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestUserIdTypes(t *testing.T) {
|
|
|
|
|
cases := []struct {
|
|
|
|
|
name string
|
|
|
|
|
setupFn func() (string, string, int64)
|
|
|
|
|
expected int64
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "正常int64类型",
|
|
|
|
|
setupFn: func() (string, string, int64) {
|
|
|
|
|
userId := int64(10086)
|
|
|
|
|
secret := "test_secret"
|
|
|
|
|
expireTime := int64(3600)
|
|
|
|
|
token, _ := GenerateJwtToken(userId, secret, expireTime)
|
|
|
|
|
return token, secret, userId
|
|
|
|
|
},
|
|
|
|
|
expected: 10086,
|
|
|
|
|
},
|
|
|
|
|
// 其他类型在实际场景中通过手动修改token内容测试,这里省略
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, tc := range cases {
|
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
|
token, secret, expected := tc.setupFn()
|
|
|
|
|
userId, err := ParseJwtToken(token, secret)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("解析失败: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if userId != expected {
|
|
|
|
|
t.Errorf("用户ID不匹配: 期望 %d, 实际 %d", expected, userId)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|