All files / __tests__ test-utils.tsx

91.66% Statements 11/12
100% Branches 2/2
87.5% Functions 7/8
91.66% Lines 11/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68          6x   7x                                 6x       3x       41x       44x                 6x         6x 30x             6x     30x            
import React, { ReactElement } from 'react';
import { render, RenderOptions } from '@testing-library/react';
import { ThemeProvider } from '../context/ThemeContext';
 
// Define a proper matchMedia mock
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(),
  })),
});
 
// Define a proper localStorage mock
class LocalStorageMock {
  store: Record<string, string>;
  
  constructor() {
    this.store = {};
  }
 
  clear() {
    this.store = {};
  }
 
  getItem(key: string) {
    return this.store[key] || null;
  }
 
  setItem(key: string, value: string) {
    this.store[key] = String(value);
  }
 
  removeItem(key: string) {
    delete this.store[key];
  }
}
 
// Apply localStorage mock
Object.defineProperty(window, 'localStorage', {
  value: new LocalStorageMock(),
});
 
// Custom render function that includes providers
const AllTheProviders = ({ children }: { children: React.ReactNode }) => {
  return (
    <ThemeProvider>
      {children}
    </ThemeProvider>
  );
};
 
const customRender = (
  ui: ReactElement,
  options?: Omit<RenderOptions, 'wrapper'>,
) => render(ui, { wrapper: AllTheProviders, ...options });
 
// re-export everything
export * from '@testing-library/react';
 
// override render method
export { customRender as render };