返回 oh-my-ppt
style-preview-store.test.ts
根目录 / tests / unit / styles / style-preview-store.test.ts
1 import { beforeEach, describe, expect, it, vi } from 'vitest'
2
3 const ipcState = vi.hoisted(() => ({
4 generateStylePreview: vi.fn()
5 }))
6
7 vi.mock('@renderer/lib/ipc', () => ({
8 ipc: ipcState
9 }))
10
11 describe('useStylePreviewStore', () => {
12 beforeEach(async () => {
13 vi.resetModules()
14 ipcState.generateStylePreview.mockReset()
15 })
16
17 it('keeps the running style across consumers and prevents duplicate generation', async () => {
18 let finishGeneration: (() => void) | undefined
19 ipcState.generateStylePreview.mockImplementation(
20 () =>
21 new Promise<void>((resolve) => {
22 finishGeneration = resolve
23 })
24 )
25 const { useStylePreviewStore } = await import(
26 '../../../src/renderer/src/store/stylePreviewStore'
27 )
28
29 const firstRun = useStylePreviewStore.getState().generatePreview('paper-story')
30 expect(useStylePreviewStore.getState().generatingStyleId).toBe('paper-story')
31 await expect(
32 useStylePreviewStore.getState().generatePreview('another-style')
33 ).resolves.toBe(false)
34 expect(ipcState.generateStylePreview).toHaveBeenCalledOnce()
35
36 finishGeneration?.()
37 await expect(firstRun).resolves.toBe(true)
38 expect(useStylePreviewStore.getState()).toMatchObject({
39 generatingStyleId: '',
40 completionVersion: 1
41 })
42 })
43
44 it('refreshes style data after a failed generation attempt', async () => {
45 ipcState.generateStylePreview.mockRejectedValue(new Error('thumbnail failed'))
46 const { useStylePreviewStore } = await import(
47 '../../../src/renderer/src/store/stylePreviewStore'
48 )
49
50 await expect(
51 useStylePreviewStore.getState().generatePreview('paper-story')
52 ).rejects.toThrow('thumbnail failed')
53
54 expect(useStylePreviewStore.getState()).toMatchObject({
55 generatingStyleId: '',
56 completionVersion: 1
57 })
58 })
59 })
60
60 lines TYPESCRIPT