Assessor_2.0/tests/server/gpo-policy-analysis-overvie...

59 lines
2.4 KiB
TypeScript

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<void>((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<void>((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);
});
});