159 lines
3.9 KiB
Go
159 lines
3.9 KiB
Go
|
|
package middleware
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"strings"
|
|||
|
|
"testing"
|
|||
|
|
|
|||
|
|
"carrotskin/pkg/auth"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// TestAuthMiddleware_MissingHeader 测试缺少Authorization头的情况
|
|||
|
|
// 注意:这个测试需要auth服务初始化,暂时跳过实际执行
|
|||
|
|
func TestAuthMiddleware_MissingHeader(t *testing.T) {
|
|||
|
|
// 测试逻辑:缺少Authorization头应该返回401
|
|||
|
|
// 由于需要auth服务初始化,这里只测试逻辑部分
|
|||
|
|
hasHeader := false
|
|||
|
|
if hasHeader {
|
|||
|
|
t.Error("测试场景应该没有Authorization头")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestAuthMiddleware_InvalidFormat 测试无效的Authorization头格式
|
|||
|
|
// 注意:这个测试需要auth服务初始化,这里只测试解析逻辑
|
|||
|
|
func TestAuthMiddleware_InvalidFormat(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
header string
|
|||
|
|
wantValid bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "缺少Bearer前缀",
|
|||
|
|
header: "token123",
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "只有Bearer没有token",
|
|||
|
|
header: "Bearer",
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "空字符串",
|
|||
|
|
header: "",
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "错误的格式",
|
|||
|
|
header: "Token token123",
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "标准格式",
|
|||
|
|
header: "Bearer token123",
|
|||
|
|
wantValid: true,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
// 测试header解析逻辑
|
|||
|
|
tokenParts := strings.SplitN(tt.header, " ", 2)
|
|||
|
|
isValid := len(tokenParts) == 2 && tokenParts[0] == "Bearer"
|
|||
|
|
if isValid != tt.wantValid {
|
|||
|
|
t.Errorf("Header validation: got %v, want %v", isValid, tt.wantValid)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestAuthMiddleware_ValidToken 测试有效token的情况
|
|||
|
|
// 注意:这个测试需要auth服务初始化,这里只测试token格式
|
|||
|
|
func TestAuthMiddleware_ValidToken(t *testing.T) {
|
|||
|
|
// 创建JWT服务并生成token
|
|||
|
|
jwtService := auth.NewJWTService("test-secret-key", 24)
|
|||
|
|
token, err := jwtService.GenerateToken(1, "testuser", "user")
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatalf("生成token失败: %v", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 验证token格式
|
|||
|
|
if token == "" {
|
|||
|
|
t.Error("生成的token不应为空")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 验证可以解析token
|
|||
|
|
claims, err := jwtService.ValidateToken(token)
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatalf("验证token失败: %v", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if claims.UserID != 1 {
|
|||
|
|
t.Errorf("UserID = %d, want 1", claims.UserID)
|
|||
|
|
}
|
|||
|
|
if claims.Username != "testuser" {
|
|||
|
|
t.Errorf("Username = %q, want 'testuser'", claims.Username)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestOptionalAuthMiddleware_NoHeader 测试可选认证中间件无header的情况
|
|||
|
|
// 注意:这个测试需要auth服务初始化,这里只测试逻辑
|
|||
|
|
func TestOptionalAuthMiddleware_NoHeader(t *testing.T) {
|
|||
|
|
// 测试逻辑:可选认证中间件在没有header时应该允许请求继续
|
|||
|
|
hasHeader := false
|
|||
|
|
shouldContinue := true // 可选认证应该允许继续
|
|||
|
|
|
|||
|
|
if hasHeader && !shouldContinue {
|
|||
|
|
t.Error("可选认证逻辑错误")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestAuthMiddleware_HeaderParsing 测试Authorization头解析逻辑
|
|||
|
|
func TestAuthMiddleware_HeaderParsing(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
header string
|
|||
|
|
wantValid bool
|
|||
|
|
wantToken string
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "标准Bearer格式",
|
|||
|
|
header: "Bearer token123",
|
|||
|
|
wantValid: true,
|
|||
|
|
wantToken: "token123",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "Bearer后多个空格",
|
|||
|
|
header: "Bearer token123",
|
|||
|
|
wantValid: true,
|
|||
|
|
wantToken: " token123", // SplitN只分割一次
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "缺少Bearer",
|
|||
|
|
header: "token123",
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "只有Bearer",
|
|||
|
|
header: "Bearer",
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
tokenParts := strings.SplitN(tt.header, " ", 2)
|
|||
|
|
if len(tokenParts) == 2 && tokenParts[0] == "Bearer" {
|
|||
|
|
if !tt.wantValid {
|
|||
|
|
t.Errorf("应该无效但被识别为有效")
|
|||
|
|
}
|
|||
|
|
if tokenParts[1] != tt.wantToken {
|
|||
|
|
t.Errorf("Token = %q, want %q", tokenParts[1], tt.wantToken)
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
if tt.wantValid {
|
|||
|
|
t.Errorf("应该有效但被识别为无效")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|