Files
ITWorx-Pulse-Public/apps/web/tests/unit/operatorWorkspace.test.ts
T
2026-09-30 01:14:48 +00:00

62 lines
2.4 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vitest';
import {
isFavorite,
readWorkspaceState,
recordRecent,
removeSavedView,
saveCurrentView,
toggleFavorite,
WORKSPACE_EVENT,
} from '../../src/operatorWorkspace';
afterEach(() => {
window.localStorage.clear();
vi.restoreAllMocks();
});
describe('operator workspace preferences', () => {
it('toggles favorites without duplicating the same path', () => {
expect(toggleFavorite('Cache pool', '/pools/cache?range=24h')).toBe(true);
expect(isFavorite('/pools/cache?range=24h')).toBe(true);
expect(readWorkspaceState().favorites).toHaveLength(1);
expect(toggleFavorite('Cache pool', '/pools/cache?range=24h')).toBe(false);
expect(isFavorite('/pools/cache?range=24h')).toBe(false);
expect(readWorkspaceState().favorites).toHaveLength(0);
});
it('persists a saved view and removes it by exact route context', () => {
saveCurrentView('Degraded services', '/services?state=degraded&range=24h');
expect(readWorkspaceState().views).toEqual([
expect.objectContaining({ label: 'Degraded services', path: '/services?state=degraded&range=24h', kind: 'view' }),
]);
removeSavedView('/services?state=degraded&range=24h');
expect(readWorkspaceState().views).toHaveLength(0);
});
it('keeps recent routes bounded, unique and excludes the 404 surface', () => {
recordRecent('Missing', '/404');
for (let index = 0; index < 15; index += 1) recordRecent('Item ' + index, '/inventory/' + index);
recordRecent('Item 14 updated', '/inventory/14');
const recent = readWorkspaceState().recent;
expect(recent).toHaveLength(12);
expect(recent[0]).toMatchObject({ label: 'Item 14 updated', path: '/inventory/14', kind: 'recent' });
expect(recent.filter((item) => item.path === '/inventory/14')).toHaveLength(1);
expect(recent.some((item) => item.path === '/404')).toBe(false);
});
it('fails closed on malformed storage and emits a workspace change event on writes', () => {
window.localStorage.setItem('pulse.operator.workspace.v1', '{bad json');
expect(readWorkspaceState()).toEqual({ favorites: [], views: [], recent: [] });
const listener = vi.fn();
window.addEventListener(WORKSPACE_EVENT, listener);
saveCurrentView('Overview', '/');
window.removeEventListener(WORKSPACE_EVENT, listener);
expect(listener).toHaveBeenCalledTimes(1);
});
});