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