From 2b2430550feef90c076b004cff96007320e2002a Mon Sep 17 00:00:00 2001 From: aelassas Date: Wed, 21 Feb 2024 22:51:07 +0100 Subject: [PATCH] Add middleware.test.ts --- api/coverage/cobertura-coverage.xml | 770 ++++++++++++++-------------- api/src/common/Helper.ts | 4 +- api/tests/TestHelper.ts | 4 +- api/tests/middleware.test.ts | 104 ++++ 4 files changed, 493 insertions(+), 389 deletions(-) create mode 100644 api/tests/middleware.test.ts diff --git a/api/coverage/cobertura-coverage.xml b/api/coverage/cobertura-coverage.xml index 133db9e7..851ef51e 100644 --- a/api/coverage/cobertura-coverage.xml +++ b/api/coverage/cobertura-coverage.xml @@ -1,6 +1,6 @@ - + C:\dev\movinin\src\api @@ -11,79 +11,79 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - - + + - - - - - - + + + + + + - + - + - + - + @@ -91,14 +91,14 @@ - + - + - + - + @@ -111,67 +111,67 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - + + + + + - - - - - + + + + + - + - - - + + + @@ -216,7 +216,7 @@ - + @@ -227,52 +227,52 @@ - + - + - - - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -340,9 +340,9 @@ - + - + @@ -429,8 +429,8 @@ - - + + @@ -1365,14 +1365,14 @@ - + - + - + - + @@ -1425,9 +1425,9 @@ - + - + @@ -1483,7 +1483,7 @@ - + @@ -1606,36 +1606,36 @@ - - - - + + + + - - - + + + - - - - - + + + + + - - - - - + + + + + - - + + - - + + @@ -1677,7 +1677,7 @@ - + @@ -1773,15 +1773,15 @@ - - - + + + - - + + - + @@ -1933,62 +1933,62 @@ - + - + - + - + - - - - + + + + - + - + - + - + - + - - - - - - - - + + + + + + + + - + - + - + - - + + @@ -1997,19 +1997,19 @@ - + - + - - - - + + + + - + @@ -2019,122 +2019,122 @@ - + - + - + - - - + + + - + - + - + - - - - + + + + - + - + - + - - - - + + + + - + - + - + - - - - + + + + - + - + - + - - - - + + + + - + - + - + - - - - + + + + - + - + - + - - - - + + + + - + @@ -2144,22 +2144,22 @@ - + - + - + - - - + + + - + @@ -2170,108 +2170,108 @@ - - - - - - - + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2280,9 +2280,9 @@ - + - + @@ -2290,9 +2290,9 @@ - + - + @@ -2305,29 +2305,29 @@ - + - + - + - + - + - + - + - + - + - + @@ -2335,9 +2335,9 @@ - + - + @@ -2377,54 +2377,54 @@ - - + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - + + + + + diff --git a/api/src/common/Helper.ts b/api/src/common/Helper.ts index f80a663d..826ce149 100644 --- a/api/src/common/Helper.ts +++ b/api/src/common/Helper.ts @@ -112,7 +112,7 @@ export const clone = (obj: any) => (Array.isArray(obj) ? Array.from(obj) : ({ .. * @returns {boolean} */ export function isBackend(req: Request): boolean { - return req.headers.origin === trim(env.BACKEND_HOST, '/') + return !!req.headers.origin && trim(req.headers.origin, '/') === trim(env.BACKEND_HOST, '/') } /** @@ -123,7 +123,7 @@ export function isBackend(req: Request): boolean { * @returns {boolean} */ export function isFrontend(req: Request): boolean { - return req.headers.origin === trim(env.FRONTEND_HOST, '/') + return !!req.headers.origin && trim(req.headers.origin, '/') === trim(env.FRONTEND_HOST, '/') } /** diff --git a/api/tests/TestHelper.ts b/api/tests/TestHelper.ts index 5b924127..72e2dec8 100644 --- a/api/tests/TestHelper.ts +++ b/api/tests/TestHelper.ts @@ -21,8 +21,8 @@ export function getAgencyName() { return getName('agency') } -const ADMIN_EMAIL = `${getName('admin')}@test.movinin.io` -const USER_EMAIL = `${getName('user')}@test.movinin.io` +export const ADMIN_EMAIL = `${getName('admin')}@test.movinin.io` +export const USER_EMAIL = `${getName('user')}@test.movinin.io` export const USER_FULL_NAME = 'user' export const PASSWORD = 'Un1tTest5' export const LANGUAGE = 'en' diff --git a/api/tests/middleware.test.ts b/api/tests/middleware.test.ts new file mode 100644 index 00000000..a3581e68 --- /dev/null +++ b/api/tests/middleware.test.ts @@ -0,0 +1,104 @@ +import 'dotenv/config' +import request from 'supertest' +import * as movininTypes from 'movinin-types' +import * as DatabaseHelper from '../src/common/DatabaseHelper' +import app from '../src/app' +import * as env from '../src/config/env.config' +import * as TestHelper from './TestHelper' + +const { ADMIN_EMAIL } = TestHelper +const { USER_EMAIL } = TestHelper +let USER_ID: string + +// +// Connecting and initializing the database before running the test suite +// +beforeAll(async () => { + if (await DatabaseHelper.Connect(false)) { + await TestHelper.initialize() + USER_ID = TestHelper.getUserId() + } +}) + +// +// Closing and cleaning the database connection after running the test suite +// +afterAll(async () => { + await TestHelper.close() + await DatabaseHelper.Close(false) +}) + +describe('GET /api/user/:id', () => { + it('should authenticate through backend HttpOnly cookie', async () => { + const payload: movininTypes.SignInPayload = { + email: ADMIN_EMAIL, + password: TestHelper.PASSWORD, + } + + let res = await request(app) + .post(`/api/sign-in/${movininTypes.AppType.Backend}`) + .send(payload) + expect(res.statusCode).toBe(200) + const cookies = res.headers['set-cookie'] as unknown as string[] + expect(cookies.length).toBeGreaterThan(1) + const cookie = cookies[1].replace(env.X_ACCESS_TOKEN, env.BACKEND_AUTH_COOKIE_NAME) + + res = await request(app) + .get(`/api/user/${USER_ID}`) + .set('Origin', env.BACKEND_HOST) + .set('Cookie', cookie) + expect(res.statusCode).toBe(200) + expect(res.body.email).toBe(USER_EMAIL) + }) +}) + +describe('GET /api/user/:id', () => { + it('should authenticate through frontend HttpOnly cookie', async () => { + const payload: movininTypes.SignInPayload = { + email: USER_EMAIL, + password: TestHelper.PASSWORD, + } + + let res = await request(app) + .post(`/api/sign-in/${movininTypes.AppType.Frontend}`) + .send(payload) + expect(res.statusCode).toBe(200) + const cookies = res.headers['set-cookie'] as unknown as string[] + expect(cookies.length).toBeGreaterThan(1) + const cookie = cookies[1].replace(env.X_ACCESS_TOKEN, env.FRONTEND_AUTH_COOKIE_NAME) + + res = await request(app) + .get(`/api/user/${USER_ID}`) + .set('Origin', env.FRONTEND_HOST) + .set('Cookie', cookie) + expect(res.statusCode).toBe(200) + expect(res.body.email).toBe(USER_EMAIL) + }) +}) + +describe('GET /api/user/:id', () => { + it('should authenticate through request header', async () => { + const token = await TestHelper.signinAsAdmin() + + const res = await request(app) + .get(`/api/user/${USER_ID}`) + .set(env.X_ACCESS_TOKEN, token) + expect(res.statusCode).toBe(200) + expect(res.body.email).toBe(USER_EMAIL) + + await TestHelper.signout(token) + }) +}) + +describe('PATCH /api/user/:id', () => { + it('should revoke access to PATCH method', async () => { + const token = await TestHelper.signinAsAdmin() + + const res = await request(app) + .patch(`/api/user/${USER_ID}`) + .set(env.X_ACCESS_TOKEN, token) + expect(res.statusCode).toBe(405) + + await TestHelper.signout(token) + }) +})