42 lines
2.3 KiB
TypeScript
42 lines
2.3 KiB
TypeScript
// @vitest-environment jsdom
|
|
import { act } from 'react';
|
|
import { createRoot } from 'react-dom/client';
|
|
import { afterEach, expect, it, vi } from 'vitest';
|
|
import { useApp } from '../../src/app/AppProvider';
|
|
import { useFilteredRecords } from '../../src/features/search-filter/use-filtered-records';
|
|
import { DatasetViewer } from '../../src/features/dataset-viewer/DatasetViewer';
|
|
import { makeSheet } from '../../src/importers/sheet-factory';
|
|
|
|
vi.mock('../../src/app/AppProvider', () => ({ useApp: vi.fn() }));
|
|
vi.mock('../../src/features/search-filter/use-filtered-records', () => ({ useFilteredRecords: vi.fn() }));
|
|
afterEach(() => { vi.restoreAllMocks(); vi.unstubAllGlobals(); });
|
|
|
|
it('does not read offscreen finding fields in Matrix, but includes them in Raw Data', async () => {
|
|
vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true);
|
|
vi.stubGlobal('ResizeObserver', class { observe() {} disconnect() {} });
|
|
const sheet = makeSheet('Synthetic', [['Title', 'Severity', 'Status'],
|
|
...Array.from({ length: 500 }, (_, i) => [`Synthetic finding ${i}`, 'High', 'Failed'])], '', 'synthetic.csv');
|
|
const last = sheet.analysis.records.at(-1)!;
|
|
const fields = last.fields;
|
|
let offscreenReads = 0;
|
|
Object.defineProperty(last, 'fields', { get: () => { offscreenReads += 1; return fields; } });
|
|
const state = { dataset: { sheets: [sheet], rawText: '', profileId: 'generic' }, activeSheet: sheet,
|
|
view: 'columns', search: '', titleColumn: 'Title', selectedRecordId: '', reviews: {},
|
|
facetFilters: {}, statusFilter: 'deviation', actionOnly: false,
|
|
setView: vi.fn(), setSelectedRecord: vi.fn(), updateReview: vi.fn()
|
|
} as unknown as ReturnType<typeof useApp>;
|
|
vi.mocked(useApp).mockReturnValue(state);
|
|
vi.mocked(useFilteredRecords).mockReturnValue(sheet.analysis.records);
|
|
const container = document.createElement('div');
|
|
const root = createRoot(container);
|
|
try {
|
|
await act(async () => root.render(<DatasetViewer/>));
|
|
expect(container.querySelectorAll('.data-tile').length).toBeGreaterThan(0);
|
|
expect(offscreenReads).toBe(0);
|
|
state.view = 'raw';
|
|
await act(async () => root.render(<DatasetViewer/>));
|
|
expect(container.querySelector('.raw-view')?.textContent).toContain('Synthetic finding 499');
|
|
expect(offscreenReads).toBeGreaterThan(0);
|
|
} finally { await act(async () => root.unmount()); }
|
|
});
|