111 lines
2.8 KiB
Go
111 lines
2.8 KiB
Go
package jwtx
|
||
|
||
import (
|
||
"fmt"
|
||
"testing"
|
||
"time"
|
||
)
|
||
|
||
func TestGenerateAndParseJwtToken(t *testing.T) {
|
||
// 测试参数
|
||
userId := int64(39)
|
||
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("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTA5MjYyNTgsImlhdCI6MTc0ODMzNDI1OCwidXNlcklkIjoxNDN9.V4qV3dAjE6G-xm0KmB6QHCVhy2SmRDGAWcvl32hLNmI", secret)
|
||
if err != nil {
|
||
t.Fatalf("解析JWT令牌失败: %v", err)
|
||
}
|
||
fmt.Printf("解析出的userId: %d\n", parsedUserId)
|
||
// 验证解析出的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)
|
||
}
|
||
})
|
||
}
|
||
}
|