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) } }