import { act, render } from '@testing-library/react'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { UpdatedStreamOverlay } from '../../components/UpdatedStreamOverlay'; const props = { size: 'medium' as const, camera: null, name: 'Workshop', model: null, filename: null, status: null, state: null, progress: null, layers: null, remaining: null, eta: null, temperatures: [], }; afterEach(() => vi.restoreAllMocks()); describe('Version 2 orientation', () => { it('follows viewport changes for legacy URLs and removes its listener on unmount', () => { let change: ((event: { matches: boolean }) => void) | undefined; const removeEventListener = vi.fn(); vi.spyOn(window, 'matchMedia').mockReturnValue({ matches: true, addEventListener: (_: string, listener: typeof change) => { change = listener; }, removeEventListener, } as unknown as MediaQueryList); const view = render(); const overlay = view.container.firstElementChild; expect(overlay).toHaveAttribute('data-layout', 'portrait'); act(() => change?.({ matches: false })); expect(overlay).toHaveAttribute('data-layout', 'landscape'); act(() => change?.({ matches: true })); expect(overlay).toHaveAttribute('data-layout', 'portrait'); view.unmount(); expect(removeEventListener).toHaveBeenCalledWith('change', change); }); it.each(['landscape', 'portrait'] as const)('keeps explicit %s independent of viewport orientation', (layout) => { vi.spyOn(window, 'matchMedia').mockReturnValue({ matches: layout !== 'portrait' } as MediaQueryList); const view = render(); expect(view.container.firstElementChild).toHaveAttribute('data-layout', layout); }); });