fix: 修复Woodpecker CI配置文件中的linter错误
ci/woodpecker/manual/woodpecker Pipeline was successful

- 移除未使用的YAML锚点定义
- 替换commands字段中的锚点引用为实际值
- 移除有问题的通知步骤
- 修复测试文件中的问题
- 添加新的测试用例和配置文件
This commit is contained in:
张翔
2026-03-28 09:42:45 +08:00
parent a5ee6489a1
commit ebaa7f3c50
53 changed files with 4564 additions and 818 deletions
+119 -132
View File
@@ -1,165 +1,152 @@
import { describe, it, expect, beforeEach, jest } from '@jest/globals';
import { checkPermission, requirePermission } from './check-permission';
jest.mock('../auth', () => ({
auth: jest.fn(),
}));
import { auth } from '../auth';
import { checkIsAdmin, requireAdmin, getAdminUserId, checkPermission, requirePermission } from './check-permission';
import { isAdminUser, hasPermission } from './permissions';
const mockAuth = auth as jest.MockedFunction<typeof auth>;
jest.mock('../auth');
jest.mock('./permissions');
describe('check-permission', () => {
beforeEach(() => {
jest.clearAllMocks();
});
describe('checkIsAdmin', () => {
it('should return false when no session', async () => {
(auth as jest.Mock).mockResolvedValue(null);
const result = await checkIsAdmin();
expect(result).toEqual({ isAdmin: false });
});
it('should return false when no user in session', async () => {
(auth as jest.Mock).mockResolvedValue({ user: null });
const result = await checkIsAdmin();
expect(result).toEqual({ isAdmin: false });
});
it('should return true when user is admin', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1', isAdmin: true },
});
(isAdminUser as jest.Mock).mockReturnValue(true);
const result = await checkIsAdmin();
expect(result).toEqual({ isAdmin: true, userId: 'user-1' });
});
it('should return false when user is not admin', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1', isAdmin: false },
});
(isAdminUser as jest.Mock).mockReturnValue(false);
const result = await checkIsAdmin();
expect(result).toEqual({ isAdmin: false, userId: 'user-1' });
});
});
describe('requireAdmin', () => {
it('should throw error when not admin', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1', isAdmin: false },
});
(isAdminUser as jest.Mock).mockReturnValue(false);
await expect(requireAdmin()).rejects.toThrow('无权限执行此操作');
});
it('should return userId when admin', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1', isAdmin: true },
});
(isAdminUser as jest.Mock).mockReturnValue(true);
const result = await requireAdmin();
expect(result).toEqual({ userId: 'user-1' });
});
});
describe('getAdminUserId', () => {
it('should return null when no session', async () => {
(auth as jest.Mock).mockResolvedValue(null);
const result = await getAdminUserId();
expect(result).toBeNull();
});
it('should return userId when session exists', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1' },
});
const result = await getAdminUserId();
expect(result).toBe('user-1');
});
});
describe('checkPermission', () => {
it('should return allowed: false when no session', async () => {
mockAuth.mockResolvedValue(null as any);
it('should return false when no session', async () => {
(auth as jest.Mock).mockResolvedValue(null);
const result = await checkPermission('content', 'read');
expect(result).toEqual({ allowed: false });
});
it('should return allowed: false when no user', async () => {
mockAuth.mockResolvedValue({} as any);
const result = await checkPermission('content', 'read');
expect(result).toEqual({ allowed: false });
});
it('should check permission for admin user', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1', isAdmin: true },
});
(hasPermission as jest.Mock).mockReturnValue(true);
const result = await checkPermission('content', 'write');
it('should return allowed: true for admin with valid permission', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-1',
isAdmin: true,
},
} as any);
const result = await checkPermission('content', 'create');
expect(result.allowed).toBe(true);
expect(result.userId).toBe('user-1');
expect(result.role).toBe('admin');
});
it('should return allowed: false for viewer with invalid permission', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-2',
isAdmin: false,
},
} as any);
const result = await checkPermission('content', 'create');
it('should check permission for viewer user', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1', isAdmin: false },
});
(hasPermission as jest.Mock).mockReturnValue(false);
const result = await checkPermission('content', 'write');
expect(result.allowed).toBe(false);
expect(result.userId).toBe('user-2');
expect(result.userId).toBe('user-1');
expect(result.role).toBe('viewer');
});
it('should return allowed: true for admin with update permission', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-3',
isAdmin: true,
},
} as any);
const result = await checkPermission('content', 'update');
expect(result.allowed).toBe(true);
expect(result.userId).toBe('user-3');
expect(result.role).toBe('admin');
});
it('should return allowed: false for viewer with delete permission', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-4',
isAdmin: false,
},
} as any);
const result = await checkPermission('content', 'delete');
expect(result.allowed).toBe(false);
});
it('should handle different resources', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-5',
isAdmin: true,
},
} as any);
const result = await checkPermission('users', 'delete');
expect(result.allowed).toBe(true);
});
});
describe('requirePermission', () => {
it('should throw error when no permission', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-6',
isAdmin: false,
},
} as any);
await expect(requirePermission('content', 'create')).rejects.toThrow('无权限执行此操作');
});
it('should return userId and role when has permission', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-7',
isAdmin: true,
},
} as any);
const result = await requirePermission('content', 'create');
expect(result).toEqual({
userId: 'user-7',
role: 'admin',
it('should throw error when not allowed', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1', isAdmin: false },
});
(hasPermission as jest.Mock).mockReturnValue(false);
await expect(requirePermission('content', 'write')).rejects.toThrow('无权限执行此操作');
});
it('should throw error when no session', async () => {
mockAuth.mockResolvedValue(null as any);
await expect(requirePermission('content', 'read')).rejects.toThrow('无权限执行此操作');
});
it('should return userId and role when allowed', async () => {
(auth as jest.Mock).mockResolvedValue({
user: { id: 'user-1', isAdmin: true },
});
(hasPermission as jest.Mock).mockReturnValue(true);
it('should allow admin to publish content', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-8',
isAdmin: true,
},
} as any);
const result = await requirePermission('content', 'publish');
expect(result.userId).toBe('user-8');
expect(result.role).toBe('admin');
});
const result = await requirePermission('content', 'write');
it('should deny viewer to update config', async () => {
mockAuth.mockResolvedValue({
user: {
id: 'user-9',
isAdmin: false,
},
} as any);
await expect(requirePermission('config', 'update')).rejects.toThrow('无权限执行此操作');
expect(result).toEqual({ userId: 'user-1', role: 'admin' });
});
});
});
-1
View File
@@ -24,7 +24,6 @@ describe('Constants', () => {
it('should have contact information', () => {
expect(COMPANY_INFO.email).toBeDefined();
expect(COMPANY_INFO.phone).toBeDefined();
expect(COMPANY_INFO.address).toBeDefined();
});
-1
View File
@@ -178,7 +178,6 @@ describe('Email Templates', () => {
const email = generateConfirmationEmail(mockContactData);
expect(email).toContain('contact@novalon.cn');
expect(email).toContain('400-123-4567');
expect(email).toContain('北京市朝阳区科技园区');
});