diff --git a/server.ts b/server.ts index 00e2965e..401b63d8 100644 --- a/server.ts +++ b/server.ts @@ -136,12 +136,16 @@ app.use((err: Error, req: Request, res: Response, next: NextFunction) => { } }); -const PORT = process.env.PORT || 3001; -app.listen(PORT, () => { - logger.info(`Authentication server started on port ${PORT}`); -}); +if (process.env.NODE_ENV !== 'test') { + const PORT = process.env.PORT || 3001; + app.listen(PORT, () => { + logger.info(`Authentication server started on port ${PORT}`); + console.log('--- REGISTERED API ROUTES ---'); + console.table(listEndpoints(app)); + console.log('-----------------------------'); + }); +} -console.log('--- REGISTERED API ROUTES ---'); -console.table(listEndpoints(app)); -console.log('-----------------------------'); -// --- END ROUTE DEBUGGING --- \ No newline at end of file + +// Export the app for integration testing +export default app; \ No newline at end of file diff --git a/src/tests/setup/integration-global-setup.ts b/src/tests/setup/integration-global-setup.ts index e47da16b..ca9d3a8d 100644 --- a/src/tests/setup/integration-global-setup.ts +++ b/src/tests/setup/integration-global-setup.ts @@ -1,10 +1,11 @@ // src/tests/setup/integration-global-setup.ts -import { exec, ChildProcess } from 'child_process'; -import { logger } from '../../services/logger'; -import { getPool } from '../../services/db/connection'; // Import getPool import { execSync } from 'child_process'; +import type { Server } from 'http'; +import app from '../../../server'; // Import the Express app +import { logger } from '../../services/logger'; +import { getPool } from '../../services/db/connection'; -let serverProcess: ChildProcess; +let server: Server; export async function setup() { console.log(`\n--- [PID:${process.pid}] Running Integration Test GLOBAL Setup ---`); @@ -20,27 +21,13 @@ export async function setup() { process.exit(1); } - console.log(`\n[PID:${process.pid}] Starting backend server as a separate process...`); - - // Use the dedicated test server script, which correctly uses the .env.test file. - serverProcess = exec('npm run start:test'); - - // --- NEW LOGGING START --- - // Listen for premature exit to debug crashes immediately - serverProcess.on('exit', (code, signal) => { - if (code !== 0 && signal !== 'SIGTERM') { - console.error(`\n[SERVER EXIT]: Backend server process exited prematurely with code ${code} and signal ${signal}`); - console.error('Check [SERVER STDERR] logs above for details.\n'); - } - }); - // --- NEW LOGGING END --- - - //serverProcess.stdout?.on('data', (data) => { - //console.log(`[SERVER STDOUT]: ${data}`); - //}); - - serverProcess.stderr?.on('data', (data) => { - console.error(`[SERVER STDERR]: ${data}`); + // Programmatically start the server within the same process. + const port = process.env.PORT || 3001; + await new Promise((resolve) => { + server = app.listen(port, () => { + console.log(`✅ In-process test server started on port ${port}`); + resolve(); + }); }); /** @@ -60,30 +47,17 @@ export async function setup() { } }; - const maxRetries = 10; + const maxRetries = 15; const retryDelay = 1000; for (let i = 0; i < maxRetries; i++) { - try { - // If the process has already died, stop waiting - if (serverProcess.exitCode !== null) { - throw new Error(`Server process exited with code ${serverProcess.exitCode}`); - } - - if (await pingTestBackend().catch(() => false)) { - console.log('✅ Backend server is running and responsive.'); - return; - } - } catch (e) { - // Only log debug if we are still waiting, otherwise throw - if (serverProcess.exitCode !== null) throw e; - logger.debug('Ping failed while waiting for server, this is expected.', { error: e }); + if (await pingTestBackend()) { + console.log('✅ Backend server is running and responsive.'); + return; } console.log(`[PID:${process.pid}] Waiting for backend server... (attempt ${i + 1}/${maxRetries})`); await new Promise(resolve => setTimeout(resolve, retryDelay)); } - console.error('🔴 Backend server did not start in time. Integration tests will likely fail.'); - serverProcess.kill(); throw new Error('Backend server failed to start.'); } @@ -92,9 +66,9 @@ export async function teardown() { // Close the database connection pool after all integration tests have run. // This is the correct place to ensure all connections are closed gracefully. const pool = getPool(); - if (serverProcess) { - serverProcess.kill(); - console.log('✅ Backend server process terminated.'); + if (server) { + await new Promise(resolve => server.close(() => resolve())); + console.log('✅ In-process test server stopped.'); } if (pool) { // Check if the pool has any clients (total, idle, or waiting) before ending it.