Files
bDS/tests/renderer/utils/tabPersistence.test.ts
2026-02-21 14:26:06 +01:00

70 lines
1.9 KiB
TypeScript

import { describe, it, expect, beforeEach, vi } from 'vitest';
import type { TabState } from '../../../src/renderer/store';
import { loadTabsForProject, saveTabsForProject } from '../../../src/renderer/utils/tabPersistence';
const projectId = 'project-1';
const sampleTabState: TabState = {
tabs: [
{
id: 'post-1',
type: 'post',
title: 'Hello World',
dirty: false,
},
],
activeTabId: 'post-1',
};
describe('tabPersistence', () => {
beforeEach(() => {
localStorage.clear();
vi.restoreAllMocks();
});
it('saves and loads tab state for a project', () => {
saveTabsForProject(projectId, sampleTabState);
const loaded = loadTabsForProject(projectId);
expect(loaded).toEqual(sampleTabState);
});
it('returns null when no tab state is stored', () => {
expect(loadTabsForProject(projectId)).toBeNull();
});
it('returns null when stored tab state is invalid JSON', () => {
localStorage.setItem('bds-tabs-project-1', '{invalid-json');
expect(loadTabsForProject(projectId)).toBeNull();
});
it('does not throw when localStorage.setItem fails', () => {
vi.spyOn(Storage.prototype, 'setItem').mockImplementation(() => {
throw new Error('quota exceeded');
});
expect(() => saveTabsForProject(projectId, sampleTabState)).not.toThrow();
});
it('does not persist transient tabs', () => {
const tabStateWithTransient = {
tabs: [
{ id: 'documentation', type: 'documentation', isTransient: false },
{ id: 'site-validation-report', type: 'site-validation', isTransient: true },
],
activeTabId: 'site-validation-report',
} as unknown as TabState;
saveTabsForProject(projectId, tabStateWithTransient);
const loaded = loadTabsForProject(projectId);
expect(loaded?.tabs).toEqual([
{ id: 'documentation', type: 'documentation', isTransient: false },
]);
expect(loaded?.activeTabId).toBe('documentation');
});
});