diff --git a/src/config/index.ts b/src/config/index.ts index 3435655..9824d22 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -36,6 +36,7 @@ export const ADD_COLLABORATOR = 'add-collaborator'; export const CHECK_YOUR_ANSWERS = 'check-your-answers'; export const ADDITIONAL_REQUESTS = 'additional-requests'; export const COOKIES = 'cookies'; +export const CONTACT_US = 'contact-us'; // Routing paths export const START_URL = '/start'; @@ -50,6 +51,7 @@ export const ADD_COLLABORATOR_URL = '/add-collaborator'; export const CHECK_YOUR_ANSWERS_URL = '/check-your-answers'; export const ADDITIONAL_REQUESTS_URL = '/additional-requests'; export const COOKIES_URL = '/cookies'; +export const CONTACT_US_URL = '/contact-us'; export const SERVICE_URL = `${BASE_URL}${HOME_URL}`; diff --git a/src/controller/contact-us.controller.ts b/src/controller/contact-us.controller.ts new file mode 100644 index 0000000..e42d654 --- /dev/null +++ b/src/controller/contact-us.controller.ts @@ -0,0 +1,6 @@ +import { Request, Response } from 'express'; +import * as config from '../config'; + +export const get = (_req: Request, res: Response) => { + return res.render(config.CONTACT_US); +}; diff --git a/src/routes/additional-requests.controller.ts b/src/routes/additional-requests.ts similarity index 100% rename from src/routes/additional-requests.controller.ts rename to src/routes/additional-requests.ts diff --git a/src/routes/contact-us.ts b/src/routes/contact-us.ts new file mode 100644 index 0000000..76ef45d --- /dev/null +++ b/src/routes/contact-us.ts @@ -0,0 +1,12 @@ +import { Router } from 'express'; + +import { get } from '../controller/contact-us.controller'; +import * as config from '../config'; + +import { authentication } from '../middleware/authentication.middleware'; + +const contactUsRouter = Router(); + +contactUsRouter.get(config.CONTACT_US_URL, authentication, get); + +export default contactUsRouter; diff --git a/src/routes/index.ts b/src/routes/index.ts index afceb91..95987a8 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -12,8 +12,9 @@ import addTeamRouter from './add-team'; import addTeamMemberRouter from './add-team-member'; import addCollaboratorRouter from './add-collaborator'; import checkYourAnswersRouter from './check-your-answers'; -import additionalRequestsRouter from './additional-requests.controller'; +import additionalRequestsRouter from './additional-requests'; import cookiesRouter from './cookies'; +import contactUsRouter from './contact-us'; const router = Router(); @@ -33,5 +34,6 @@ router.use(addCollaboratorRouter); router.use(checkYourAnswersRouter); router.use(additionalRequestsRouter); router.use(cookiesRouter); +router.use(contactUsRouter); export default router; diff --git a/src/views/contact-us.html b/src/views/contact-us.html new file mode 100644 index 0000000..2f683e8 --- /dev/null +++ b/src/views/contact-us.html @@ -0,0 +1,15 @@ +{% extends "layout.html" %} + +{% block pageContent %} + +

Contact us

+ +

If you need any further assistance - contact us at: github-requests.idp@digital.cabinet-office.gov.uk

+ +

Office hours

+ +

We can only respond to your support queries during office hours. Our office hours are 9:00am to 5:00pm, Monday to Friday.

+ +

When you get in touch during office hours, we’ll try to reply within 5 working days.

