返回 oh-my-ppt
generation-preview-visibility.test.ts
根目录 / tests / unit / generation / generation-preview-visibility.test.ts
1 /**
2 * @vitest-environment happy-dom
3 */
4 import React, { act } from 'react'
5 import { createRoot } from 'react-dom/client'
6 import { afterEach, describe, expect, it, vi } from 'vitest'
7 import { GenerationPreviewGrid } from '../../../src/renderer/src/components/session-generating/GenerationPreviewGrid'
8 import { requireSlideSizePreset } from '../../../src/shared/slide-size'
9
10 vi.mock('../../../src/renderer/src/components/preview/PreviewIframe', () => ({
11 PreviewIframe: () => React.createElement('div', { 'data-testid': 'generation-preview' })
12 }))
13
14 describe('generation preview visibility', () => {
15 afterEach(() => {
16 document.body.innerHTML = ''
17 vi.restoreAllMocks()
18 })
19
20 it('does not mount preview webviews while the app is minimized or hidden', async () => {
21 let visibilityState: DocumentVisibilityState = 'hidden'
22 vi.spyOn(document, 'visibilityState', 'get').mockImplementation(() => visibilityState)
23 const container = document.createElement('div')
24 document.body.appendChild(container)
25 const root = createRoot(container)
26 const slideSize = requireSlideSizePreset('wide-16-9')
27 const pages = [
28 {
29 id: 'page-1',
30 pageNumber: 1,
31 pageId: 'page-1',
32 title: 'Page 1',
33 status: 'completed' as const,
34 htmlPath: '/tmp/page-1.html'
35 }
36 ]
37
38 await act(async () => {
39 root.render(React.createElement(GenerationPreviewGrid, { pages, slideSize }))
40 })
41 expect(container.querySelector('[data-testid="generation-preview"]')).toBeNull()
42
43 visibilityState = 'visible'
44 await act(async () => {
45 document.dispatchEvent(new Event('visibilitychange'))
46 })
47 expect(container.querySelector('[data-testid="generation-preview"]')).not.toBeNull()
48
49 visibilityState = 'hidden'
50 await act(async () => {
51 document.dispatchEvent(new Event('visibilitychange'))
52 })
53 expect(container.querySelector('[data-testid="generation-preview"]')).toBeNull()
54
55 await act(async () => root.unmount())
56 })
57 })
58
58 lines TYPESCRIPT