import { act } from '@testing-library/react' import * as React from 'react' import renderWithTheme from '../../tests/helpers/renderWithTheme' import { ScreenSizeContext, ScreenSizeProvider, SIZES } from './ScreenSizeProvider' const Size: React.FC = () => { return ( {(value): React.ReactElement => {value.toString()}} ) } interface MQ { minPx: number matches: boolean removeEventListener: (evtType: string, x: () => void) => void addEventListener: (evtType: string, x: () => void) => void } describe('component: ScreenSizeProvider', () => { const matchMedia = window.matchMedia const media = { queries: [] as MQ[], listener: () => { return }, //eslint-disable-next-line @typescript-eslint/no-unused-vars setWidth: (x: number) => { return }, } const mockMedia = (): jest.MockContext => { const mock = jest.fn((query: string): MQ => { const minPxMatch = query.match(/\d+/g) const result: MQ = { minPx: minPxMatch ? parseInt(minPxMatch[0]) : 0, matches: false, removeEventListener: () => { return }, addEventListener: (_, listener) => { media.listener = listener }, } media.queries.push(result) return result }) window.matchMedia = mock as any media.queries = [] as MQ[] media.setWidth = (width: number) => { for (const mq of media.queries) { mq.matches = width >= mq.minPx } act(media.listener) } return mock.mock } afterEach(() => { window.matchMedia = matchMedia }) test('changing screen size', () => { const mock = mockMedia() const { container } = renderWithTheme( ) expect(container).toHaveTextContent('tiny') expect(mock.calls).toEqual([ ['screen and (min-width: 768px)'], ['screen and (min-width: 1024px)'], ['screen and (min-width: 1200px)'], ['screen and (min-width: 1440px)'], ]) media.setWidth(767) expect(container).toHaveTextContent('tiny') media.setWidth(768) expect(container).toHaveTextContent('small') media.setWidth(1440) expect(container).toHaveTextContent('extraLarge') media.setWidth(1000) expect(container).toHaveTextContent('small') media.setWidth(1250) expect(container).toHaveTextContent('large') media.setWidth(1024) expect(container).toHaveTextContent('medium') media.setWidth(1200) expect(container).toHaveTextContent('large') media.setWidth(1199) expect(container).toHaveTextContent('medium') }) test('size comparisons', () => { expect(SIZES.tiny < SIZES.small).toBe(true) expect(SIZES.tiny < SIZES.large).toBe(true) expect(SIZES.small < SIZES.large).toBe(true) expect(SIZES.large < SIZES.extraLarge).toBe(true) expect(SIZES.large > SIZES.small).toBe(true) expect(SIZES.tiny > SIZES.small).toBe(false) expect(SIZES.tiny > SIZES.large).toBe(false) expect(SIZES.small > SIZES.large).toBe(false) expect(SIZES.large > SIZES.extraLarge).toBe(false) expect(SIZES.large < SIZES.small).toBe(false) }) })