0337c51320
ci/woodpecker/push/woodpecker Pipeline failed
- 统一依赖安装步骤,添加缓存复用,减少冗余npm ci - 整合Playwright配置文件,支持CI/本地环境自动切换 - 扩展shared-mocks.tsx,添加统一mock入口 - 修复jest.setup.js符号链接问题 - 删除冗余配置文件(jest.config.js, playwright.config.tiered.ts) - 调整CI阶段编号(7阶段→6阶段) 优化效果: - CI依赖安装时间减少约30% - 配置文件维护成本降低 - Mock复用率提升
136 lines
3.1 KiB
JavaScript
136 lines
3.1 KiB
JavaScript
require('@testing-library/jest-dom');
|
|
|
|
const { TextEncoder, TextDecoder } = require('util');
|
|
global.TextEncoder = TextEncoder;
|
|
global.TextDecoder = TextDecoder;
|
|
|
|
const { setupAllMocks } = require('./src/__mocks__/shared-mocks');
|
|
|
|
setupAllMocks();
|
|
|
|
global.console = {
|
|
...console,
|
|
error: jest.fn(),
|
|
warn: jest.fn(),
|
|
log: jest.fn(),
|
|
};
|
|
|
|
class MockIntersectionObserver {
|
|
constructor(callback, options = {}) {
|
|
this.callback = callback;
|
|
this.options = options;
|
|
this.elements = new Set();
|
|
this.observationEntries = [];
|
|
}
|
|
|
|
observe(element) {
|
|
this.elements.add(element);
|
|
const entry = {
|
|
isIntersecting: true,
|
|
target: element,
|
|
boundingClientRect: element.getBoundingClientRect ? element.getBoundingClientRect() : {},
|
|
intersectionRatio: 1,
|
|
intersectionRect: {},
|
|
rootBounds: {},
|
|
time: Date.now(),
|
|
};
|
|
this.observationEntries.push(entry);
|
|
this.callback(this.observationEntries, this);
|
|
}
|
|
|
|
unobserve(element) {
|
|
this.elements.delete(element);
|
|
}
|
|
|
|
disconnect() {
|
|
this.elements.clear();
|
|
this.observationEntries = [];
|
|
}
|
|
}
|
|
|
|
global.IntersectionObserver = MockIntersectionObserver;
|
|
|
|
class MockResizeObserver {
|
|
constructor(callback) {
|
|
this.callback = callback;
|
|
this.elements = new Set();
|
|
}
|
|
|
|
observe(element) {
|
|
this.elements.add(element);
|
|
this.callback([{ target: element, contentRect: { width: 100, height: 100 } }], this);
|
|
}
|
|
|
|
unobserve(element) {
|
|
this.elements.delete(element);
|
|
}
|
|
|
|
disconnect() {
|
|
this.elements.clear();
|
|
}
|
|
}
|
|
|
|
global.ResizeObserver = MockResizeObserver;
|
|
|
|
Object.defineProperty(window, 'matchMedia', {
|
|
writable: true,
|
|
value: jest.fn().mockImplementation(query => ({
|
|
matches: false,
|
|
media: query,
|
|
onchange: null,
|
|
addListener: jest.fn(),
|
|
removeListener: jest.fn(),
|
|
addEventListener: jest.fn(),
|
|
removeEventListener: jest.fn(),
|
|
dispatchEvent: jest.fn(),
|
|
})),
|
|
});
|
|
|
|
Object.defineProperty(window, 'scrollTo', {
|
|
writable: true,
|
|
value: jest.fn(),
|
|
});
|
|
|
|
Object.defineProperty(window, 'localStorage', {
|
|
value: {
|
|
store: {},
|
|
getItem(key) {
|
|
return this.store[key] || null;
|
|
},
|
|
setItem(key, value) {
|
|
this.store[key] = value;
|
|
},
|
|
removeItem(key) {
|
|
delete this.store[key];
|
|
},
|
|
clear() {
|
|
this.store = {};
|
|
},
|
|
},
|
|
});
|
|
|
|
jest.mock('@/db', () => ({
|
|
db: {
|
|
select: jest.fn().mockReturnValue({
|
|
from: jest.fn().mockReturnThis(),
|
|
where: jest.fn().mockReturnThis(),
|
|
orderBy: jest.fn().mockReturnThis(),
|
|
limit: jest.fn().mockReturnThis(),
|
|
execute: jest.fn().mockResolvedValue([]),
|
|
}),
|
|
insert: jest.fn().mockReturnValue({
|
|
values: jest.fn().mockReturnThis(),
|
|
returning: jest.fn().mockResolvedValue([{ id: 1 }]),
|
|
}),
|
|
update: jest.fn().mockReturnValue({
|
|
set: jest.fn().mockReturnThis(),
|
|
where: jest.fn().mockReturnThis(),
|
|
returning: jest.fn().mockResolvedValue([{ id: 1 }]),
|
|
}),
|
|
delete: jest.fn().mockReturnValue({
|
|
where: jest.fn().mockReturnThis(),
|
|
returning: jest.fn().mockResolvedValue([{ id: 1 }]),
|
|
}),
|
|
},
|
|
}));
|