// @vitest-environment jsdom import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { render, screen, act } from '@testing-library/react' import { LandscapeGuard } from '@/components/mobile/landscape-guard' type Listener = (e: MediaQueryListEvent) => void function mockMatchMedia(initialPortrait: boolean) { let matches = initialPortrait let listener: Listener | null = null const mql = { get matches() { return matches }, media: '(orientation: portrait)', onchange: null, addEventListener: (_: string, l: Listener) => { listener = l }, removeEventListener: () => { listener = null }, addListener: () => {}, removeListener: () => {}, dispatchEvent: () => false, } Object.defineProperty(window, 'matchMedia', { writable: true, configurable: true, value: () => mql, }) return { setPortrait(p: boolean) { matches = p if (listener) listener({ matches: p } as MediaQueryListEvent) }, } } describe('LandscapeGuard', () => { beforeEach(() => {}) afterEach(() => { vi.restoreAllMocks() }) it('renders children always', () => { mockMatchMedia(false) render(
kids
) expect(screen.getByText('kids')).toBeTruthy() }) it('shows overlay in portrait', () => { mockMatchMedia(true) render(
kids
) expect(screen.getByRole('alert').textContent).toContain('Draai je telefoon naar landscape') // children blijven in DOM (geen unmount → SSE-streams blijven leven) expect(screen.getByText('kids')).toBeTruthy() }) it('hides overlay in landscape', () => { mockMatchMedia(false) render(
kids
) expect(screen.queryByRole('alert')).toBeNull() }) it('toggles overlay on orientation change', () => { const ctl = mockMatchMedia(false) render(
kids
) expect(screen.queryByRole('alert')).toBeNull() act(() => ctl.setPortrait(true)) expect(screen.getByRole('alert')).toBeTruthy() act(() => ctl.setPortrait(false)) expect(screen.queryByRole('alert')).toBeNull() }) })