142 lines
3.1 KiB
Go
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)
|
|
}
|
|
}
|