package token_test import ( "testing" "time" "git.huangwc.com/pig/pig-farm-controller/internal/app/service/token" "github.com/golang-jwt/jwt/v5" ) func TestGenerateToken(t *testing.T) { // 使用一个测试密钥初始化 TokenService testSecret := []byte("test_secret_key") service := token.NewTokenService(testSecret) userID := uint(123) tokenString, err := service.GenerateToken(userID) if err != nil { t.Fatalf("GenerateToken failed: %v", err) } if tokenString == "" { t.Fatal("Generated token string is empty") } // 解析 token 以确保其有效性及声明 claims, err := service.ParseToken(tokenString) if err != nil { t.Fatalf("ParseToken failed after generation: %v", err) } if claims.UserID != userID { t.Errorf("Expected UserID %d, got %d", userID, claims.UserID) } // 检查 token 是否未过期 (在合理范围内) if claims.ExpiresAt == nil || claims.ExpiresAt.Time.Before(time.Now().Add(-time.Minute)) { t.Errorf("Token expiration time is invalid or already expired") } if claims.Issuer != "pig-farm-controller" { t.Errorf("Expected Issuer \"pig-farm-controller\", got \"%s\"", claims.Issuer) } } func TestParseToken(t *testing.T) { // 使用一个测试密钥初始化 TokenService testSecret := []byte("test_secret_key") service := token.NewTokenService(testSecret) userID := uint(456) // 生成一个有效的 token 用于解析测试 validToken, err := service.GenerateToken(userID) if err != nil { t.Fatalf("Failed to generate valid token for parsing test: %v", err) } // 测试用例 1: 有效 token claims, err := service.ParseToken(validToken) if err != nil { t.Errorf("ParseToken failed for valid token: %v", err) } if claims.UserID != userID { t.Errorf("Expected UserID %d, got %d for valid token", userID, claims.UserID) } // 测试用例 2: 无效 token (例如, 错误的签名) invalidToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTY3ODkwNTYwMCwiaXNzIjoicGlnLWZhcm0tY29udHJvbGxlciJ9.invalid_signature_here" _, err = service.ParseToken(invalidToken) if err == nil { t.Error("ParseToken unexpectedly succeeded for invalid token") } // 测试用例 3: 过期 token (创建一个过期时间在过去的 token) expiredClaims := token.Claims{ UserID: userID, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(-time.Hour)), // 1 小时前 Issuer: "pig-farm-controller", }, } expiredTokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, expiredClaims) expiredTokenString, err := expiredTokenClaims.SignedString(testSecret) if err != nil { t.Fatalf("Failed to generate expired token: %v", err) } _, err = service.ParseToken(expiredTokenString) if err == nil { t.Error("ParseToken unexpectedly succeeded for expired token") } }