import { describe, expect, it, vi } from 'vitest'; import { platform } from '@/lib/platform'; /** Ставит в window фальшивый мост Tauri v2 и возвращает список вызовов. */ function stubTauri(): Array<{ command: string; args: unknown }> { const calls: Array<{ command: string; args: unknown }> = []; vi.stubGlobal('__TAURI_INTERNALS__', { invoke: (command: string, args?: unknown) => { calls.push({ command, args }); return Promise.resolve(undefined); }, }); return calls; } /** * Несохранённые изменения (docs/client-tauri.md §5): платформа должна знать о * них, чтобы обёртка перехватила закрытие окна, а браузер — показал своё * подтверждение. Здесь проверяются сами вызовы платформы; поведение клиента — * в `unsavedChanges.test.tsx`. */ describe('setDirty в браузере', () => { it('включает и снимает штатное подтверждение закрытия вкладки', () => { const added: unknown[] = []; const removed: unknown[] = []; vi.spyOn(window, 'addEventListener').mockImplementation((type, handler) => { if (type === 'beforeunload') { added.push(handler); } }); vi.spyOn(window, 'removeEventListener').mockImplementation((type, handler) => { if (type === 'beforeunload') { removed.push(handler); } }); platform.setDirty(true); // Повторный вызов не вешает второй обработчик: подтверждение одно на окно. platform.setDirty(true); expect(added).toHaveLength(1); const event = new Event('beforeunload', { cancelable: true }); (added[0] as (event: Event) => void)(event); expect(event.defaultPrevented).toBe(true); platform.setDirty(false); expect(removed).toEqual(added); }); }); describe('команды обёртке', () => { it('передаёт dirty и закрывает окно', async () => { const calls = stubTauri(); vi.resetModules(); const desktop = await import('@/lib/platform'); expect(desktop.platform.kind).toBe('tauri'); desktop.platform.setDirty(true); desktop.platform.setDirty(false); desktop.platform.closeWindow(); expect(calls).toEqual([ { command: 'desktop_set_dirty', args: { dirty: true } }, { command: 'desktop_set_dirty', args: { dirty: false } }, { command: 'desktop_close_window', args: undefined }, ]); }); });