import { afterEach, expect, it, vi } from 'vitest'; import { confirmModal } from '../src/ui-kit'; afterEach(() => document.body.replaceChildren()); it('确认清单逐条呈现文件名,文件名保持纯文本', async () => { const names = ['作品一.mp4', '.mp4']; const pending = confirmModal({title:'清理记录',body:'清理 2 项',items:names,confirmLabel:'清理记录'}); const list = document.querySelector('dialog ul')!; expect([...list.children].map(item => item.textContent)).toEqual(names); expect(list.querySelector('img')).toBeNull(); expect(list.getAttribute('tabindex')).toBe('0'); document.querySelector('[data-modal-cancel]')!.click(); expect((await pending).confirmed).toBe(false); }); it('危险操作聚焦取消,取消不写入,关闭归还焦点', async () => { const trigger = document.createElement('button'); document.body.append(trigger); trigger.focus(); const write = vi.fn(); const pending = confirmModal({title:'清理记录',body:'清理 2 项',confirmLabel:'清理记录',danger:true,onConfirm:write}); const cancel = document.querySelector('[data-modal-cancel]')!; expect(document.activeElement).toBe(cancel); const dialog = document.querySelector('dialog')!; expect(dialog.getAttribute('role')).toBe('alertdialog'); expect(document.getElementById(dialog.getAttribute('aria-describedby')!)?.textContent).toBe('清理 2 项'); cancel.click(); expect((await pending).confirmed).toBe(false); expect(write).not.toHaveBeenCalled(); expect(document.activeElement).toBe(trigger); }); it('等待写入时阻止重复提交和关闭,失败保留弹层可重试', async () => { let reject!: (error: Error) => void; const write = vi.fn().mockImplementationOnce(() => new Promise((_, fail) => { reject = fail; })).mockResolvedValueOnce('done'); const pending = confirmModal({title:'清理记录',body:'清理 2 项',confirmLabel:'清理记录',onConfirm:write}); const dialog = document.querySelector('dialog')!; const accept = dialog.querySelector('[data-modal-confirm]')!; accept.click(); accept.click(); dialog.querySelector('[data-modal-cancel]')!.click(); const escape = new Event('cancel', {cancelable: true}); dialog.dispatchEvent(escape); expect(escape.defaultPrevented).toBe(true); expect(dialog.open).toBe(true); expect(write).toHaveBeenCalledTimes(1); reject(new Error('磁盘离线')); await new Promise(resolve => setTimeout(resolve, 0)); expect(dialog.textContent).toContain('磁盘离线'); expect(dialog.open).toBe(true); accept.click(); expect((await pending).result).toBe('done'); expect(write).toHaveBeenCalledTimes(2); });