import { mkdtemp, rm } from 'node:fs/promises'; import type { Server } from 'node:http'; import type { AddressInfo } from 'node:net'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { createAssessorHttpServer } from '../../server/assessor-http-server'; import { GpoPolicyAnalysisOverviewService } from '../../server/gpo/gpo-policy-analysis-overview-service'; import { LocalAssessorRepository } from '../../src/persistence/local-assessor-repository'; const timestamp = '2026-08-04T15:00:00.000Z'; describe('policy analysis overview HTTP boundary', () => { let directory: string; let server: Server; let baseUrl: string; beforeEach(async () => { directory = await mkdtemp(join(tmpdir(), 'assessor-policy-overview-http-')); const repository = new LocalAssessorRepository(); await repository.saveProject({ id: 'overview-project', name: 'Synthetic overview', createdAt: timestamp, updatedAt: timestamp, attributes: {} }); server = createAssessorHttpServer({ repository, staticRoot: join(directory, 'dist'), now: () => new Date(timestamp), gpoPolicyAnalysisOverviewService: new GpoPolicyAnalysisOverviewService(repository, { now: () => new Date(timestamp) }) }); await new Promise((resolve, reject) => { server.once('error', reject); server.listen(0, '127.0.0.1', resolve); }); baseUrl = 'http://127.0.0.1:' + (server.address() as AddressInfo).port; }); afterEach(async () => { await new Promise((resolve, reject) => server.close(error => error ? reject(error) : resolve())); await rm(directory, { recursive: true, force: true }); }); it('returns a project-bound empty view and rejects an unknown project', async () => { const response = await fetch(baseUrl + '/api/v1/projects/overview-project/policy-analysis-overview'); expect(response.status).toBe(200); await expect(response.json()).resolves.toMatchObject({ version: 1, projectId: 'overview-project', generatedAt: timestamp, summary: { policyFindings: 0, reviewItems: 0 }, actions: { version: 1, reprocess: [], aggregate: [], evaluate: [], createFindings: [] }, evaluations: [], reviewItems: [] }); const missing = await fetch(baseUrl + '/api/v1/projects/missing/policy-analysis-overview'); expect(missing.status).toBe(404); }); });