Assessor_2.0/tests/reporting/management-overview-report....

73 lines
4.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { JSDOM } from 'jsdom';
import { buildManagementOverviewHtml } from '../../src/reporting/management-overview-report';
import type { ReportProjection } from '../../src/reporting/report-projection';
function projection(overrides: Partial<ReportProjection> = {}): ReportProjection {
return {
version: '1.1.0', generatedAt: '2026-09-29T10:00:00Z',
project: { id: 'synthetic', name: 'Synthetic GmbH' },
environment: [{ key: 'Domain', value: 'synthetic.example' }, { key: 'Domain Controller', value: '1' }],
overallScore: 37, scoreSources: [],
domains: [
{ domainId: 'identity', domainLabel: 'Identity & Account Hygiene', passed: 204, deviations: 221, assessed: 425, passRate: 204 / 425 },
{ domainId: 'gpo', domainLabel: 'GPO & Baseline', passed: 170, deviations: 223, assessed: 393, passRate: 170 / 393 },
{ domainId: 'cloud', domainLabel: 'Cloud & Applications', passed: 0, deviations: 0, assessed: 0 }
],
priorities: [], coverage: { total: 818, assessed: 818, deviations: 444, passed: 374, notRun: 0,
notApplicable: 0, executionErrors: 0, unknown: 0, perSource: [] },
inventory: { bySeverity: {} as never, byOutcome: {} as never, byDomain: {}, bySource: {} },
findings: [], policyEntries: [], workItems: [], sourcePriorities: [], convergence: [], bundles: [],
singleSourcePolicyActions: [], diagnostics: [], provenance: [],
gpo: { basis: { kind: 'equal-weight', reason: 'Synthetic' },
counts: { Fail: 100, Pass: 20, 'Not configured': 0, 'No baseline rule': 0,
'Not comparable': 0, 'Review required': 0 },
conflicts: 0, duplicates: 0, affectedSettings: 25, affectedBackups: 1, scopeLimited: true },
...overrides
} as ReportProjection;
}
describe('management export', () => {
it('renders a self-contained factual heatmap and pass-rate bars from each projection', () => {
const html = buildManagementOverviewHtml(projection());
const document = new JSDOM(html).window.document;
expect(document.documentElement.lang).toBe('de');
expect(document.querySelectorAll('.heatmap li')).toHaveLength(3);
expect(document.querySelector('.heatmap li')?.textContent).toContain('52 %');
expect(document.querySelectorAll('.comparison-row')).toHaveLength(3);
expect(document.querySelector('.comparison-row')?.textContent).toContain('48 %');
expect(document.querySelector('.comparison-row .bar-pass')?.getAttribute('style')).toContain('48');
expect(document.body.textContent).toContain('444');
expect(document.body.textContent).toContain('100 abweichende Vergleiche zu 25 Einstellungen');
expect(html).not.toMatch(/<script\b|<link\b|url\(|https?:\/\//i);
expect(html).not.toContain('Overall Score');
expect(html).not.toContain('37/100');
expect(html).not.toContain('Source Overview');
expect(html).not.toContain('Priority Findings');
});
it('shows an unassessed domain as unknown, not zero percent', () => {
const document = new JSDOM(buildManagementOverviewHtml(projection())).window.document;
const tile = document.querySelectorAll('.heatmap li')[2];
expect(tile.className).toBe('unknown');
expect(tile.querySelector('.value')?.textContent).toBe('—');
expect(document.querySelectorAll('.comparison-row')[2].textContent).not.toContain('0 %');
});
it('uses other customer values, escapes names and omits GPO evaluation when absent', () => {
const html = buildManagementOverviewHtml(projection({
project: { id: 'other', name: '<Other Customer>' },
environment: [], gpo: undefined,
coverage: { ...projection().coverage, assessed: 10, deviations: 2 },
domains: [{ domainId: 'recovery', domainLabel: 'Monitoring & Recovery',
passed: 8, deviations: 2, assessed: 10, passRate: 0.8, evidence: { passed: [], deviations: [] } }]
}));
expect(html).toContain('&lt;Other Customer&gt;');
expect(html).not.toContain('synthetic.example');
expect(html).not.toContain('gesonderte GPO-Evaluation');
expect(html).toContain('20 %');
expect(html).toContain('80 %');
expect(html).not.toMatch(/<Other Customer>|<img\b/i);
});
});