import { describe, expect, it, vi } from 'vitest'; vi.mock('@tauri-apps/api/core', () => ({ invoke: vi.fn() })); import { invoke } from '@tauri-apps/api/core'; import { createTauriUiDesignStateStore, uiDesignStateStore, } from '../src/features/ui-editor/uiDesignStateStore'; describe('UI 设计 State mock store', () => { it('按资源保留快照并拒绝过期 revision', async () => { const first = await uiDesignStateStore.load('ui-1'); first.state.ui_trees.push({} as never); await expect( uiDesignStateStore.save('ui-1', first.revision, first.state), ).resolves.toMatchObject({ status: 'saved', revision: 1, }); await expect(uiDesignStateStore.load('ui-1')).resolves.toMatchObject({ revision: 1, state: { ui_trees: [{}] }, }); await expect( uiDesignStateStore.save('ui-1', first.revision, first.state), ).resolves.toMatchObject({ status: 'conflict', current: { revision: 1 } }); }); it('通过专用 Tauri 命令提交项目身份和资源 CAS revision', async () => { const store = createTauriUiDesignStateStore('/tmp/project', 'project-1'); const state = { ui_trees: [], ui_design_images: {}, sprite_assets: {}, font_assets: {}, }; vi.mocked(invoke).mockResolvedValueOnce({ revision: 3, state }); await expect(store.load('asset-1')).resolves.toEqual({ revision: 3, state, }); expect(invoke).toHaveBeenLastCalledWith('load_ui_design_state', { input: { projectPath: '/tmp/project', expectedProjectId: 'project-1', assetId: 'asset-1', }, }); vi.mocked(invoke).mockResolvedValueOnce({ status: 'saved', state, revision: 4, committedProjectRevision: 18, }); await expect(store.save('asset-1', 3, state)).resolves.toMatchObject({ status: 'saved', revision: 4, }); expect(invoke).toHaveBeenLastCalledWith('save_ui_design_state', { input: { projectPath: '/tmp/project', expectedProjectId: 'project-1', assetId: 'asset-1', expectedRevision: 3, state, }, }); }); });