48 lines
1.9 KiB
TypeScript
48 lines
1.9 KiB
TypeScript
/** @vitest-environment jsdom */
|
|
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { useTabs } from '../../apps/desktop/src/renderer/features/tabs/tab-store';
|
|
|
|
beforeEach(() => { localStorage.clear(); useTabs.setState({ tabs: [], activeId: null }); });
|
|
|
|
describe('M8 多标签与会话恢复 (FR-T)', () => {
|
|
it('openTab 新建标签,重复路径激活已有', () => {
|
|
useTabs.getState().openTab('a.md');
|
|
useTabs.getState().openTab('b.md');
|
|
expect(useTabs.getState().tabs.length).toBe(2);
|
|
const aId = useTabs.getState().tabs[0].id;
|
|
useTabs.getState().openTab('a.md');
|
|
expect(useTabs.getState().tabs.length).toBe(2); // 不重复
|
|
expect(useTabs.getState().activeId).toBe(aId);
|
|
});
|
|
|
|
it('togglePin 固定标签排前', () => {
|
|
useTabs.getState().openTab('a.md');
|
|
useTabs.getState().openTab('b.md');
|
|
useTabs.getState().togglePin(useTabs.getState().tabs[1].id); // 固定 b
|
|
expect(useTabs.getState().tabs[0].path).toBe('b.md');
|
|
expect(useTabs.getState().tabs[0].pinned).toBe(true);
|
|
});
|
|
|
|
it('closeTab 切到相邻', () => {
|
|
useTabs.getState().openTab('a.md');
|
|
useTabs.getState().openTab('b.md');
|
|
useTabs.getState().openTab('c.md');
|
|
const bId = useTabs.getState().tabs[1].id;
|
|
useTabs.getState().setActive(bId);
|
|
useTabs.getState().closeTab(bId);
|
|
expect(useTabs.getState().tabs.length).toBe(2);
|
|
expect(useTabs.getState().activeId).not.toBe(bId);
|
|
});
|
|
|
|
it('会话恢复:persist 后 restore 恢复标签列表与激活页', () => {
|
|
useTabs.getState().openTab('x.md');
|
|
useTabs.getState().openTab('y.md');
|
|
useTabs.getState().persist();
|
|
// 模拟重启:清空后 restore
|
|
useTabs.setState({ tabs: [], activeId: null });
|
|
useTabs.getState().restore();
|
|
expect(useTabs.getState().tabs.length).toBe(2);
|
|
expect(useTabs.getState().tabs.some(t => t.path === 'x.md')).toBe(true);
|
|
});
|
|
});
|