import '@testing-library/jest-dom' import { server } from './server' beforeAll(() => server.listen({ onUnhandledRequest: 'error' })) afterEach(() => server.resetHandlers()) afterAll(() => server.close()) Object.defineProperty(window, 'matchMedia', { writable: true, value: (query: string) => ({ matches: false, media: query, onchange: null, addListener: () => {}, removeListener: () => {}, addEventListener: () => {}, removeEventListener: () => {}, dispatchEvent: () => false, }), }) // Prevent lightweight-charts animation frame callbacks in jsdom window.requestAnimationFrame = () => 0 window.cancelAnimationFrame = () => {} // Mock canvas 2D context to prevent jsdom "Not implemented" warnings from lightweight-charts HTMLCanvasElement.prototype.getContext = ((contextId: string) => { if (contextId === '2d') { return { canvas: {} as HTMLCanvasElement, fillRect: () => {}, clearRect: () => {}, getImageData: () => ({ data: [], width: 0, height: 0 }), putImageData: () => {}, createImageData: () => ({ width: 0, height: 0, data: [] }), setTransform: () => {}, drawImage: () => {}, save: () => {}, fillText: () => {}, restore: () => {}, beginPath: () => {}, moveTo: () => {}, lineTo: () => {}, closePath: () => {}, stroke: () => {}, translate: () => {}, scale: () => {}, rotate: () => {}, arc: () => {}, fill: () => {}, measureText: () => ({ width: 0 }), transform: () => {}, rect: () => {}, clip: () => {}, createLinearGradient: () => ({ addColorStop: () => {} }), createRadialGradient: () => ({ addColorStop: () => {} }), createPattern: () => ({ setTransform: () => {} }), font: '', fillStyle: '', strokeStyle: '', lineWidth: 1, lineCap: 'butt' as CanvasLineCap, lineJoin: 'miter' as CanvasLineJoin, globalAlpha: 1, globalCompositeOperation: 'source-over' as GlobalCompositeOperation, shadowBlur: 0, shadowColor: '', shadowOffsetX: 0, shadowOffsetY: 0, } as unknown as CanvasRenderingContext2D } return null }) as typeof HTMLCanvasElement.prototype.getContext