Assessor_2.0/tests/features/mitre-matrix-library.test.tsx

45 lines
2.6 KiB
TypeScript

// @vitest-environment jsdom
import { act } from 'react';
import { createRoot } from 'react-dom/client';
import { afterEach, expect, it, vi } from 'vitest';
import { MitreMatrixLibrary } from '../../src/features/project-import/MitreMatrixLibrary';
afterEach(() => vi.unstubAllGlobals());
it('offers automatic MITRE update, original download, and manual JSON fallback', async () => {
vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true);
const onRefresh = vi.fn();
const onDownload = vi.fn();
const onUpload = vi.fn();
const onReset = vi.fn();
const container = document.createElement('div');
document.body.append(container);
const root = createRoot(container);
try {
await act(async () => root.render(<MitreMatrixLibrary status={null} activeVersion="19.2" busy={null} feedback={null} error={null} onRefresh={onRefresh} onDownload={onDownload} onUpload={onUpload} onReset={onReset} />));
expect(container.textContent).toContain('v19.2 Active');
await act(async () => [...container.querySelectorAll('button')].find(button => button.textContent === 'Update from MITRE')!.click());
await act(async () => [...container.querySelectorAll('button')].find(button => button.textContent === 'Download from MITRE')!.click());
expect(onRefresh).toHaveBeenCalledOnce();
expect(onDownload).toHaveBeenCalledOnce();
expect(container.textContent).toContain('Import JSON file');
const input = container.querySelector<HTMLInputElement>('input[type="file"]')!;
const uploadButton = container.querySelector<HTMLElement>('.datahub-mitre-upload-btn')!;
expect(uploadButton.getAttribute('tabindex')).toBe('0');
const fileClick = vi.spyOn(input, 'click');
await act(async () => uploadButton.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })));
expect(fileClick).toHaveBeenCalledOnce();
await act(async () => input.dispatchEvent(new Event('change', { bubbles: true })));
expect(onUpload).toHaveBeenCalledOnce();
expect(container.textContent).not.toContain('Use active catalog');
await act(async () => root.render(<MitreMatrixLibrary status={{ version: '19.1', tacticOrder: [], techniques: [], entities: [] }} activeVersion="19.1" busy={null} feedback={null} error={null} onRefresh={onRefresh} onDownload={onDownload} onUpload={onUpload} onReset={onReset} />));
expect(container.textContent).toContain('Custom v19.1');
await act(async () => [...container.querySelectorAll('button')].find(button => button.textContent === 'Use active catalog')!.click());
expect(onReset).toHaveBeenCalledOnce();
} finally {
await act(async () => root.unmount());
container.remove();
}
});