72 lines
2.6 KiB
TypeScript
72 lines
2.6 KiB
TypeScript
// @vitest-environment jsdom
|
|
import { act } from 'react';
|
|
import { createRoot } from 'react-dom/client';
|
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
import { initialAppState, type SavedViewState } from '../../src/app/app-state';
|
|
|
|
const applyViewBookmark = vi.fn<(view: SavedViewState) => void>();
|
|
const app = {
|
|
...initialAppState,
|
|
dataset: { fileName: 'synthetic.csv' },
|
|
workScopeId: 'synthetic-project',
|
|
activeSheetId: 'sheet-a',
|
|
view: 'records' as const,
|
|
search: 'visible subset',
|
|
sortColumn: 'Severity',
|
|
sortDirection: 'asc' as const,
|
|
titleColumn: 'Title',
|
|
statusFilter: 'deviation',
|
|
facetFilters: { severity: { values: ['high'] } },
|
|
pathFindingIds: ['visible-a', 'visible-b'],
|
|
actionOnly: true,
|
|
selectedRecordId: 'visible-b',
|
|
applyViewBookmark
|
|
};
|
|
|
|
vi.mock('../../src/app/AppProvider', () => ({ useApp: () => app }));
|
|
|
|
import { ViewBookmarks } from '../../src/features/view-bookmarks/ViewBookmarks';
|
|
|
|
afterEach(() => {
|
|
applyViewBookmark.mockReset();
|
|
localStorage.clear();
|
|
});
|
|
|
|
describe('view snapshot interaction', () => {
|
|
it('saves and reopens the exact view that is currently displayed', async () => {
|
|
vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true);
|
|
const container = document.createElement('div');
|
|
const root = createRoot(container);
|
|
try {
|
|
await act(async () => root.render(<ViewBookmarks/>));
|
|
await act(async () => container.querySelector<HTMLButtonElement>('.view-bookmark-create')!.click());
|
|
const input = container.querySelector<HTMLInputElement>('#view-bookmark-name')!;
|
|
await act(async () => {
|
|
Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')!.set!.call(input, 'Current view');
|
|
input.dispatchEvent(new Event('input', { bubbles: true }));
|
|
});
|
|
await act(async () => container.querySelector<HTMLFormElement>('.view-bookmark-dialog')!
|
|
.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true })));
|
|
|
|
const reopen = [...container.querySelectorAll<HTMLButtonElement>('.view-bookmark-entry')]
|
|
.find(button => button.textContent === 'Current view');
|
|
expect(reopen).toBeDefined();
|
|
await act(async () => reopen!.click());
|
|
|
|
expect(applyViewBookmark).toHaveBeenCalledWith(expect.objectContaining({
|
|
activeSheetId: 'sheet-a',
|
|
view: 'records',
|
|
search: 'visible subset',
|
|
statusFilter: 'deviation',
|
|
facetFilters: { severity: { values: ['high'] } },
|
|
pathFindingIds: ['visible-a', 'visible-b'],
|
|
actionOnly: true,
|
|
selectedRecordId: 'visible-b'
|
|
}));
|
|
} finally {
|
|
await act(async () => root.unmount());
|
|
container.remove();
|
|
}
|
|
});
|
|
});
|