// @vitest-environment jsdom
import { act, type ReactNode } from 'react';
import { createRoot } from 'react-dom/client';
import { afterEach, expect, it, vi } from 'vitest';
import { AssessorApiClient } from '../../src/api/assessor-api-client';
import { useOptionalApp } from '../../src/app/AppProvider';
import type { RegulatoryMappingResponse } from '../../src/compliance/regulatory-mapping';
import { useRegulatoryMapping } from '../../src/compliance/ui/use-regulatory-mapping';
vi.mock('../../src/app/AppProvider', () => ({ useOptionalApp: vi.fn() }));
afterEach(() => {
vi.restoreAllMocks();
vi.unstubAllGlobals();
});
const response: RegulatoryMappingResponse = {
version: 1, projectId: 'dummy-project', resultProjectionId: 'scanner-finding:dummy', generationEnabled: true, state: 'empty', decisions: []
};
function Probe(): ReactNode {
const controller = useRegulatoryMapping('dummy-project', 'scanner-finding:dummy', 'connected');
return ;
}
// The mapping history names where a single mapping came from, so `Map ISO controls` sends the shown timeslot.
it('sends the timeslot the Finding Reader shows with a single mapping', async () => {
vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true);
vi.mocked(useOptionalApp).mockReturnValue({ activeAssessmentIds: ['dummy-assessment'], activeScanRunIds: ['dummy-scan-run'] } as never);
vi.spyOn(AssessorApiClient.prototype, 'getRegulatoryMappings').mockResolvedValue(response);
const generate = vi.spyOn(AssessorApiClient.prototype, 'generateRegulatoryMappings').mockResolvedValue(response);
const container = document.createElement('div');
document.body.append(container);
const root = createRoot(container);
try {
await act(async () => root.render());
await act(async () => container.querySelector('button')!.click());
expect(generate).toHaveBeenCalledWith('dummy-project', {
resultProjectionId: 'scanner-finding:dummy', origin: { assessmentIds: ['dummy-assessment'], scanRunIds: ['dummy-scan-run'] }
});
} finally {
await act(async () => root.unmount());
container.remove();
}
});