+ +{% endblock %} \ No newline at end of file diff --git a/src/views/layout.html b/src/views/layout.html index 86c4853..ba0b42e 100644 --- a/src/views/layout.html +++ b/src/views/layout.html @@ -68,7 +68,7 @@ text: "Cookies" }, { - href: "#", + href: "/contact-us", text: "Contact us" }, { diff --git a/test/integration/routes/contact-us.spec.ts b/test/integration/routes/contact-us.spec.ts new file mode 100644 index 0000000..5141c8c --- /dev/null +++ b/test/integration/routes/contact-us.spec.ts @@ -0,0 +1,35 @@ +jest.mock('../../../src/middleware/logger.middleware'); +jest.mock('../../../src/middleware/authentication.middleware'); +jest.mock('../../../src/utils/logger'); + +import { jest, beforeEach, describe, expect, test } from '@jest/globals'; +import { Request, Response, NextFunction } from 'express'; +import request from 'supertest'; + +import app from '../../../src/app'; +import * as config from '../../../src/config'; +import { logger } from '../../../src/middleware/logger.middleware'; +import { authentication } from '../../../src/middleware/authentication.middleware'; + +import { MOCK_CONTACT_US_RESPONSE } from '../../mock/text.mock'; + +const mockedLogger = logger as jest.Mock; +mockedLogger.mockImplementation((_req: Request, _res: Response, next: NextFunction) => next()); +const mockedAuth = authentication as jest.Mock; +mockedAuth.mockImplementation((_req: Request, _res: Response, next: NextFunction) => next()); + +describe('Contact us endpoint integration tests', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('GET tests', () => { + test('should render the contact us template', async () => { + const res = await request(app).get(config.COOKIES_URL); + + expect(res.text).toContain(MOCK_CONTACT_US_RESPONSE); + expect(mockedLogger).toHaveBeenCalledTimes(1); + expect(mockedAuth).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/test/integration/routes/cookies.spec.ts b/test/integration/routes/cookies.spec.ts index 08dca96..334c2b0 100644 --- a/test/integration/routes/cookies.spec.ts +++ b/test/integration/routes/cookies.spec.ts @@ -1,4 +1,5 @@ jest.mock('../../../src/middleware/logger.middleware'); +jest.mock('../../../src/middleware/authentication.middleware'); jest.mock('../../../src/utils/logger'); import { jest, beforeEach, describe, expect, test } from '@jest/globals'; @@ -8,11 +9,14 @@ import request from 'supertest'; import app from '../../../src/app'; import * as config from '../../../src/config'; import { logger } from '../../../src/middleware/logger.middleware'; +import { authentication } from '../../../src/middleware/authentication.middleware'; import { MOCK_COOKIES_RESPONSE } from '../../mock/text.mock'; const mockedLogger = logger as jest.Mock; mockedLogger.mockImplementation((_req: Request, _res: Response, next: NextFunction) => next()); +const mockedAuth = authentication as jest.Mock; +mockedAuth.mockImplementation((_req: Request, _res: Response, next: NextFunction) => next()); describe('Cookies endpoint integration tests', () => { beforeEach(() => { @@ -25,6 +29,7 @@ describe('Cookies endpoint integration tests', () => { expect(res.text).toContain(MOCK_COOKIES_RESPONSE); expect(mockedLogger).toHaveBeenCalledTimes(1); + expect(mockedAuth).toHaveBeenCalledTimes(1); }); }); }); diff --git a/test/mock/text.mock.ts b/test/mock/text.mock.ts index bc2c28c..6bf4b07 100644 --- a/test/mock/text.mock.ts +++ b/test/mock/text.mock.ts @@ -1,6 +1,7 @@ export const MOCK_OK_RESPONSE = 'OK'; export const MOCK_GET_CONFIRMATION_RESPONSE = 'GitHub request complete'; export const MOCK_COOKIES_RESPONSE = 'Cookies'; +export const MOCK_CONTACT_US_RESPONSE = 'Contact us'; export const MOCK_GET_START_RESPONSE = 'GitHub Requests'; export const MOCK_GET_HOME_RESPONSE = 'GitHub Requests'; diff --git a/test/unit/controller/contact-us.controller.spec.ts b/test/unit/controller/contact-us.controller.spec.ts new file mode 100644 index 0000000..5640540 --- /dev/null +++ b/test/unit/controller/contact-us.controller.spec.ts @@ -0,0 +1,19 @@ +import { describe, expect, afterEach, test, jest } from '@jest/globals'; + +import { get } from '../../../src/controller/contact-us.controller'; +import { mockRequest, mockResponse } from '../../mock/express.mock'; + +describe('Contact us controller test suites', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + test('should render contact us template', () => { + const req = mockRequest(); + const res = mockResponse(); + + get(req, res); + + expect(res.render).toHaveBeenCalledTimes(1); + }); +});