diff --git a/backend/__tests__/healthcheck.test.ts b/backend/__tests__/healthcheck.test.ts index 945968437..e054bd180 100644 --- a/backend/__tests__/healthcheck.test.ts +++ b/backend/__tests__/healthcheck.test.ts @@ -1,24 +1,21 @@ import { Server } from 'http'; import main from '../src'; import { describe, expect, it, beforeAll, afterAll } from '@jest/globals'; -import supertest from 'supertest'; -import { setUpHealthEndpoint } from '../src/services/health'; +import request from 'supertest'; -let requestWithSupertest: supertest.SuperTest; let server: Server; -describe('Healthcheck endpoint', () => { - beforeAll(async () => { - server = await main; - requestWithSupertest = supertest(server); - setUpHealthEndpoint(server); - }); - afterAll(async () => { - server.close(); - }); +beforeAll(async () => { + server = await main; +}); +afterAll(async () => { + server.close(); +}); + +describe('Healthcheck endpoint', () => { it('GET /healthcheck should return OK', async () => { - const res = await requestWithSupertest.get('/healthcheck'); + const res = await request(server).get('/healthcheck'); expect(res.status).toEqual(200); }); }); \ No newline at end of file diff --git a/backend/src/helpers/database.ts b/backend/src/helpers/database.ts index 9ba592ea3..9d128ea47 100644 --- a/backend/src/helpers/database.ts +++ b/backend/src/helpers/database.ts @@ -29,6 +29,23 @@ const initDatabaseHelper = async ({ return mongoose.connection; } +/** + * Close database conection + */ +const closeDatabaseHelper = async () => { + return Promise.all([ + new Promise((resolve) => { + if (mongoose.connection && mongoose.connection.readyState == 1) { + mongoose.connection.close() + .then(() => resolve('Database connection closed')); + } else { + resolve('Database connection already closed'); + } + }) + ]); +} + export { - initDatabaseHelper + initDatabaseHelper, + closeDatabaseHelper } \ No newline at end of file diff --git a/backend/src/index.ts b/backend/src/index.ts index 90589404d..64d58cfc5 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,3 +1,4 @@ +import mongoose from 'mongoose'; import dotenv from 'dotenv'; dotenv.config(); import infisical from 'infisical-node'; @@ -158,17 +159,22 @@ const main = async () => { //* Handle unrouted requests and respond with proper error message as well as status code app.use((req, res, next) => { if (res.headersSent) return next(); - next(RouteNotFoundError({ message: `The requested source '(${req.method})${req.url}' was not found` })) + next(RouteNotFoundError({ message: `The requested source '(${req.method})${req.url}' was not found` })) }) app.use(requestErrorHandler) const server = app.listen(getPort(), () => { - createTestUserForDevelopment(); getLogger("backend-main").info(`Server started listening at port ${getPort()}`) }); + createTestUserForDevelopment(); setUpHealthEndpoint(server); + + server.on('close', async () => { + await DatabaseService.closeDatabase(); + }) + return server; } diff --git a/backend/src/services/DatabaseService.ts b/backend/src/services/DatabaseService.ts index 2e8dc839f..fdfd7660a 100644 --- a/backend/src/services/DatabaseService.ts +++ b/backend/src/services/DatabaseService.ts @@ -1,16 +1,32 @@ import mongoose from 'mongoose'; import { getLogger } from '../utils/logger'; -import { initDatabaseHelper } from '../helpers/database'; +import { + initDatabaseHelper, + closeDatabaseHelper +} from '../helpers/database'; /** * Class to handle database actions */ class DatabaseService { + /** + * Initialize database connection + * @param {Object} obj + * @param {String} obj.mongoURL - mongo connection string + * @returns + */ static async initDatabase(MONGO_URL: string) { return await initDatabaseHelper({ mongoURL: MONGO_URL }); } + + /** + * Close database conection + */ + static async closeDatabase() { + return await closeDatabaseHelper(); + } } export default DatabaseService; \ No newline at end of file