package jwtx import ( "fmt" "testing" "time" ) func TestGenerateAndParseJwtToken(t *testing.T) { // 测试参数 userId := int64(2012) secret := "WUvoIwL-FK0qnlxhvxR9tV6SjfOpeJMpKmY2QvT99lA" expireTime := int64(2592000) // 1小时过期 // 生成token token, err := GenerateJwtToken(userId, secret, expireTime) if err != nil { t.Fatalf("生成JWT令牌失败: %v", err) } if token == "" { t.Fatal("生成的JWT令牌为空") } fmt.Println(token) // 解析token parsedUserId, err := ParseJwtToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTA5MjYyNTgsImlhdCI6MTc0ODMzNDI1OCwidXNlcklkIjoxNDN9.V4qV3dAjE6G-xm0KmB6QHCVhy2SmRDGAWcvl32hLNmI", secret) if err != nil { t.Fatalf("解析JWT令牌失败: %v", err) } fmt.Printf("解析出的userId: %d\n", parsedUserId) // 验证解析出的userId是否正确 // if parsedUserId != userId { // t.Errorf("解析出的userId不匹配: 期望 %d, 实际 %d", userId, parsedUserId) // } } func TestTokenExpiration(t *testing.T) { // 测试参数 userId := int64(10086) secret := "test_secret_key" expireTime := int64(1) // 1秒过期 // 生成token token, err := GenerateJwtToken(userId, secret, expireTime) if err != nil { t.Fatalf("生成JWT令牌失败: %v", err) } // 等待令牌过期 time.Sleep(2 * time.Second) // 解析已过期token _, err = ParseJwtToken(token, secret) if err == nil { t.Error("期望令牌过期错误,但没有发生错误") } } func TestInvalidToken(t *testing.T) { secret := "test_secret_key" // 测试无效token invalidToken := "invalid.token.string" _, err := ParseJwtToken(invalidToken, secret) if err == nil { t.Error("期望无效令牌错误,但没有发生错误") } // 测试密钥不匹配 userId := int64(10086) expireTime := int64(3600) token, _ := GenerateJwtToken(userId, "original_secret", expireTime) _, err = ParseJwtToken(token, "wrong_secret") if err == nil { t.Error("期望密钥不匹配错误,但没有发生错误") } } func TestUserIdTypes(t *testing.T) { cases := []struct { name string setupFn func() (string, string, int64) expected int64 }{ { name: "正常int64类型", setupFn: func() (string, string, int64) { userId := int64(10086) secret := "test_secret" expireTime := int64(3600) token, _ := GenerateJwtToken(userId, secret, expireTime) return token, secret, userId }, expected: 10086, }, // 其他类型在实际场景中通过手动修改token内容测试,这里省略 } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { token, secret, expected := tc.setupFn() userId, err := ParseJwtToken(token, secret) if err != nil { t.Fatalf("解析失败: %v", err) } if userId != expected { t.Errorf("用户ID不匹配: 期望 %d, 实际 %d", expected, userId) } }) } }