Files
deepseek-harness/apps/desktop/tests/shell-theme.spec.ts
T

28 lines
1.7 KiB
TypeScript

import { readFileSync } from 'node:fs'
import { runInContext } from 'node:vm'
import { JSDOM } from 'jsdom'
import { expect, it, vi } from 'vitest'
it.each(['welcome', 'update-dialog', 'mandatory-update'].flatMap(document => [false, true].map(dark => ({ document, dark }))))(
'$document applies the initial app palette and follows changes (dark=$dark)', ({ document, dark }) => {
const dom = new JSDOM(readFileSync(new URL(`../renderer/${document}.html`, import.meta.url), 'utf8'), { runScripts: 'outside-only' })
const palette = Object.assign(new dom.window.EventTarget(), { matches: dark, media: '(prefers-color-scheme: dark)',
onchange: null, addListener: vi.fn(), removeListener: vi.fn() })
const remove = vi.spyOn(palette, 'removeEventListener')
dom.window.matchMedia = vi.fn(() => palette)
try {
expect(dom.window.document.querySelectorAll('script[src="shell-theme.js"]')).toHaveLength(1)
runInContext(readFileSync(new URL('../renderer/shell-theme.js', import.meta.url), 'utf8'), dom.getInternalVMContext())
expect(dom.window.matchMedia).toHaveBeenCalledWith('(prefers-color-scheme: dark)')
expect(dom.window.document.body.hasAttribute('data-ds-dark-theme')).toBe(dark)
palette.matches = !dark
palette.dispatchEvent(new dom.window.Event('change'))
expect(dom.window.document.body.hasAttribute('data-ds-dark-theme')).toBe(!dark)
dom.window.dispatchEvent(new dom.window.Event('pagehide'))
expect(remove).toHaveBeenCalledWith('change', expect.any(Function))
palette.matches = dark
palette.dispatchEvent(new dom.window.Event('change'))
expect(dom.window.document.body.hasAttribute('data-ds-dark-theme')).toBe(!dark)
} finally { dom.window.close() }
})