Files
novalon-website/src/middleware.test.ts
T
张翔 ebaa7f3c50
ci/woodpecker/manual/woodpecker Pipeline was successful
fix: 修复Woodpecker CI配置文件中的linter错误
- 移除未使用的YAML锚点定义
- 替换commands字段中的锚点引用为实际值
- 移除有问题的通知步骤
- 修复测试文件中的问题
- 添加新的测试用例和配置文件
2026-03-28 09:42:45 +08:00

133 lines
3.1 KiB
TypeScript

import { middleware } from './middleware';
import { NextResponse } from 'next/server';
jest.mock('next/server', () => ({
NextResponse: {
next: jest.fn(() => ({
headers: new Headers(),
})),
rewrite: jest.fn(() => ({
headers: new Headers(),
})),
},
}));
describe('middleware', () => {
let mockRequest: any;
beforeEach(() => {
jest.clearAllMocks();
mockRequest = {
nextUrl: {
pathname: '',
clone: jest.fn(() => ({
pathname: '',
})),
},
};
});
it('should allow auth routes', () => {
mockRequest.nextUrl.pathname = '/api/auth/signin';
middleware(mockRequest);
expect(NextResponse.next).toHaveBeenCalled();
});
it('should allow admin routes', () => {
mockRequest.nextUrl.pathname = '/api/admin/users';
middleware(mockRequest);
expect(NextResponse.next).toHaveBeenCalled();
});
it('should allow content routes', () => {
mockRequest.nextUrl.pathname = '/api/content/posts';
middleware(mockRequest);
expect(NextResponse.next).toHaveBeenCalled();
});
it('should rewrite legacy API paths to v1', () => {
mockRequest.nextUrl.pathname = '/api/config';
mockRequest.nextUrl.clone.mockReturnValue({
pathname: '/api/v1/config',
});
middleware(mockRequest);
expect(NextResponse.rewrite).toHaveBeenCalled();
});
it('should rewrite health API to v1', () => {
mockRequest.nextUrl.pathname = '/api/health';
mockRequest.nextUrl.clone.mockReturnValue({
pathname: '/api/v1/health',
});
middleware(mockRequest);
expect(NextResponse.rewrite).toHaveBeenCalled();
});
it('should not rewrite versioned API paths', () => {
mockRequest.nextUrl.pathname = '/api/v1/users';
middleware(mockRequest);
expect(NextResponse.next).toHaveBeenCalled();
expect(NextResponse.rewrite).not.toHaveBeenCalled();
});
it('should set X-API-Version header for versioned routes', () => {
mockRequest.nextUrl.pathname = '/api/v2/users';
const mockResponse = {
headers: new Headers(),
};
(NextResponse.next as jest.Mock).mockReturnValue(mockResponse);
middleware(mockRequest);
expect(mockResponse.headers.get('X-API-Version')).toBe('v2');
});
it('should handle docs routes', () => {
mockRequest.nextUrl.pathname = '/api/docs';
const mockResponse = {
headers: new Headers(),
};
(NextResponse.next as jest.Mock).mockReturnValue(mockResponse);
middleware(mockRequest);
expect(mockResponse.headers.get('X-API-Version')).toBe('none');
});
it('should handle api-docs route', () => {
mockRequest.nextUrl.pathname = '/api-docs';
const mockResponse = {
headers: new Headers(),
};
(NextResponse.next as jest.Mock).mockReturnValue(mockResponse);
middleware(mockRequest);
expect(mockResponse.headers.get('X-API-Version')).toBe('none');
});
it('should allow other API routes', () => {
mockRequest.nextUrl.pathname = '/api/users';
middleware(mockRequest);
expect(NextResponse.next).toHaveBeenCalled();
});
});