返回 oh-my-ppt
session-detail-editing-reset.test.ts
根目录 / tests / unit / editor / session-detail-editing-reset.test.ts
1 import { beforeEach, describe, expect, it, vi } from 'vitest'
2
3 vi.mock('sonner', () => {
4 const fn = (() => '') as unknown as {
5 success: () => string
6 error: () => string
7 info: () => string
8 warning: () => string
9 loading: () => string
10 promise: () => void
11 dismiss: () => void
12 }
13 fn.success = fn
14 fn.error = fn
15 fn.info = fn
16 fn.warning = fn
17 fn.loading = fn
18 fn.promise = () => {}
19 fn.dismiss = () => {}
20 return { toast: fn }
21 })
22
23 import { resetSessionDetailEditingStores } from '../../../src/renderer/src/store/sessionDetailEditingReset'
24 import { useEditHistoryStore } from '../../../src/renderer/src/store/editHistoryStore'
25 import { useEditSessionStore } from '../../../src/renderer/src/store/editSessionStore'
26 import { useSessionDetailUiStore } from '../../../src/renderer/src/store/sessionDetailStore'
27 import type { PreviewIframeHandle } from '../../../src/renderer/src/components/preview/PreviewIframe'
28
29 describe('session detail editing reset', () => {
30 beforeEach(() => {
31 useEditHistoryStore.getState().clear()
32 useEditSessionStore.getState().reset()
33 useSessionDetailUiStore.getState().resetForSessionChange()
34 })
35
36 it('clears editor stores after a history rollback replaces page files', () => {
37 const clearEditModeSelection = vi.fn()
38 useEditSessionStore.setState({
39 iframeHandle: {
40 clearEditModeSelection
41 } as unknown as PreviewIframeHandle,
42 selection: {
43 selector: 'body[data-page-id="page-1"] [data-block-id="b1"]'
44 } as never
45 })
46 useEditHistoryStore.getState().addElement({
47 pageId: 'page-1',
48 htmlPath: '/tmp/page.html',
49 parentSelector: 'body[data-page-id="page-1"] [data-ppt-guard-root="1"]',
50 htmlFragment: '<p data-block-id="added">Added</p>',
51 assignedBlockId: 'added',
52 insertIndex: -1
53 })
54 useSessionDetailUiStore.setState({
55 interactionMode: 'edit',
56 workspaceTab: 'edit',
57 editorSnapEnabled: false,
58 editorGridVisible: true,
59 editorGridSize: 48,
60 editorGuidesByPage: {
61 'page-1': { vertical: [320], horizontal: [180] }
62 },
63 selectedSelector: '[data-block-id="b1"]',
64 editSelectedSelector: '[data-block-id="b1"]',
65 selectorLabel: 'b1',
66 elementTag: 'p',
67 elementText: 'text',
68 pendingAssets: [{ id: 'asset-1' }] as never,
69 assetDragActive: true,
70 assetPickerOpen: true,
71 speechScriptDialogOpen: true
72 })
73
74 resetSessionDetailEditingStores()
75
76 expect(clearEditModeSelection).toHaveBeenCalledTimes(1)
77 expect(useEditHistoryStore.getState().hasPendingEdits('page-1')).toBe(false)
78 expect(useEditHistoryStore.getState().canUndo('page-1')).toBe(false)
79 expect(useEditSessionStore.getState().selection).toBeNull()
80 expect(useSessionDetailUiStore.getState()).toMatchObject({
81 interactionMode: 'preview',
82 workspaceTab: 'preview',
83 editorSnapEnabled: true,
84 editorGridVisible: false,
85 editorGridSize: 20,
86 editorGuidesByPage: {},
87 selectedSelector: null,
88 editSelectedSelector: null,
89 selectorLabel: '',
90 elementTag: '',
91 elementText: '',
92 pendingAssets: [],
93 assetDragActive: false,
94 assetPickerOpen: false,
95 speechScriptDialogOpen: false
96 })
97 })
98
99 it('keeps the active workspace tab when page-scoped selection state resets', () => {
100 useSessionDetailUiStore.setState({
101 interactionMode: 'edit',
102 workspaceTab: 'browse',
103 selectedSelector: '[data-block-id="b1"]',
104 editSelectedSelector: '[data-block-id="b1"]',
105 selectorLabel: 'b1',
106 elementTag: 'p',
107 elementText: 'text'
108 })
109
110 useSessionDetailUiStore.getState().resetForPageChange()
111
112 expect(useSessionDetailUiStore.getState()).toMatchObject({
113 interactionMode: 'preview',
114 workspaceTab: 'browse',
115 selectedSelector: null,
116 editSelectedSelector: null,
117 selectorLabel: '',
118 elementTag: '',
119 elementText: ''
120 })
121 })
122
123 it('keeps the animation workspace while clearing its page-scoped target', () => {
124 useSessionDetailUiStore.setState({
125 interactionMode: 'animation-select',
126 workspaceTab: 'animation',
127 selectedSelector: '[data-block-id="metric"]',
128 selectorLabel: 'metric'
129 })
130
131 useSessionDetailUiStore.getState().resetForPageChange()
132
133 expect(useSessionDetailUiStore.getState()).toMatchObject({
134 interactionMode: 'preview',
135 workspaceTab: 'animation',
136 selectedSelector: null,
137 selectorLabel: ''
138 })
139 })
140 })
141
141 lines TYPESCRIPT