setup.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { afterEach } from 'vitest';
  2. import { cleanup } from '@testing-library/react';
  3. afterEach(() => cleanup());
  4. function createStorage(): Storage {
  5. const values = new Map<string, string>();
  6. return {
  7. get length() { return values.size; },
  8. clear: () => values.clear(),
  9. getItem: (key) => values.get(key) ?? null,
  10. key: (index) => Array.from(values.keys())[index] ?? null,
  11. removeItem: (key) => values.delete(key),
  12. setItem: (key, value) => values.set(key, String(value))
  13. };
  14. }
  15. Object.defineProperty(window, 'localStorage', { configurable: true, value: createStorage() });
  16. Object.defineProperty(window, 'sessionStorage', { configurable: true, value: createStorage() });
  17. Object.defineProperty(window, 'matchMedia', {
  18. writable: true,
  19. value: (query: string) => ({
  20. matches: false,
  21. media: query,
  22. onchange: null,
  23. addListener: () => undefined,
  24. removeListener: () => undefined,
  25. addEventListener: () => undefined,
  26. removeEventListener: () => undefined,
  27. dispatchEvent: () => false
  28. })
  29. });
  30. class ResizeObserverStub {
  31. observe() {}
  32. unobserve() {}
  33. disconnect() {}
  34. }
  35. Object.defineProperty(window, 'ResizeObserver', { writable: true, value: ResizeObserverStub });
  36. Object.defineProperty(globalThis, 'ResizeObserver', { writable: true, value: ResizeObserverStub });
  37. const getComputedStyle = window.getComputedStyle.bind(window);
  38. window.getComputedStyle = (element: Element) => getComputedStyle(element);
  39. if (!window.requestAnimationFrame) {
  40. window.requestAnimationFrame = (callback) => window.setTimeout(callback, 0);
  41. window.cancelAnimationFrame = (id) => window.clearTimeout(id);
  42. }