UNPKG

veloxapi

Version:

An ultra-fast, zero-dependency Node.js web framework built entirely with Node.js built-in modules

274 lines (241 loc) โ€ข 7.58 kB
import http from 'http'; import { VeloxServer, VeloxRouter } from '../../lib/index.js'; import fs from 'fs'; const PORT = 9999; const router = new VeloxRouter(); // Test routes router.get('/', (res) => { res.sendJSON({ status: 'ok', message: 'VeloxAPI Production Test' }); }); router.get('/users/:id=number', (res, req, query, params) => { res.sendJSON({ userId: params.id, type: typeof params.id }); }); router.get('/email/:email=email', (res, req, query, params) => { res.sendJSON({ email: params.email, valid: true }); }); router.get('/search', (res, req, query) => { res.sendJSON({ query, count: Object.keys(query).length }); }); router.post('/data', async (res, req) => { try { const body = await req.getBody(); res.sendJSON({ received: body, success: true }); } catch (err) { console.error('Body parse error:', err.message); res.status(400).sendJSON({ error: err.message }); } }); router.get('/file', (res) => { res.sendFile('README.md'); }); const veloxServer = new VeloxServer(); veloxServer.setPort(PORT).setRouter(router); router.get('/stats', (res) => { const stats = veloxServer.getStats(); res.sendJSON(stats); }); router.get('/error', () => { throw new Error('Test error'); }); const serverInstance = veloxServer.start(); console.log('๐Ÿงช Starting production readiness tests...\n'); function request(method, path, options = {}) { return new Promise((resolve, reject) => { const opts = { hostname: 'localhost', port: PORT, path, method, headers: options.headers || {} }; const req = http.request(opts, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { resolve({ statusCode: res.statusCode, headers: res.headers, body: data }); }); }); req.on('error', reject); if (options.body) { req.write(options.body); } req.end(); }); } async function runTests() { await new Promise(resolve => setTimeout(resolve, 100)); let passed = 0; let failed = 0; // Test 1: Basic JSON route try { const res = await request('GET', '/'); const json = JSON.parse(res.body); if (res.statusCode === 200 && json.status === 'ok') { console.log('โœ… Test 1: Basic JSON route'); passed++; } else { console.log('โŒ Test 1: Basic JSON route failed'); failed++; } } catch (err) { console.log('โŒ Test 1: Basic JSON route - Error:', err.message); failed++; } // Test 2: Typed parameter (number) try { const res = await request('GET', '/users/123'); const json = JSON.parse(res.body); if (res.statusCode === 200 && json.userId === 123 && json.type === 'number') { console.log('โœ… Test 2: Typed parameter (number) - Converted to number'); passed++; } else { console.log('โŒ Test 2: Typed parameter failed -', json); failed++; } } catch (err) { console.log('โŒ Test 2: Typed parameter - Error:', err.message); failed++; } // Test 3: Email validation try { const res = await request('GET', '/email/test@example.com'); const json = JSON.parse(res.body); if (res.statusCode === 200 && json.email === 'test@example.com') { console.log('โœ… Test 3: Email parameter validation'); passed++; } else { console.log('โŒ Test 3: Email validation failed'); failed++; } } catch (err) { console.log('โŒ Test 3: Email validation - Error:', err.message); failed++; } // Test 4: Invalid email rejected (returns 404 because route doesn't match) try { const res = await request('GET', '/email/invalid-email'); if (res.statusCode === 404) { console.log('โœ… Test 4: Invalid email rejected (404 - route not matched)'); passed++; } else { console.log('โŒ Test 4: Invalid email should return 404, got', res.statusCode); failed++; } } catch (err) { console.log('โŒ Test 4: Invalid email rejection - Error:', err.message); failed++; } // Test 5: Query parameters try { const res = await request('GET', '/search?q=velox&limit=10'); const json = JSON.parse(res.body); if (res.statusCode === 200 && json.query.q === 'velox' && json.query.limit === '10') { console.log('โœ… Test 5: Query parameters parsed correctly'); passed++; } else { console.log('โŒ Test 5: Query parameters failed'); failed++; } } catch (err) { console.log('โŒ Test 5: Query parameters - Error:', err.message); failed++; } // Test 6: JSON body parsing try { const payload = { name: 'VeloxAPI', version: '0.2.0' }; const body = JSON.stringify(payload); const res = await request('POST', '/data', { headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }, body }); const json = JSON.parse(res.body); if (res.statusCode === 200 && json.received.name === 'VeloxAPI') { console.log('โœ… Test 6: JSON body parsing'); passed++; } else { console.log('โŒ Test 6: JSON body parsing failed -', res.statusCode); failed++; } } catch (err) { console.log('โŒ Test 6: JSON body parsing - Error:', err.message); failed++; } // Test 7: File serving try { const res = await request('GET', '/file'); if (res.statusCode === 200 && res.body.includes('VeloxAPI')) { console.log('โœ… Test 7: File serving (README.md)'); passed++; } else { console.log('โŒ Test 7: File serving failed'); failed++; } } catch (err) { console.log('โŒ Test 7: File serving - Error:', err.message); failed++; } // Test 8: Object pool statistics try { const res = await request('GET', '/stats'); const json = JSON.parse(res.body); if (res.statusCode === 200 && json.requestPool && json.responsePool) { console.log('โœ… Test 8: Object pool statistics -', `Req: ${json.requestPool.acquired}, Res: ${json.responsePool.acquired}`); passed++; } else { console.log('โŒ Test 8: Object pool stats failed'); failed++; } } catch (err) { console.log('โŒ Test 8: Object pool stats - Error:', err.message); failed++; } // Test 9: 404 handling try { const res = await request('GET', '/nonexistent'); if (res.statusCode === 404) { console.log('โœ… Test 9: 404 error handling'); passed++; } else { console.log('โŒ Test 9: 404 should return 404, got', res.statusCode); failed++; } } catch (err) { console.log('โŒ Test 9: 404 handling - Error:', err.message); failed++; } // Test 10: Error handling try { const res = await request('GET', '/error'); if (res.statusCode === 500) { console.log('โœ… Test 10: 500 error handling'); passed++; } else { console.log('โŒ Test 10: Error route should return 500, got', res.statusCode); failed++; } } catch (err) { console.log('โŒ Test 10: Error handling - Error:', err.message); failed++; } // Final summary console.log('\n' + '='.repeat(50)); console.log(`๐Ÿ“Š Production Test Results: ${passed}/${passed + failed} passed`); if (failed === 0) { console.log('๐ŸŽ‰ All production tests passed! Framework is ready.'); } else { console.log(`โš ๏ธ ${failed} test(s) failed. Review needed.`); } console.log('='.repeat(50)); veloxServer.close(() => { process.exit(failed === 0 ? 0 : 1); }); } runTests();