Frontend Tests Added: - Jest configuration with TypeScript support - Jest setup with Next.js mocks - Unit tests for lib/metrics.ts (normalizePath, registry) - Unit tests for lib/api-metrics.ts (withMetrics wrapper) - Unit tests for middleware (auth routes, token detection) - Unit tests for API track route (payload validation) Dependencies added: - jest, @testing-library/react, @testing-library/jest-dom - ts-jest, jest-environment-jsdom, @types/jest 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
122 lines
3.1 KiB
TypeScript
122 lines
3.1 KiB
TypeScript
/**
|
|
* Tests pour l'API route /api/track
|
|
*/
|
|
|
|
describe('Track API Route', () => {
|
|
describe('Payload Validation', () => {
|
|
interface TrackPayload {
|
|
method: string;
|
|
path: string;
|
|
statusCode: number;
|
|
durationMs: number;
|
|
}
|
|
|
|
const validatePayload = (body: Partial<TrackPayload>): boolean => {
|
|
const { method, path, statusCode, durationMs } = body;
|
|
return !!(method && path && statusCode !== undefined && durationMs !== undefined);
|
|
};
|
|
|
|
it('should accept valid payload', () => {
|
|
const payload: TrackPayload = {
|
|
method: 'GET',
|
|
path: '/api/test',
|
|
statusCode: 200,
|
|
durationMs: 50,
|
|
};
|
|
expect(validatePayload(payload)).toBe(true);
|
|
});
|
|
|
|
it('should reject payload without method', () => {
|
|
const payload = {
|
|
path: '/api/test',
|
|
statusCode: 200,
|
|
durationMs: 50,
|
|
};
|
|
expect(validatePayload(payload)).toBe(false);
|
|
});
|
|
|
|
it('should reject payload without path', () => {
|
|
const payload = {
|
|
method: 'GET',
|
|
statusCode: 200,
|
|
durationMs: 50,
|
|
};
|
|
expect(validatePayload(payload)).toBe(false);
|
|
});
|
|
|
|
it('should reject payload without statusCode', () => {
|
|
const payload = {
|
|
method: 'GET',
|
|
path: '/api/test',
|
|
durationMs: 50,
|
|
};
|
|
expect(validatePayload(payload)).toBe(false);
|
|
});
|
|
|
|
it('should reject payload without durationMs', () => {
|
|
const payload = {
|
|
method: 'GET',
|
|
path: '/api/test',
|
|
statusCode: 200,
|
|
};
|
|
expect(validatePayload(payload)).toBe(false);
|
|
});
|
|
|
|
it('should accept statusCode 0', () => {
|
|
const payload = {
|
|
method: 'GET',
|
|
path: '/api/test',
|
|
statusCode: 0,
|
|
durationMs: 50,
|
|
};
|
|
expect(validatePayload(payload)).toBe(true);
|
|
});
|
|
|
|
it('should accept durationMs 0', () => {
|
|
const payload = {
|
|
method: 'GET',
|
|
path: '/api/test',
|
|
statusCode: 200,
|
|
durationMs: 0,
|
|
};
|
|
expect(validatePayload(payload)).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('HTTP Methods', () => {
|
|
const validMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];
|
|
|
|
validMethods.forEach((method) => {
|
|
it(`should accept ${method} method`, () => {
|
|
expect(validMethods).toContain(method);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('Status Codes', () => {
|
|
it('should accept 2xx status codes', () => {
|
|
const successCodes = [200, 201, 204];
|
|
successCodes.forEach((code) => {
|
|
expect(code).toBeGreaterThanOrEqual(200);
|
|
expect(code).toBeLessThan(300);
|
|
});
|
|
});
|
|
|
|
it('should accept 4xx status codes', () => {
|
|
const clientErrorCodes = [400, 401, 403, 404];
|
|
clientErrorCodes.forEach((code) => {
|
|
expect(code).toBeGreaterThanOrEqual(400);
|
|
expect(code).toBeLessThan(500);
|
|
});
|
|
});
|
|
|
|
it('should accept 5xx status codes', () => {
|
|
const serverErrorCodes = [500, 502, 503];
|
|
serverErrorCodes.forEach((code) => {
|
|
expect(code).toBeGreaterThanOrEqual(500);
|
|
expect(code).toBeLessThan(600);
|
|
});
|
|
});
|
|
});
|
|
});
|