// @vitest-environment jsdom import { describe, expect, it } from 'vitest'; import * as XLSX from 'xlsx'; import literalFixture from '../../fixtures/maester/object-literal.synthetic.html?raw'; import { importFile } from '../../src/importers/importer'; import { importSource } from '../../src/importers/engine'; import { importProfiles } from '../../src/profiles/profile-catalog'; import { nodeImportRuntimeAdapters } from '../../server/node-import-runtime-adapters'; import { previewEntryFromDataset, confirmEntryMappings } from '../../src/features/import-workflow/import-workflow'; import { createCanonicalImportBatch } from '../../src/importers/canonical-import'; import { assertCanonicalAssessmentModel } from '../../src/domain/canonical-validation'; import { canonicalModelToDataset } from '../../src/features/project-import/canonical-model-to-dataset'; import { resultMessageFor, resultStatusFieldFor } from '../../src/features/linked-results/result-message'; import { processingReadiness } from '../../src/domain/processing-compatibility'; import { mapFindingCandidates } from '../../src/importers/candidate-mapping'; import { maesterProfile } from '../../src/profiles/maester/maester-profile'; import type { SourceExtractionResult } from '../../src/domain/source-extraction'; const htmlImport = (html: string) => importFile(new File([html], 'ReportTemplate.html', { type: 'text/html' }), { profiles: importProfiles }); function canonical(dataset: Awaited>) { const entry = previewEntryFromDataset(dataset, { sha256: 'a'.repeat(64), fileName: dataset.fileName, sizeBytes: 1000, lastModified: 0 }); const model = createCanonicalImportBatch('maester-coverage', [confirmEntryMappings(entry, importProfiles)], '2026-09-09T08:00:00Z').model; assertCanonicalAssessmentModel(model); return model; } describe('Maester variant and context coverage', () => { it('imports all literal tests through the browser and server without running the report', async () => { delete (globalThis as Record).__maesterActiveContentExecuted; const bytes = new TextEncoder().encode(literalFixture); const results = [await htmlImport(literalFixture), await importSource({ metadata: { name: 'ReportTemplate.html', mediaType: 'text/html', lastModified: 0, sizeBytes: bytes.length }, bytes }, { profiles: importProfiles }, nodeImportRuntimeAdapters)]; for (const imported of results) { expect(imported.profileId).toBe('maester'); expect(imported.recognition?.source.requiresConfirmation).toBe(false); expect(imported.extraction?.candidates).toHaveLength(6); expect(imported.extraction?.processing.status).toBe('partial'); expect(imported.extraction?.diagnostics.filter(item => item.code === 'maester-count-mismatch').map(item => item.details)).toEqual([ { objectPath: '$.TotalCount', counter: 'TotalCount', declared: 5, actual: 6 }, { objectPath: '$.FailedCount', counter: 'FailedCount', declared: 0, actual: 1 } ]); const model = canonical(imported); expect(model.findingOccurrences.map(item => item.status.normalizedValue)).toEqual(['failed', 'investigate', 'passed', 'not-run', 'not-run', 'error']); expect(model.findingOccurrences.map(item => item.status.originalValue)).toEqual(['Failed', 'Investigate', 'Passed', 'Skipped', 'NotRun', 'Error']); expect(model.findingOccurrences[0].originalFields).toContainEqual(expect.objectContaining({ label: 'FutureField', value: 0, path: '$.Tests[0].FutureField' })); expect(model.findingOccurrences[0].originalFields).toContainEqual(expect.objectContaining({ label: 'ResultDetail.FutureDetail', value: { retained: true }, path: '$.Tests[0].ResultDetail.FutureDetail' })); expect(model.evidence.filter(item => item.sourceFieldKeys.includes('TestResult'))).toHaveLength(3); expect(model.environmentObservations).toContainEqual(expect.objectContaining({ property: 'entra.tenant_id', normalizedValue: 'synthetic-tenant-id', source: expect.objectContaining({ objectPath: '$.TenantId' }) })); expect(model.environmentObservations).toContainEqual(expect.objectContaining({ property: 'maester.source.SystemInfo', originalValue: { OS: 'Synthetic OS', Available: true, Count: 0, Nullable: null } })); expect(model.environmentObservations).toContainEqual(expect.objectContaining({ property: 'maester.tests.declared_total', originalValue: 5 })); expect(model.environmentObservations).toContainEqual(expect.objectContaining({ property: 'maester.tests.actual_total', normalizedValue: 6, attributes: expect.objectContaining({ derived: true }) })); expect(model.environmentObservations).toContainEqual(expect.objectContaining({ property: 'maester.source.LoadedModules', originalValue: [], state: 'empty' })); const projection = canonicalModelToDataset(model)!; const failed = projection.sheets.flatMap(sheet => sheet.analysis.records).find(record => record.fields.some(field => field.label === 'ID' && field.value === 'MT.9901'))!; expect(resultMessageFor(failed, 'maester')).toBe('

Synthetic evidence

'); expect(resultStatusFieldFor(failed, 'maester')?.value).toBe('Failed'); } expect((globalThis as Record).__maesterActiveContentExecuted).toBeUndefined(); }); it('recognizes a validated report beyond the raw-text detection sample', async () => { const source = literalFixture.replace('`)).rejects.toThrow(/Maester/); }); it('keeps multi-tenant findings and report metadata source-scoped', async () => { const payload = { WrapperVersion: 'synthetic', Tenants: [ { TenantId: 'tenant-a', Result: 'Failed', Tests: [{ Id: 'MT.1', Title: 'Synthetic one', Result: 'Failed' }] }, { TenantId: 'tenant-b', Result: 'Passed', Tests: [{ Id: 'MT.1', Title: 'Synthetic two', Result: 'Passed' }] } ] }; const imported = await htmlImport(``); const model = canonical(imported); expect(model.findingOccurrences).toHaveLength(2); expect(model.environmentObservations?.filter(item => item.property === 'entra.tenant_id').map(item => item.subject.identity)).toEqual(['tenant-a', 'tenant-b']); expect(model.environmentObservations).toContainEqual(expect.objectContaining({ property: 'maester.source.WrapperVersion', originalValue: 'synthetic' })); expect(model.findingOccurrences.map(item => item.sourcePosition?.objectPath)).toEqual(['$.Tenants[0].Tests[0]', '$.Tenants[1].Tests[0]']); }); it('marks earlier imports for reimport without breaking their comparison key', () => { expect(processingReadiness('maester', { profileVersion: '1.0.0' } as never)).toBe('reimport-recommended'); expect(processingReadiness('maester', { profileVersion: '1.1.0' } as never)).toBe('current'); }); it('keeps conditional decisions separate for different native candidate shapes', () => { const native = (id: string, entries: string[][]) => ({ version: 1 as const, id, source: { fileName: 'synthetic' }, fields: entries.map(([label, value]) => ({ key: label, label, originalValue: value, decodedValue: value, source: { fileName: 'synthetic', objectPath: `${id}.${label}` } })) }); const extraction = { candidates: [native('a', [['Result', 'Failed']]), native('b', [['Result', 'Synthetic text'], ['Status', 'Passed']])], extractor: { kind: 'source-extractor', id: 'synthetic', version: '1.0.0' } } as SourceExtractionResult; const mapped = mapFindingCandidates(extraction, maesterProfile); expect(mapped.candidates[0].fields[0].role).toBe('status'); expect(mapped.candidates[1].fields[0].role).toBe('evidence'); expect(mapped.candidates[0].fields[0].mappingDecisionId).not.toBe(mapped.candidates[1].fields[0].mappingDecisionId); }); });