Files
backend/internal/middleware/auth_test.go
lan 4b4980820f
Some checks failed
SonarQube Analysis / sonarqube (push) Has been cancelled
Test / test (push) Has been cancelled
Test / lint (push) Has been cancelled
Test / build (push) Has been cancelled
chore: 初始化仓库,排除二进制文件和覆盖率文件
2025-11-28 23:30:49 +08:00

159 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("应该有效但被识别为无效")
}
}
})
}
}