package jwtutil import ( "testing" "time" ) // TestGenerateParseBackwardCompat 旧签发方式产生的 token 必须仍能被解析(向后兼容) func TestGenerateParseBackwardCompat(t *testing.T) { token, err := GenerateToken(1001, "zhangsan", 7, "backend") if err != nil { t.Fatalf("GenerateToken 失败: %v", err) } claims, err := ParseToken(token) if err != nil { t.Fatalf("ParseToken 失败: %v", err) } if claims.UserID != 1001 || claims.Username != "zhangsan" || claims.TenantId != 7 || claims.UserType != "backend" { t.Fatalf("claims 解析不符: %+v", claims) } // 旧 token 无认证中心扩展字段 if claims.Sid != "" || claims.ClientID != "" { t.Fatal("旧 token 不应携带 sid/client_id") } } // TestSignTokenFallback 未配置 RSA 时自动回落 HS256,且可解析 func TestSignTokenFallback(t *testing.T) { token, err := SignToken(TokenOptions{ Alg: AlgRS256, // 期望回落到 HS256 UserID: 42, Username: "u", TenantID: 3, UserType: "tenant", ClientID: "crm", Sid: "sid-001", Subject: "42", TTL: 15 * time.Minute, }) if err != nil { t.Fatalf("SignToken 失败: %v", err) } claims, err := ParseToken(token) if err != nil { t.Fatalf("ParseToken 失败: %v", err) } if claims.ClientID != "crm" || claims.Sid != "sid-001" || claims.Subject != "42" { t.Fatalf("扩展 claims 解析不符: %+v", claims) } } // TestParseInvalid 非法 token 必须报错 func TestParseInvalid(t *testing.T) { if _, err := ParseToken("not-a-token"); err == nil { t.Fatal("非法 token 应返回错误") } if _, err := ParseToken(""); err == nil { t.Fatal("空 token 应返回错误") } } // TestHasRSA 无配置时不应 panic func TestHasRSA(t *testing.T) { if HasRSA() { t.Log("已配置 RSA 密钥对") } if Kid() == "" { t.Fatal("kid 不应为空") } }