|
1 | 1 | import React from 'react'
|
| 2 | +import { act, renderDark, renderLight, renderPlain, screen } from 'test-utils' |
2 | 3 | import { ThemeProvider } from '.'
|
3 | 4 | import {
|
4 |
| - UtilityUseThemeResolve, |
5 | 5 | UtilityUseThemeController,
|
| 6 | + UtilityUseThemeResolve, |
6 | 7 | } from './ThemeProvider.stories'
|
7 |
| -import { renderPlain, renderLight, renderDark } from 'test-utils' |
| 8 | + |
| 9 | +// eslint-disable-next-line @typescript-eslint/no-explicit-any |
| 10 | +let addEventListener: jest.Mock |
| 11 | + |
| 12 | +beforeEach(() => { |
| 13 | + addEventListener = jest.fn() |
| 14 | + |
| 15 | + // Official way to supply missing window method https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom |
| 16 | + Object.defineProperty(window, 'matchMedia', { |
| 17 | + writable: true, |
| 18 | + value: jest.fn().mockImplementation((query: string) => ({ |
| 19 | + matches: false, |
| 20 | + media: query, |
| 21 | + onchange: null, |
| 22 | + addListener: jest.fn(), // Deprecated |
| 23 | + removeListener: jest.fn(), // Deprecated |
| 24 | + addEventListener, |
| 25 | + removeEventListener: jest.fn(), |
| 26 | + dispatchEvent: jest.fn(), |
| 27 | + })), |
| 28 | + }) |
| 29 | +}) |
8 | 30 |
|
9 | 31 | it('renders light without error', () => {
|
10 | 32 | const { asFragment } = renderPlain(<ThemeProvider />)
|
11 | 33 | expect(asFragment()).toBeDefined()
|
| 34 | + expect(addEventListener).toHaveBeenCalledTimes(4) |
12 | 35 | })
|
13 | 36 |
|
14 | 37 | it('renders dark without error', () => {
|
15 | 38 | const { asFragment } = renderPlain(<ThemeProvider choice="dark" />)
|
16 | 39 | expect(asFragment()).toBeDefined()
|
| 40 | + expect(addEventListener).toHaveBeenCalledTimes(4) |
17 | 41 | })
|
18 | 42 |
|
19 |
| -it('renders resolutions within light theme', () => { |
20 |
| - const { asFragment } = renderLight(<UtilityUseThemeResolve />) |
21 |
| - expect(asFragment()).toBeDefined() |
| 43 | +it('changing system/window theme changes to dark sets the theme', async () => { |
| 44 | + renderPlain( |
| 45 | + <ThemeProvider> |
| 46 | + <UtilityUseThemeResolve /> |
| 47 | + </ThemeProvider> |
| 48 | + ) |
| 49 | + |
| 50 | + act(() => { |
| 51 | + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access |
| 52 | + const listener = addEventListener.mock.calls[0][1] as (e: { |
| 53 | + matches: string |
| 54 | + }) => void |
| 55 | + listener({ matches: 'dark' }) |
| 56 | + }) |
| 57 | + |
| 58 | + expect(await screen.findByText('#000000')).toBeInTheDocument() |
22 | 59 | })
|
23 | 60 |
|
24 |
| -it('renders resolutions within dark theme', () => { |
25 |
| - const { asFragment } = renderDark(<UtilityUseThemeResolve />) |
26 |
| - expect(asFragment()).toBeDefined() |
| 61 | +it('changing system/window theme to light sets the theme', async () => { |
| 62 | + renderPlain( |
| 63 | + <ThemeProvider> |
| 64 | + <UtilityUseThemeResolve /> |
| 65 | + </ThemeProvider> |
| 66 | + ) |
| 67 | + act(() => { |
| 68 | + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access |
| 69 | + const listener = addEventListener.mock.calls[1][1] as (e: { |
| 70 | + matches: string |
| 71 | + }) => void |
| 72 | + listener({ matches: 'light' }) |
| 73 | + }) |
| 74 | + |
| 75 | + expect(await screen.findByText('#f7f7f7')).toBeInTheDocument() |
| 76 | +}) |
| 77 | + |
| 78 | +it('changing system/window when theme selected does not change the theme', () => { |
| 79 | + renderPlain( |
| 80 | + <ThemeProvider choice="light"> |
| 81 | + <UtilityUseThemeResolve /> |
| 82 | + </ThemeProvider> |
| 83 | + ) |
| 84 | + act(() => { |
| 85 | + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access |
| 86 | + const listener = addEventListener.mock.calls[0][1] as (e: { |
| 87 | + matches: string |
| 88 | + }) => void |
| 89 | + listener({ matches: 'dark' }) |
| 90 | + }) |
| 91 | + expect(screen.queryByText('#000000')).not.toBeInTheDocument() |
27 | 92 | })
|
28 | 93 |
|
29 | 94 | it('renders switch within light theme', () => {
|
|
0 commit comments