Skip to content

Commit 3d1ee9d

Browse files
authored
test(query-devtools/utils): add tests for 'getPreferredColorScheme' (#10654)
1 parent 9d1ce70 commit 3d1ee9d

1 file changed

Lines changed: 115 additions & 1 deletion

File tree

packages/query-devtools/src/__tests__/utils.test.ts

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
1+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
22
import { QueryClient, QueryObserver } from '@tanstack/query-core'
3+
import { createRoot } from 'solid-js'
34
import {
45
convertRemToPixels,
56
deleteNestedDataByPath,
67
displayValue,
78
getMutationStatusColor,
9+
getPreferredColorScheme,
810
getQueryStatusColorByLabel,
911
getSidedProp,
1012
mutationSortFns,
@@ -1178,4 +1180,116 @@ describe('Utils tests', () => {
11781180
})
11791181
})
11801182
})
1183+
1184+
describe('getPreferredColorScheme', () => {
1185+
type MatchMediaListener = (event: MediaQueryListEvent) => void
1186+
1187+
function setupMatchMediaMock(initialMatches: boolean) {
1188+
const listeners = new Set<MatchMediaListener>()
1189+
const matchMedia: typeof window.matchMedia = vi.fn(
1190+
(query: string): MediaQueryList => ({
1191+
matches: initialMatches,
1192+
media: query,
1193+
onchange: null,
1194+
addEventListener: vi.fn(
1195+
(_event: string, listener: MatchMediaListener) => {
1196+
listeners.add(listener)
1197+
},
1198+
) as MediaQueryList['addEventListener'],
1199+
removeEventListener: vi.fn(
1200+
(_event: string, listener: MatchMediaListener) => {
1201+
listeners.delete(listener)
1202+
},
1203+
) as MediaQueryList['removeEventListener'],
1204+
dispatchEvent: vi.fn(() => true),
1205+
addListener: vi.fn(),
1206+
removeListener: vi.fn(),
1207+
}),
1208+
)
1209+
vi.stubGlobal('matchMedia', matchMedia)
1210+
return {
1211+
matchMedia,
1212+
emit(matches: boolean) {
1213+
listeners.forEach((listener) =>
1214+
listener({ matches } as MediaQueryListEvent),
1215+
)
1216+
},
1217+
listenerCount: () => listeners.size,
1218+
}
1219+
}
1220+
1221+
beforeEach(() => {
1222+
vi.useFakeTimers()
1223+
})
1224+
1225+
afterEach(() => {
1226+
vi.unstubAllGlobals()
1227+
vi.useRealTimers()
1228+
})
1229+
1230+
it('should return "dark" before "onMount" runs', () => {
1231+
setupMatchMediaMock(false)
1232+
1233+
createRoot((dispose) => {
1234+
const colorScheme = getPreferredColorScheme()
1235+
expect(colorScheme()).toBe('dark')
1236+
dispose()
1237+
})
1238+
})
1239+
1240+
it('should reflect "matchMedia.matches" after "onMount" runs', async () => {
1241+
const { matchMedia, listenerCount } = setupMatchMediaMock(true)
1242+
1243+
await createRoot(async (dispose) => {
1244+
const colorScheme = getPreferredColorScheme()
1245+
await vi.advanceTimersByTimeAsync(0)
1246+
expect(matchMedia).toHaveBeenCalledWith('(prefers-color-scheme: dark)')
1247+
expect(listenerCount()).toBe(1)
1248+
expect(colorScheme()).toBe('dark')
1249+
dispose()
1250+
})
1251+
})
1252+
1253+
it('should reflect "light" when "matchMedia.matches" is false after "onMount" runs', async () => {
1254+
setupMatchMediaMock(false)
1255+
1256+
await createRoot(async (dispose) => {
1257+
const colorScheme = getPreferredColorScheme()
1258+
await vi.advanceTimersByTimeAsync(0)
1259+
expect(colorScheme()).toBe('light')
1260+
dispose()
1261+
})
1262+
})
1263+
1264+
it('should update the signal when the "change" event fires', async () => {
1265+
const { emit } = setupMatchMediaMock(false)
1266+
1267+
await createRoot(async (dispose) => {
1268+
const colorScheme = getPreferredColorScheme()
1269+
await vi.advanceTimersByTimeAsync(0)
1270+
expect(colorScheme()).toBe('light')
1271+
1272+
emit(true)
1273+
expect(colorScheme()).toBe('dark')
1274+
1275+
emit(false)
1276+
expect(colorScheme()).toBe('light')
1277+
1278+
dispose()
1279+
})
1280+
})
1281+
1282+
it('should remove the "change" listener on cleanup', async () => {
1283+
const { listenerCount } = setupMatchMediaMock(false)
1284+
1285+
await createRoot(async (dispose) => {
1286+
getPreferredColorScheme()
1287+
await vi.advanceTimersByTimeAsync(0)
1288+
expect(listenerCount()).toBe(1)
1289+
1290+
dispose()
1291+
expect(listenerCount()).toBe(0)
1292+
})
1293+
})
1294+
})
11811295
})

0 commit comments

Comments
 (0)