topfans/backend/pkg/jwt/jwt_test.go
2026-04-07 22:29:48 +08:00

142 lines
3.1 KiB
Go

package jwt
import (
"strings"
"testing"
"time"
"github.com/golang-jwt/jwt/v5"
)
func TestGenerateToken(t *testing.T) {
SetSecret("test-secret-key")
userID := int64(10000001)
starID := int64(123)
updatedAt := time.Now().UnixMilli()
token, err := GenerateToken(userID, starID, updatedAt)
if err != nil {
t.Fatalf("GenerateToken failed: %v", err)
}
if token == "" {
t.Fatal("Generated token is empty")
}
t.Logf("Generated token: %s", token)
}
func TestParseToken(t *testing.T) {
SetSecret("test-secret-key")
userID := int64(10000001)
starID := int64(123)
updatedAt := time.Now().UnixMilli()
token, err := GenerateToken(userID, starID, updatedAt)
if err != nil {
t.Fatalf("GenerateToken failed: %v", err)
}
claims, err := ParseToken(token)
if err != nil {
t.Fatalf("ParseToken failed: %v", err)
}
if claims.UserID != userID {
t.Errorf("UserID mismatch: expected %d, got %d", userID, claims.UserID)
}
if claims.StarID != starID {
t.Errorf("StarID mismatch: expected %d, got %d", starID, claims.StarID)
}
if claims.UpdatedAt != updatedAt {
t.Errorf("UpdatedAt mismatch: expected %d, got %d", updatedAt, claims.UpdatedAt)
}
}
func TestValidateToken(t *testing.T) {
SetSecret("test-secret-key")
userID := int64(10000001)
starID := int64(123)
updatedAt := time.Now().UnixMilli()
token, err := GenerateToken(userID, starID, updatedAt)
if err != nil {
t.Fatalf("GenerateToken failed: %v", err)
}
claims, err := ValidateToken(token)
if err != nil {
t.Fatalf("ValidateToken failed: %v", err)
}
if claims.UserID != userID {
t.Errorf("UserID mismatch: expected %d, got %d", userID, claims.UserID)
}
}
func TestValidateToken_Expired(t *testing.T) {
SetSecret("test-secret-key")
// 手动创建一个已过期的Token
userID := int64(10000001)
starID := int64(123)
updatedAt := time.Now().UnixMilli()
now := time.Now()
expiresAt := now.Add(-1 * time.Hour) // 1小时前过期
claims := Claims{
UserID: userID,
StarID: starID,
UpdatedAt: updatedAt,
RegisteredClaims: jwt.RegisteredClaims{
IssuedAt: jwt.NewNumericDate(now.Add(-2 * time.Hour)),
ExpiresAt: jwt.NewNumericDate(expiresAt),
},
}
tokenObj := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := tokenObj.SignedString([]byte("test-secret-key"))
if err != nil {
t.Fatalf("Failed to create expired token: %v", err)
}
// 验证已过期的Token应该返回错误
_, err = ValidateToken(tokenString)
if err == nil {
t.Fatal("Expected error for expired token, got nil")
}
if !strings.Contains(err.Error(), "expired") {
t.Errorf("Expected 'expired' error, got: %v", err)
}
}
func TestGetExpiresAt(t *testing.T) {
expiresAt := GetExpiresAt()
expected := time.Now().Add(TokenExpiration).UnixMilli()
// 允许1秒的误差
diff := expiresAt - expected
if diff < 0 {
diff = -diff
}
if diff > 1000 {
t.Errorf("GetExpiresAt failed: expected around %d, got %d", expected, expiresAt)
}
}
func TestGetExpiresIn(t *testing.T) {
expiresIn := GetExpiresIn()
expected := int64(TokenExpiration.Seconds())
if expiresIn != expected {
t.Errorf("GetExpiresIn failed: expected %d, got %d", expected, expiresIn)
}
}