PPPAIMT-Crest/backend/test/health.test.js

41 lines
1.4 KiB
JavaScript

import { afterEach, describe, expect, it } from 'vitest';
import { contentSecurityPolicy, createServer } from '../src/app.js';
describe('GET /api/health', () => {
/** @type {import('@hapi/hapi').Server | undefined} */
let server;
afterEach(async () => {
await server?.stop();
});
it('returns ok and an ISO time', async () => {
server = await createServer();
const response = await server.inject({ method: 'GET', url: '/api/health' });
expect(response.statusCode).toBe(200);
const body =
/** @type {{ status: string, time: string, checks: { database: string, storage: string } }} */ (
response.result
);
expect(body.status).toBe('ok');
expect(body.checks).toEqual({ database: 'ok', storage: 'skipped' });
expect(response.headers['content-security-policy']).toBe(contentSecurityPolicy('/api/health'));
expect(contentSecurityPolicy('/api/dev/files/agreement.pdf')).toBe(
"default-src 'none'; frame-ancestors 'self'",
);
expect(response.headers['x-request-id']).toBeTruthy();
expect(Number.isNaN(Date.parse(body.time))).toBe(false);
});
it('returns a JSON error for an unknown route', async () => {
server = await createServer();
const response = await server.inject({ method: 'GET', url: '/api/missing' });
expect(response.statusCode).toBe(404);
expect(response.result).toEqual({
error: { code: 'NOT_FOUND', message: 'Not Found' },
});
});
});