// Jest setup file for React Testing Library // This file is automatically loaded by Create React App before running tests // Polyfill TextEncoder/TextDecoder for react-router v7 compatibility // See: https://github.com/remix-run/react-router/issues/12363 import { TextDecoder, TextEncoder } from 'util'; global.TextEncoder = TextEncoder; global.TextDecoder = TextDecoder; import '@testing-library/jest-dom'; // Set global Jest timeout to 30 seconds // Tests that exceed this will fail with a clear error message identifying the failing test jest.setTimeout(30000); // Mock react-stl-viewer to avoid loading heavy three.js dependency in tests jest.mock('react-stl-viewer', () => ({ StlViewer: () => null, })); // Mock window.matchMedia (used by the responsive Media components) Object.defineProperty(window, 'matchMedia', { writable: true, value: jest.fn().mockImplementation(query => ({ matches: false, media: query, onchange: null, addListener: jest.fn(), // deprecated removeListener: jest.fn(), // deprecated addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), })), }); // Mock IntersectionObserver (if needed for lazy loading) global.IntersectionObserver = class IntersectionObserver { constructor() { } disconnect() { } observe() { } takeRecords() { return []; } unobserve() { } }; // Mock ResizeObserver (used by Mantine's ScrollArea, e.g. inside Select/Combobox dropdowns). global.ResizeObserver = class ResizeObserver { constructor() { } disconnect() { } observe() { } unobserve() { } }; // Suppress console errors during tests (optional - uncomment if needed) // const originalError = console.error; // beforeAll(() => { // console.error = (...args) => { // if ( // typeof args[0] === 'string' && // args[0].includes('Warning: ReactDOM.render') // ) { // return; // } // originalError.call(console, ...args); // }; // }); // // afterAll(() => { // console.error = originalError; // });