import { AutoReporter } from '../reporters/AutoReporter.js'; /** * TESTS PARAMÈTRES EDGE CASES - API Controller * Tests des limites de paramètres et pagination */ const { describe, it, before, after } = require('node:test'); const assert = require('node:assert'); const http = require('node:http'); const { ManualServer } = require('../../lib/modes/ManualServer'); // Helper pour requêtes HTTP function makeRequest(options, postData = null) { return new Promise((resolve, reject) => { const req = http.request(options, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { try { const parsed = res.headers['content-type']?.includes('application/json') ? JSON.parse(data) : data; resolve({ statusCode: res.statusCode, headers: res.headers, data: parsed }); } catch (e) { resolve({ statusCode: res.statusCode, headers: res.headers, data }); } }); }); req.on('error', reject); req.setTimeout(10000, () => { req.destroy(); reject(new Error('Request timeout')); }); if (postData) { req.write(typeof postData === 'object' ? JSON.stringify(postData) : postData); } req.end(); }); } // Auto-Reporter Configuration const autoReporter = new AutoReporter(); describe('API Parameters Edge Cases', () => { let server; let baseUrl; const testPort = 3096; before(async () => { server = new ManualServer({ port: testPort, wsPort: 8096 }); await server.start(); baseUrl = `http://localhost:${testPort}`; console.log(`📊 Serveur paramètres démarré sur ${baseUrl}`); }); after(async () => { if (server) { await server.stop(); console.log('🛑 Serveur paramètres arrêté'); } }); describe('📄 Pagination Edge Cases', () => { it('should handle extreme pagination values', async () => { const testCases = [ { limit: -1, offset: 0, expected: 'normalize negative limit' }, { limit: 999999, offset: 0, expected: 'cap very large limit' }, { limit: 50, offset: -1, expected: 'normalize negative offset' }, { limit: 0, offset: 0, expected: 'handle zero limit' }, { limit: 50, offset: 999999, expected: 'handle large offset' } ]; for (const testCase of testCases) { const response = await makeRequest({ hostname: 'localhost', port: testPort, path: `/api/articles?limit=${testCase.limit}&offset=${testCase.offset}`, method: 'GET' }); // L'API doit normaliser ou échouer gracieusement assert.ok([200, 400, 500].includes(response.statusCode), `Test case: ${testCase.expected}`); if (response.statusCode === 200) { assert.ok(response.data.data.limit >= 0, 'Limit should be normalized to >= 0'); assert.ok(response.data.data.offset >= 0, 'Offset should be normalized to >= 0'); } } }); it('should handle invalid pagination types', async () => { const invalidTypes = [ { limit: 'abc', offset: 0 }, { limit: 50, offset: 'def' }, { limit: 'null', offset: 'undefined' }, { limit: '[]', offset: '{}' }, { limit: 'true', offset: 'false' } ]; for (const testCase of invalidTypes) { const response = await makeRequest({ hostname: 'localhost', port: testPort, path: `/api/articles?limit=${testCase.limit}&offset=${testCase.offset}`, method: 'GET' }); // L'API peut convertir ou échouer assert.ok([200, 400].includes(response.statusCode)); if (response.statusCode === 200) { // Vérifier que les valeurs sont normalisées assert.ok(typeof response.data.data.limit === 'number'); assert.ok(typeof response.data.data.offset === 'number'); } } }); it('should handle query parameters with special characters', async () => { const specialParams = [ 'project=%3Cscript%3E', //