the-tip-top-frontend/__tests__/api/track.test.ts
soufiane 1e9f16fded test: add Jest testing setup and unit tests
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>
2025-11-27 11:24:46 +01:00

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