310 lines
No EOL
7.1 KiB
TypeScript
310 lines
No EOL
7.1 KiB
TypeScript
import '@testing-library/jest-dom';
|
|
import { configure } from '@testing-library/react';
|
|
import { server } from './mocks/server';
|
|
|
|
// Configuration de Testing Library
|
|
configure({
|
|
testIdAttribute: 'data-testid',
|
|
});
|
|
|
|
// Mock du serveur MSW
|
|
beforeAll(() => server.listen());
|
|
afterEach(() => server.resetHandlers());
|
|
afterAll(() => server.close());
|
|
|
|
// Mock de ResizeObserver
|
|
global.ResizeObserver = jest.fn().mockImplementation(() => ({
|
|
observe: jest.fn(),
|
|
unobserve: jest.fn(),
|
|
disconnect: jest.fn(),
|
|
}));
|
|
|
|
// Mock de IntersectionObserver
|
|
global.IntersectionObserver = jest.fn().mockImplementation(() => ({
|
|
observe: jest.fn(),
|
|
unobserve: jest.fn(),
|
|
disconnect: jest.fn(),
|
|
}));
|
|
|
|
// Mock de matchMedia
|
|
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(),
|
|
})),
|
|
});
|
|
|
|
// Mock de localStorage
|
|
const localStorageMock = {
|
|
getItem: jest.fn(),
|
|
setItem: jest.fn(),
|
|
removeItem: jest.fn(),
|
|
clear: jest.fn(),
|
|
};
|
|
global.localStorage = localStorageMock;
|
|
|
|
// Mock de sessionStorage
|
|
const sessionStorageMock = {
|
|
getItem: jest.fn(),
|
|
setItem: jest.fn(),
|
|
removeItem: jest.fn(),
|
|
clear: jest.fn(),
|
|
};
|
|
global.sessionStorage = sessionStorageMock;
|
|
|
|
// Mock de fetch
|
|
global.fetch = jest.fn();
|
|
|
|
// Mock de WebSocket
|
|
global.WebSocket = jest.fn().mockImplementation(() => ({
|
|
send: jest.fn(),
|
|
close: jest.fn(),
|
|
addEventListener: jest.fn(),
|
|
removeEventListener: jest.fn(),
|
|
readyState: 1,
|
|
}));
|
|
|
|
// Mock de Audio
|
|
global.Audio = jest.fn().mockImplementation(() => ({
|
|
play: jest.fn(),
|
|
pause: jest.fn(),
|
|
load: jest.fn(),
|
|
addEventListener: jest.fn(),
|
|
removeEventListener: jest.fn(),
|
|
}));
|
|
|
|
// Mock de MediaRecorder
|
|
global.MediaRecorder = jest.fn().mockImplementation(() => ({
|
|
start: jest.fn(),
|
|
stop: jest.fn(),
|
|
pause: jest.fn(),
|
|
resume: jest.fn(),
|
|
addEventListener: jest.fn(),
|
|
removeEventListener: jest.fn(),
|
|
}));
|
|
|
|
// Mock de getUserMedia
|
|
Object.defineProperty(navigator, 'mediaDevices', {
|
|
value: {
|
|
getUserMedia: jest.fn().mockResolvedValue({}),
|
|
enumerateDevices: jest.fn().mockResolvedValue([]),
|
|
},
|
|
});
|
|
|
|
// Mock de Notification
|
|
global.Notification = jest.fn().mockImplementation(() => ({
|
|
close: jest.fn(),
|
|
}));
|
|
|
|
// Mock de requestAnimationFrame
|
|
global.requestAnimationFrame = jest.fn(callback => setTimeout(callback, 0));
|
|
global.cancelAnimationFrame = jest.fn();
|
|
|
|
// Mock de performance
|
|
global.performance = {
|
|
now: jest.fn(() => Date.now()),
|
|
mark: jest.fn(),
|
|
measure: jest.fn(),
|
|
getEntriesByName: jest.fn(() => []),
|
|
getEntriesByType: jest.fn(() => []),
|
|
getEntries: jest.fn(() => []),
|
|
clearMarks: jest.fn(),
|
|
clearMeasures: jest.fn(),
|
|
clearResourceTimings: jest.fn(),
|
|
setResourceTimingBufferSize: jest.fn(),
|
|
toJSON: jest.fn(),
|
|
timeOrigin: Date.now(),
|
|
} as any;
|
|
|
|
// Mock de crypto
|
|
Object.defineProperty(global, 'crypto', {
|
|
value: {
|
|
getRandomValues: jest.fn((arr) => {
|
|
for (let i = 0; i < arr.length; i++) {
|
|
arr[i] = Math.floor(Math.random() * 256);
|
|
}
|
|
return arr;
|
|
}),
|
|
subtle: {
|
|
generateKey: jest.fn(),
|
|
importKey: jest.fn(),
|
|
exportKey: jest.fn(),
|
|
sign: jest.fn(),
|
|
verify: jest.fn(),
|
|
encrypt: jest.fn(),
|
|
decrypt: jest.fn(),
|
|
deriveKey: jest.fn(),
|
|
deriveBits: jest.fn(),
|
|
digest: jest.fn(),
|
|
},
|
|
},
|
|
});
|
|
|
|
// Mock de console pour éviter le bruit dans les tests
|
|
const originalConsoleError = console.error;
|
|
const originalConsoleWarn = console.warn;
|
|
|
|
beforeEach(() => {
|
|
console.error = jest.fn();
|
|
console.warn = jest.fn();
|
|
});
|
|
|
|
afterEach(() => {
|
|
console.error = originalConsoleError;
|
|
console.warn = originalConsoleWarn;
|
|
});
|
|
|
|
// Configuration des tests Redux
|
|
import { configureStore } from '@reduxjs/toolkit';
|
|
import { Provider } from 'react-redux';
|
|
import { render } from '@testing-library/react';
|
|
import { store } from './store/store';
|
|
|
|
// Wrapper personnalisé pour les tests avec Redux
|
|
export const renderWithProviders = (
|
|
ui: React.ReactElement,
|
|
{
|
|
preloadedState = {},
|
|
store = configureStore({
|
|
reducer: {
|
|
// Ajouter les reducers nécessaires ici
|
|
},
|
|
preloadedState,
|
|
}),
|
|
...renderOptions
|
|
} = {}
|
|
) => {
|
|
const Wrapper = ({ children }: { children: React.ReactNode }) => {
|
|
return <Provider store={store}>{children}</Provider>;
|
|
};
|
|
return { store, ...render(ui, { wrapper: Wrapper, ...renderOptions }) };
|
|
};
|
|
|
|
// Utilitaires de test
|
|
export const createMockUser = (overrides = {}) => ({
|
|
id: 'user-1',
|
|
email: 'test@example.com',
|
|
name: 'Test User',
|
|
...overrides,
|
|
});
|
|
|
|
export const createMockFeature = (overrides = {}) => ({
|
|
id: 'feature-1',
|
|
name: 'Test Feature',
|
|
version: '1.0.0',
|
|
type: 'test',
|
|
domain: 'test',
|
|
status: 'running',
|
|
health: {
|
|
status: 'healthy',
|
|
message: 'Feature is running normally',
|
|
timestamp: new Date().toISOString(),
|
|
metrics: {},
|
|
},
|
|
metrics: {
|
|
cpu: 10.5,
|
|
memory: 1024 * 1024 * 100, // 100MB
|
|
disk: 1024 * 1024 * 50, // 50MB
|
|
network: 1024 * 1024 * 10, // 10MB
|
|
custom: {},
|
|
},
|
|
configuration: {},
|
|
attachedCores: [],
|
|
dependencies: [],
|
|
createdAt: new Date().toISOString(),
|
|
updatedAt: new Date().toISOString(),
|
|
...overrides,
|
|
});
|
|
|
|
export const createMockMediaItem = (overrides = {}) => ({
|
|
id: 'media-1',
|
|
title: 'Test Media',
|
|
type: 'audio' as const,
|
|
url: 'https://example.com/media.mp3',
|
|
size: 1024 * 1024 * 5, // 5MB
|
|
format: 'mp3',
|
|
metadata: {
|
|
artist: 'Test Artist',
|
|
album: 'Test Album',
|
|
genre: 'Test Genre',
|
|
year: 2024,
|
|
bitrate: 320,
|
|
sampleRate: 44100,
|
|
channels: 2,
|
|
},
|
|
status: 'ready' as const,
|
|
createdAt: new Date().toISOString(),
|
|
updatedAt: new Date().toISOString(),
|
|
...overrides,
|
|
});
|
|
|
|
export const createMockPlaylist = (overrides = {}) => ({
|
|
id: 'playlist-1',
|
|
name: 'Test Playlist',
|
|
description: 'A test playlist',
|
|
items: [],
|
|
isPublic: true,
|
|
createdAt: new Date().toISOString(),
|
|
updatedAt: new Date().toISOString(),
|
|
...overrides,
|
|
});
|
|
|
|
export const createMockDashboard = (overrides = {}) => ({
|
|
id: 'dashboard-1',
|
|
name: 'Test Dashboard',
|
|
description: 'A test dashboard',
|
|
widgets: [],
|
|
layout: {
|
|
columns: 12,
|
|
rows: 6,
|
|
widgets: [],
|
|
},
|
|
createdAt: new Date().toISOString(),
|
|
updatedAt: new Date().toISOString(),
|
|
...overrides,
|
|
});
|
|
|
|
// Mock des services
|
|
export const mockApiService = {
|
|
get: jest.fn(),
|
|
post: jest.fn(),
|
|
put: jest.fn(),
|
|
delete: jest.fn(),
|
|
patch: jest.fn(),
|
|
};
|
|
|
|
export const mockWebSocketService = {
|
|
connect: jest.fn(),
|
|
disconnect: jest.fn(),
|
|
send: jest.fn(),
|
|
on: jest.fn(),
|
|
off: jest.fn(),
|
|
};
|
|
|
|
export const mockAuthService = {
|
|
login: jest.fn(),
|
|
logout: jest.fn(),
|
|
register: jest.fn(),
|
|
refreshToken: jest.fn(),
|
|
getCurrentUser: jest.fn(),
|
|
};
|
|
|
|
// Configuration des mocks par défaut
|
|
jest.mock('./services/api', () => ({
|
|
apiService: mockApiService,
|
|
}));
|
|
|
|
jest.mock('./services/websocket', () => ({
|
|
websocketService: mockWebSocketService,
|
|
}));
|
|
|
|
jest.mock('./services/auth', () => ({
|
|
authService: mockAuthService,
|
|
}));
|