111 lines
2.6 KiB
Go
111 lines
2.6 KiB
Go
|
package jwtx
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"testing"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
func TestGenerateAndParseJwtToken(t *testing.T) {
|
|||
|
// 测试参数
|
|||
|
userId := int64(102)
|
|||
|
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
|
|||
|
parsedUserId, err := ParseJwtToken(token, secret)
|
|||
|
if err != nil {
|
|||
|
t.Fatalf("解析JWT令牌失败: %v", err)
|
|||
|
}
|
|||
|
|
|||
|
// 验证解析出的userId是否正确
|
|||
|
if parsedUserId != userId {
|
|||
|
t.Errorf("解析出的userId不匹配: 期望 %d, 实际 %d", userId, parsedUserId)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
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)
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
}
|