b207bfa7af
test: 添加单元测试和端到端测试 refactor: 重构登录页面和上传模块 ci: 更新测试覆盖率阈值至42% build: 添加测试相关依赖 docs: 更新测试文档 style: 修复代码格式问题
122 lines
3.8 KiB
TypeScript
122 lines
3.8 KiB
TypeScript
import { GET, PUT, DELETE } from './route';
|
|
import { NextRequest } from 'next/server';
|
|
|
|
jest.mock('@/lib/auth', () => ({
|
|
auth: jest.fn(),
|
|
}));
|
|
|
|
jest.mock('@/lib/auth/permissions', () => ({
|
|
hasPermission: jest.fn(),
|
|
}));
|
|
|
|
jest.mock('@/db', () => ({
|
|
db: {
|
|
select: jest.fn().mockReturnValue({
|
|
from: jest.fn().mockReturnValue({
|
|
where: jest.fn().mockReturnValue({
|
|
limit: jest.fn().mockResolvedValue([{
|
|
id: 'test-user-id',
|
|
email: 'test@example.com',
|
|
name: 'Test User',
|
|
role: 'admin',
|
|
}]),
|
|
}),
|
|
}),
|
|
}),
|
|
update: jest.fn().mockReturnValue({
|
|
set: jest.fn().mockReturnValue({
|
|
where: jest.fn().mockReturnValue({
|
|
returning: jest.fn().mockResolvedValue([{
|
|
id: 'test-user-id',
|
|
email: 'updated@example.com',
|
|
name: 'Updated User',
|
|
}]),
|
|
}),
|
|
}),
|
|
}),
|
|
delete: jest.fn().mockReturnValue({
|
|
where: jest.fn().mockResolvedValue(undefined),
|
|
}),
|
|
},
|
|
}));
|
|
|
|
describe('/api/admin/users/[id]', () => {
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
describe('GET', () => {
|
|
it('should return 401 if not authenticated', async () => {
|
|
const request = new NextRequest('http://localhost/api/admin/users/test-id');
|
|
const response = await GET(request, { params: Promise.resolve({ id: 'test-id' }) });
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(401);
|
|
expect(data.error).toBe('未授权');
|
|
});
|
|
|
|
it('should return 403 if no permission', async () => {
|
|
const { auth } = require('@/lib/auth');
|
|
const { hasPermission } = require('@/lib/auth/permissions');
|
|
|
|
auth.mockResolvedValue({ user: { role: 'viewer' } });
|
|
hasPermission.mockReturnValue(false);
|
|
|
|
const request = new NextRequest('http://localhost/api/admin/users/test-id');
|
|
const response = await GET(request, { params: Promise.resolve({ id: 'test-id' }) });
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(403);
|
|
expect(data.error).toBe('无权限');
|
|
});
|
|
|
|
it('should return user if authenticated and has permission', async () => {
|
|
const { auth } = require('@/lib/auth');
|
|
const { hasPermission } = require('@/lib/auth/permissions');
|
|
|
|
auth.mockResolvedValue({ user: { role: 'admin' } });
|
|
hasPermission.mockReturnValue(true);
|
|
|
|
const request = new NextRequest('http://localhost/api/admin/users/test-id');
|
|
const response = await GET(request, { params: Promise.resolve({ id: 'test-id' }) });
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(200);
|
|
expect(data.user).toBeDefined();
|
|
});
|
|
});
|
|
|
|
describe('PUT', () => {
|
|
it('should return 401 if not authenticated', async () => {
|
|
const { auth } = require('@/lib/auth');
|
|
auth.mockResolvedValue(null);
|
|
|
|
const request = new NextRequest('http://localhost/api/admin/users/test-id', {
|
|
method: 'PUT',
|
|
body: JSON.stringify({ name: 'Updated User' }),
|
|
});
|
|
const response = await PUT(request, { params: Promise.resolve({ id: 'test-id' }) });
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(401);
|
|
expect(data.error).toBe('未授权');
|
|
});
|
|
});
|
|
|
|
describe('DELETE', () => {
|
|
it('should return 401 if not authenticated', async () => {
|
|
const { auth } = require('@/lib/auth');
|
|
auth.mockResolvedValue(null);
|
|
|
|
const request = new NextRequest('http://localhost/api/admin/users/test-id', {
|
|
method: 'DELETE',
|
|
});
|
|
const response = await DELETE(request, { params: Promise.resolve({ id: 'test-id' }) });
|
|
const data = await response.json();
|
|
|
|
expect(response.status).toBe(401);
|
|
expect(data.error).toBe('未授权');
|
|
});
|
|
});
|
|
});
|