返回 oh-my-ppt
animation-tool-row.test.ts
根目录 / tests / unit / session / animation-tool-row.test.ts
1 /**
2 * @vitest-environment happy-dom
3 */
4 import React, { act } from 'react'
5 import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
6 import { createRoot, type Root } from 'react-dom/client'
7 import { AnimationToolRow } from '../../../src/renderer/src/components/session-detail/workspace/toolbar/tool-rows/AnimationToolRow'
8 import { useSessionDetailRuntimeStore } from '../../../src/renderer/src/store/sessionDetailRuntimeStore'
9
10 (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT =
11 true
12
13 const translate = vi.hoisted(() => vi.fn((key: string) => key))
14 const refreshCurrentPreview = vi.hoisted(() => vi.fn())
15
16 vi.mock('@renderer/i18n', () => ({
17 useT: () => translate
18 }))
19 vi.mock(
20 '../../../src/renderer/src/components/session-detail/workspace/toolbar/tool-rows/ElementAnimationPicker',
21 () => ({
22 ElementAnimationPicker: () => React.createElement('div', { 'data-testid': 'element-animation' })
23 })
24 )
25 vi.mock(
26 '../../../src/renderer/src/components/session-detail/workspace/toolbar/tool-rows/IndexTransitionPicker',
27 () => ({
28 IndexTransitionPicker: () => React.createElement('div', { 'data-testid': 'index-transition' })
29 })
30 )
31
32 async function renderRow(): Promise<{ root: Root; container: HTMLDivElement }> {
33 const container = document.createElement('div')
34 document.body.appendChild(container)
35 const root = createRoot(container)
36 await act(async () => {
37 root.render(React.createElement(AnimationToolRow, { disabled: false }))
38 await Promise.resolve()
39 })
40 return { root, container }
41 }
42
43 describe('AnimationToolRow', () => {
44 beforeEach(() => {
45 refreshCurrentPreview.mockReset()
46 useSessionDetailRuntimeStore
47 .getState()
48 .setRefreshCurrentPreviewHandler(refreshCurrentPreview)
49 })
50
51 afterEach(() => {
52 document.body.innerHTML = ''
53 })
54
55 it('only refreshes the preview when clicking preview page', async () => {
56 const { root, container } = await renderRow()
57 try {
58 const previewButton = Array.from(container.querySelectorAll('button')).find((btn) =>
59 btn.textContent?.includes('sessionDetail.elementAnimationPreview')
60 ) as HTMLButtonElement | undefined
61 expect(previewButton).toBeTruthy()
62
63 await act(async () => {
64 previewButton!.click()
65 await Promise.resolve()
66 })
67
68 expect(refreshCurrentPreview).toHaveBeenCalledTimes(1)
69 } finally {
70 await act(async () => root.unmount())
71 container.remove()
72 }
73 })
74 })
75
75 lines TYPESCRIPT