Files
wehub-resource-sync bb5c75ce05
Component Security Validation / Security Audit (push) Has been cancelled
Deploy to Cloudflare Pages / deploy (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:38:58 +08:00

203 lines
4.2 KiB
JavaScript

/**
* Jest Test Setup
* Global configuration and utilities for all tests
*/
// Mock console methods to reduce noise in tests
global.console = {
...console,
log: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
info: jest.fn(),
debug: jest.fn(),
};
// Mock WebSocket for frontend tests
global.WebSocket = class MockWebSocket {
constructor(url) {
this.url = url;
this.readyState = 1; // OPEN
this.CONNECTING = 0;
this.OPEN = 1;
this.CLOSING = 2;
this.CLOSED = 3;
// Simulate async connection
setTimeout(() => {
if (this.onopen) this.onopen({});
}, 0);
}
send(data) {
// Mock send
}
close(code, reason) {
this.readyState = 3; // CLOSED
if (this.onclose) this.onclose({ code, reason });
}
addEventListener(type, callback) {
this[`on${type}`] = callback;
}
removeEventListener(type, callback) {
this[`on${type}`] = null;
}
};
// Mock Notification API
global.Notification = class MockNotification {
constructor(title, options) {
this.title = title;
this.options = options;
}
static requestPermission() {
return Promise.resolve('granted');
}
static get permission() {
return 'granted';
}
};
// Mock localStorage
const localStorageMock = {
getItem: jest.fn(),
setItem: jest.fn(),
removeItem: jest.fn(),
clear: jest.fn(),
};
global.localStorage = localStorageMock;
// Mock sessionStorage
const sessionStorageMock = {
getItem: jest.fn(),
setItem: jest.fn(),
removeItem: jest.fn(),
clear: jest.fn(),
};
global.sessionStorage = sessionStorageMock;
// Mock document for frontend tests
global.document = {
createElement: jest.fn(() => ({
click: jest.fn(),
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
setAttribute: jest.fn(),
style: {},
href: '',
download: ''
})),
getElementById: jest.fn(),
querySelector: jest.fn(),
querySelectorAll: jest.fn(() => []),
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
body: {
appendChild: jest.fn(),
removeChild: jest.fn(),
},
location: {
protocol: 'http:',
host: 'localhost:3333',
hostname: 'localhost',
port: '3333'
},
hidden: false,
visibilityState: 'visible'
};
// Mock window for frontend tests
global.window = {
location: global.document.location,
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
localStorage: localStorageMock,
sessionStorage: sessionStorageMock,
WebSocket: global.WebSocket,
Notification: global.Notification
};
// Test utilities
global.testUtils = {
/**
* Create a mock conversation object
*/
createMockConversation: (overrides = {}) => ({
id: 'conv_123',
filename: 'conversation.jsonl',
project: 'test-project',
status: 'active',
tokens: 1500,
messages: 5,
lastModified: new Date().toISOString(),
filePath: '/path/to/conversation.jsonl',
fileSize: 2048,
...overrides
}),
/**
* Create mock conversation data
*/
createMockConversationData: (count = 3) => {
const conversations = [];
for (let i = 0; i < count; i++) {
conversations.push(global.testUtils.createMockConversation({
id: `conv_${i + 1}`,
filename: `conversation_${i + 1}.jsonl`,
status: i === 0 ? 'active' : 'idle'
}));
}
return {
conversations,
summary: {
totalConversations: count,
activeConversations: 1,
totalTokens: count * 1500,
avgTokensPerConversation: 1500
}
};
},
/**
* Create a mock WebSocket message
*/
createMockWSMessage: (type, data = {}) => ({
type,
data,
timestamp: Date.now(),
server: 'Claude Code Analytics'
}),
/**
* Wait for async operations
*/
waitFor: (ms = 0) => new Promise(resolve => setTimeout(resolve, ms)),
/**
* Mock file system operations
*/
mockFs: {
existsSync: jest.fn(),
readFileSync: jest.fn(),
writeFileSync: jest.fn(),
stat: jest.fn(),
readFile: jest.fn(),
writeFile: jest.fn(),
}
};
// Increase timeout for integration tests
jest.setTimeout(30000);
// Clean up after each test
afterEach(() => {
jest.clearAllMocks();
global.console.log.mockClear();
global.console.warn.mockClear();
global.console.error.mockClear();
});