46 lines
2.3 KiB
TypeScript
46 lines
2.3 KiB
TypeScript
// @vitest-environment jsdom
|
|
|
|
import { describe, expect, it, vi } from 'vitest';
|
|
import pingCastleXml from '../../fixtures/pingcastle/healthcheck.synthetic.xml?raw';
|
|
import { confirmEntryMappings, previewEntryFromDataset } from '../../src/features/import-workflow/import-workflow';
|
|
import { loadCanonicalProjectWorkspace } from '../../src/features/project-import/load-canonical-project-workspace';
|
|
import { createCanonicalImportBatch } from '../../src/importers/canonical-import';
|
|
import { importFile } from '../../src/importers/importer';
|
|
import { pingCastleProfile } from '../../src/profiles/pingcastle/pingcastle-profile';
|
|
import { importProfiles } from '../../src/profiles/profile-catalog';
|
|
|
|
describe('canonical project workspace loading', () => {
|
|
it('projects persisted PingCastle XML RiskRules instead of generic XML nodes', async () => {
|
|
const imported = await importFile(
|
|
new File([pingCastleXml], 'ad_hc_synthetic.example.xml', { type: 'application/xml' }),
|
|
{ profiles: importProfiles }
|
|
);
|
|
const preview = previewEntryFromDataset(imported, {
|
|
sha256: 'c'.repeat(64),
|
|
fileName: imported.fileName,
|
|
sizeBytes: pingCastleXml.length,
|
|
lastModified: 0
|
|
});
|
|
const entry = confirmEntryMappings(preview, importProfiles);
|
|
const model = createCanonicalImportBatch(
|
|
'pingcastle-workspace',
|
|
[entry],
|
|
'2026-07-22T12:00:00.000Z'
|
|
).model;
|
|
const reader = {
|
|
listProjectAssessments: vi.fn().mockResolvedValue([model.assessment]),
|
|
loadAssessmentModel: vi.fn().mockResolvedValue(model)
|
|
};
|
|
|
|
const workspace = await loadCanonicalProjectWorkspace(reader, model.project.id);
|
|
|
|
expect(reader.listProjectAssessments).toHaveBeenCalledWith(model.project.id);
|
|
expect(reader.loadAssessmentModel).toHaveBeenCalledWith(model.assessment.id);
|
|
expect(workspace.dataset?.profileId).toBe('pingcastle');
|
|
expect(workspace.dataset?.sheets[1].analysis.headers).toEqual(expect.arrayContaining(['Rule ID', 'Title', 'Status']));
|
|
expect(workspace.dataset?.sheets[1].analysis.headers).not.toContain('DomainSid');
|
|
expect(workspace.dataset?.sheets[1].analysis.records[0].title).toBe('Synthetic inactive privileged account');
|
|
expect(pingCastleProfile.defaults(workspace.dataset?.sheets[1]).titleColumn).toBe('Title');
|
|
});
|
|
});
|