59 lines
2.4 KiB
TypeScript
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);
|
|
});
|
|
});
|