UpdatedStreamOverlay.test.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { act, render } from '@testing-library/react';
  2. import { afterEach, describe, expect, it, vi } from 'vitest';
  3. import { UpdatedStreamOverlay } from '../../components/UpdatedStreamOverlay';
  4. const props = {
  5. size: 'medium' as const, camera: null, name: 'Workshop', model: null,
  6. filename: null, status: null, state: null, progress: null, layers: null,
  7. remaining: null, eta: null, temperatures: [],
  8. };
  9. afterEach(() => vi.restoreAllMocks());
  10. describe('Version 2 orientation', () => {
  11. it('follows viewport changes for legacy URLs and removes its listener on unmount', () => {
  12. let change: ((event: { matches: boolean }) => void) | undefined;
  13. const removeEventListener = vi.fn();
  14. vi.spyOn(window, 'matchMedia').mockReturnValue({
  15. matches: true,
  16. addEventListener: (_: string, listener: typeof change) => { change = listener; },
  17. removeEventListener,
  18. } as unknown as MediaQueryList);
  19. const view = render(<UpdatedStreamOverlay {...props} />);
  20. const overlay = view.container.firstElementChild;
  21. expect(overlay).toHaveAttribute('data-layout', 'portrait');
  22. act(() => change?.({ matches: false }));
  23. expect(overlay).toHaveAttribute('data-layout', 'landscape');
  24. act(() => change?.({ matches: true }));
  25. expect(overlay).toHaveAttribute('data-layout', 'portrait');
  26. view.unmount();
  27. expect(removeEventListener).toHaveBeenCalledWith('change', change);
  28. });
  29. it.each(['landscape', 'portrait'] as const)('keeps explicit %s independent of viewport orientation', (layout) => {
  30. vi.spyOn(window, 'matchMedia').mockReturnValue({ matches: layout !== 'portrait' } as MediaQueryList);
  31. const view = render(<UpdatedStreamOverlay {...props} layout={layout} />);
  32. expect(view.container.firstElementChild).toHaveAttribute('data-layout', layout);
  33. });
  34. });