返回 oh-my-ppt
templates-page-rendering.test.ts
根目录 / tests / unit / templates / templates-page-rendering.test.ts
1 /**
2 * @vitest-environment happy-dom
3 */
4 import React, { act } from 'react'
5 import { afterEach, describe, expect, it, vi } from 'vitest'
6 import fs from 'node:fs'
7 import path from 'node:path'
8 import { createRoot } from 'react-dom/client'
9 import { MemoryRouter } from 'react-router-dom'
10 import { TemplatesPage } from '../../../src/renderer/src/pages/templates'
11
12 const state = vi.hoisted(() => ({
13 fetchTemplates: vi.fn(async () => undefined),
14 applyTemplateThumbnail: vi.fn(),
15 createEditableSessionFromTemplate: vi.fn(),
16 importPptxAsTemplate: vi.fn(),
17 updateTemplateMetadata: vi.fn(),
18 deleteTemplate: vi.fn(),
19 onTemplatePptxImportProgress: vi.fn(() => () => undefined)
20 }))
21
22 vi.mock('../../../src/renderer/src/store', () => ({
23 useTemplateStore: () => ({
24 templates: [
25 {
26 id: 'template-1',
27 name: 'Template One',
28 description: '',
29 source: 'user',
30 pageCount: 1,
31 tags: [],
32 previewHtmlPath: '/templates/template-1/page-1.html',
33 thumbnailPath: '/cache/template-1.png',
34 previewPages: [],
35 createdAt: 1,
36 updatedAt: 1
37 }
38 ],
39 loading: false,
40 fetchTemplates: state.fetchTemplates,
41 applyTemplateThumbnail: state.applyTemplateThumbnail,
42 createEditableSessionFromTemplate: state.createEditableSessionFromTemplate,
43 importPptxAsTemplate: state.importPptxAsTemplate,
44 updateTemplateMetadata: state.updateTemplateMetadata,
45 deleteTemplate: state.deleteTemplate
46 }),
47 useToastStore: () => ({
48 success: vi.fn(),
49 error: vi.fn(),
50 warning: vi.fn()
51 })
52 }))
53 vi.mock('@renderer/lib/ipc', () => ({
54 ipc: {
55 onTemplatePptxImportProgress: state.onTemplatePptxImportProgress
56 }
57 }))
58 vi.mock('@renderer/hooks/useThumbnailUpdates', () => ({ useThumbnailUpdates: vi.fn() }))
59 vi.mock('@renderer/hooks/useModelAction', () => ({
60 useModelAction: () => ({ ensureModelActive: vi.fn() })
61 }))
62 vi.mock('@renderer/i18n', () => ({ useT: () => (key: string) => key }))
63 vi.mock('../../../src/renderer/src/components/model/ModelActionButton', () => ({
64 ModelSplitButton: () => null
65 }))
66 vi.mock('../../../src/renderer/src/components/templates/TemplateCard', () => ({
67 TemplateCard: () => React.createElement('div', { 'data-testid': 'template-card' }),
68 TemplateEmptyState: () => null
69 }))
70 vi.mock('../../../src/renderer/src/components/templates/TemplateUseDialog', () => ({
71 TemplateUseDialog: () => null
72 }))
73 vi.mock('../../../src/renderer/src/components/templates/SaveTemplateDialog', () => ({
74 SaveTemplateDialog: () => null
75 }))
76
77 describe('TemplatesPage rendering', () => {
78 afterEach(() => {
79 vi.clearAllMocks()
80 document.body.innerHTML = ''
81 })
82
83 it('uses a three-column desktop grid for template cards', async () => {
84 const container = document.createElement('div')
85 document.body.appendChild(container)
86 const root = createRoot(container)
87 await act(async () => {
88 root.render(React.createElement(MemoryRouter, null, React.createElement(TemplatesPage)))
89 await Promise.resolve()
90 })
91
92 const card = container.querySelector('[data-testid="template-card"]')
93 expect(card?.parentElement?.className).toContain('lg:grid-cols-3')
94 await act(async () => root.unmount())
95 })
96
97 it('disables playback animations in template previews', () => {
98 const source = fs.readFileSync(
99 path.resolve(process.cwd(), 'src/renderer/src/pages/templates.tsx'),
100 'utf8'
101 )
102
103 expect(source).toContain('print=1&thumbnail=1&fit=off&pptPlayback=0')
104 })
105 })
106
106 lines TYPESCRIPT