veza/veza-mobile/src/setupTests.ts

310 lines
7.1 KiB
TypeScript
Raw Normal View History

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