Files
novalon-website/jest.setup.js
T
张翔 0337c51320
ci/woodpecker/push/woodpecker Pipeline failed
refactor(ci): 优化CI/CD流水线和测试配置
- 统一依赖安装步骤,添加缓存复用,减少冗余npm ci
- 整合Playwright配置文件,支持CI/本地环境自动切换
- 扩展shared-mocks.tsx,添加统一mock入口
- 修复jest.setup.js符号链接问题
- 删除冗余配置文件(jest.config.js, playwright.config.tiered.ts)
- 调整CI阶段编号(7阶段→6阶段)

优化效果:
- CI依赖安装时间减少约30%
- 配置文件维护成本降低
- Mock复用率提升
2026-03-29 14:06:57 +08:00

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 }]),
}),
},
}));