qnc-server-tob/common/jwt/jwtx_test.go

297 lines
7.4 KiB
Go
Raw Normal View History

2025-06-24 15:46:41 +08:00
package jwtx
import (
"fmt"
"qnc-server/app/main/model"
"testing"
"time"
"github.com/golang-jwt/jwt/v4"
"github.com/stretchr/testify/assert"
)
func TestParseJwtToken(t *testing.T) {
secret := "WUvoIwL-FK0qnlxhvxR9tV6SjfOpeJMpKmY2QvT99lA"
tokenStr, err := GenerateJwtToken(JwtClaims{
UserId: 123,
AgentId: 0,
Platform: "wxh5",
UserType: 0,
IsAgent: 0,
}, secret, 3600)
assert.NoError(t, err)
tests := []struct {
name string
tokenStr string
secret string
expectError bool
expectClaims *JwtClaims
}{
{
name: "无效的token字符串",
tokenStr: "invalid-token",
secret: secret,
expectError: true,
},
{
name: "空token字符串",
tokenStr: "",
secret: secret,
expectError: true,
},
{
name: "错误的密钥",
tokenStr: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHRyYSI6eyJ1c2VySWQiOjEyMywiYWdlbnRJZCI6NDU2LCJwbGF0Zm9ybSI6InRlc3QiLCJ1c2VyVHlwZSI6MSwiaXNBZ2VudCI6MH0sImV4cCI6MTczNTY4MDAwMCwiaWF0IjoxNzM1Njc5OTAwfQ.invalid-signature",
secret: "wrong-secret",
expectError: true,
},
{
name: "缺少extra字段",
tokenStr: createTokenWithoutExtra(secret),
secret: secret,
expectError: true,
},
{
name: "正常解析token",
tokenStr: tokenStr,
secret: secret,
expectError: false,
expectClaims: &JwtClaims{
UserId: 123,
AgentId: 456,
Platform: "test",
UserType: 1,
IsAgent: 0,
},
},
{
name: "解析临时用户token",
tokenStr: createTempUserToken(secret),
secret: secret,
expectError: false,
expectClaims: &JwtClaims{
UserId: 789,
AgentId: 0,
Platform: "mobile",
UserType: 0,
IsAgent: 0,
},
},
{
name: "解析代理用户token",
tokenStr: createAgentUserToken(secret),
secret: secret,
expectError: false,
expectClaims: &JwtClaims{
UserId: 999,
AgentId: 888,
Platform: "web",
UserType: 1,
IsAgent: 1,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
claims, err := ParseJwtToken(tt.tokenStr, tt.secret)
fmt.Printf("name: %s\n", tt.name)
fmt.Printf("claims: %+v\n", claims)
if tt.name == "正常解析token" {
fmt.Printf("claims.UserType bool: %v\n", claims.UserType == model.UserTypeTemp)
}
if tt.expectError {
assert.Error(t, err)
assert.Nil(t, claims)
} else {
assert.NoError(t, err)
assert.NotNil(t, claims)
assert.Equal(t, tt.expectClaims.UserId, claims.UserId)
assert.Equal(t, tt.expectClaims.AgentId, claims.AgentId)
assert.Equal(t, tt.expectClaims.Platform, claims.Platform)
assert.Equal(t, tt.expectClaims.UserType, claims.UserType)
assert.Equal(t, tt.expectClaims.IsAgent, claims.IsAgent)
}
})
}
}
func TestParseJwtToken_Integration(t *testing.T) {
secret := "integration-test-secret"
// 测试生成和解析的集成
originalClaims := JwtClaims{
UserId: 12345,
AgentId: 67890,
Platform: "integration-test",
UserType: 1,
IsAgent: 1,
}
// 生成token
tokenStr, err := GenerateJwtToken(originalClaims, secret, 3600)
assert.NoError(t, err)
assert.NotEmpty(t, tokenStr)
// 解析token
parsedClaims, err := ParseJwtToken(tokenStr, secret)
assert.NoError(t, err)
assert.NotNil(t, parsedClaims)
// 验证解析结果
assert.Equal(t, originalClaims.UserId, parsedClaims.UserId)
assert.Equal(t, originalClaims.AgentId, parsedClaims.AgentId)
assert.Equal(t, originalClaims.Platform, parsedClaims.Platform)
assert.Equal(t, originalClaims.UserType, parsedClaims.UserType)
assert.Equal(t, originalClaims.IsAgent, parsedClaims.IsAgent)
}
func TestParseJwtToken_EdgeCases(t *testing.T) {
secret := "edge-case-secret"
t.Run("过期的token", func(t *testing.T) {
// 创建一个已过期的token
expiredToken := createExpiredToken(secret)
claims, err := ParseJwtToken(expiredToken, secret)
assert.Error(t, err)
assert.Nil(t, claims)
})
t.Run("extra字段为nil", func(t *testing.T) {
// 创建一个extra字段为nil的token
nilExtraToken := createTokenWithNilExtra(secret)
claims, err := ParseJwtToken(nilExtraToken, secret)
assert.Error(t, err)
assert.Nil(t, claims)
})
t.Run("extra字段类型错误", func(t *testing.T) {
// 创建一个extra字段类型错误的token
wrongTypeToken := createTokenWithWrongExtraType(secret)
claims, err := ParseJwtToken(wrongTypeToken, secret)
assert.Error(t, err)
assert.Nil(t, claims)
})
}
// 辅助函数创建有效的token
func createValidToken(secret string) string {
now := time.Now().Unix()
claims := jwt.MapClaims{
"exp": now + 3600,
"iat": now,
"userId": 123,
ExtraKey: map[string]interface{}{
"userId": 123,
"agentId": 456,
"platform": "test",
"userType": 1,
"isAgent": 0,
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenStr, _ := token.SignedString([]byte(secret))
return tokenStr
}
// 辅助函数创建临时用户token
func createTempUserToken(secret string) string {
now := time.Now().Unix()
claims := jwt.MapClaims{
"exp": now + 3600,
"iat": now,
"userId": 789,
ExtraKey: map[string]interface{}{
"userId": 789,
"agentId": 0,
"platform": "mobile",
"userType": 0,
"isAgent": 0,
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenStr, _ := token.SignedString([]byte(secret))
return tokenStr
}
// 辅助函数创建代理用户token
func createAgentUserToken(secret string) string {
now := time.Now().Unix()
claims := jwt.MapClaims{
"exp": now + 3600,
"iat": now,
"userId": 999,
ExtraKey: map[string]interface{}{
"userId": 999,
"agentId": 888,
"platform": "web",
"userType": 1,
"isAgent": 1,
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenStr, _ := token.SignedString([]byte(secret))
return tokenStr
}
// 辅助函数创建缺少extra字段的token
func createTokenWithoutExtra(secret string) string {
now := time.Now().Unix()
claims := jwt.MapClaims{
"exp": now + 3600,
"iat": now,
"userId": 123,
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenStr, _ := token.SignedString([]byte(secret))
return tokenStr
}
// 辅助函数创建已过期的token
func createExpiredToken(secret string) string {
now := time.Now().Unix()
claims := jwt.MapClaims{
"exp": now - 3600, // 已过期
"iat": now - 7200,
"userId": 123,
ExtraKey: map[string]interface{}{
"userId": 123,
"agentId": 456,
"platform": "test",
"userType": 1,
"isAgent": 0,
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenStr, _ := token.SignedString([]byte(secret))
return tokenStr
}
// 辅助函数创建extra字段为nil的token
func createTokenWithNilExtra(secret string) string {
now := time.Now().Unix()
claims := jwt.MapClaims{
"exp": now + 3600,
"iat": now,
"userId": 123,
ExtraKey: nil,
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenStr, _ := token.SignedString([]byte(secret))
return tokenStr
}
// 辅助函数创建extra字段类型错误的token
func createTokenWithWrongExtraType(secret string) string {
now := time.Now().Unix()
claims := jwt.MapClaims{
"exp": now + 3600,
"iat": now,
"userId": 123,
ExtraKey: "wrong-type", // 应该是map[string]interface{}
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenStr, _ := token.SignedString([]byte(secret))
return tokenStr
}