diff --git a/src/config/index.ts b/src/config/index.ts index 1a2a06e..30d53be 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -12,10 +12,13 @@ export const SERVICE_NAME = 'Node Prototype'; export const LANDING_PAGE = 'info'; export const NOT_FOUND = 'page-not-found'; export const ERROR_PAGE = 'error'; +export const CONFIRMATION = 'confirmation'; // Routing paths export const LANDING_URL = '/info'; export const INFO_URL = '/info'; export const HEALTHCHECK_URL = '/healthcheck'; +export const CONFIRMATION_URL = '/confirmation'; export const SERVICE_URL = `${BASE_URL}${LANDING_URL}`; + diff --git a/src/controller/confirmation.controller.ts b/src/controller/confirmation.controller.ts new file mode 100644 index 0000000..d558ed0 --- /dev/null +++ b/src/controller/confirmation.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.CONFIRMATION); +}; \ No newline at end of file diff --git a/src/routes/confirmation.ts b/src/routes/confirmation.ts new file mode 100644 index 0000000..23687c3 --- /dev/null +++ b/src/routes/confirmation.ts @@ -0,0 +1,10 @@ +import { Router } from 'express'; + +import { get } from '../controller/confirmation.controller'; +import * as config from '../config'; + +const confirmationRouter = Router(); + +confirmationRouter.get(config.CONFIRMATION_URL, get); + +export default confirmationRouter; diff --git a/src/routes/index.ts b/src/routes/index.ts index 01e515a..4c92a6e 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -3,11 +3,13 @@ import { Router } from 'express'; import { logger } from '../middleware/logger.middleware'; import healthcheckRouter from './healthcheck'; import infoRouter from './info'; +import confirmationRouter from './confirmation'; const router = Router(); router.use(logger); router.use(healthcheckRouter); router.use(infoRouter); +router.use(confirmationRouter); export default router; diff --git a/src/views/confirmation.html b/src/views/confirmation.html new file mode 100644 index 0000000..6b92c22 --- /dev/null +++ b/src/views/confirmation.html @@ -0,0 +1,29 @@ +{% extends "layout.html" %} + +{% set mainClasses = "govuk-main-wrapper--l" %} + +{% block content %} +
+
+ {{ govukPanel({ + titleText: "GitHub request complete", + html: "Your reference number
987654321" + }) }} + +

We have sent you a confirmation email.

+ +

What happens next

+ +

+ We’ve sent your request to cabinetoffice internal developer platform. +

+

+ They will contact you either to confirm your request, or to ask for more information. +

+ +

+ What did you think of this service? (takes 30 seconds) +

+
+
+{% endblock %} \ No newline at end of file diff --git a/src/views/layout.html b/src/views/layout.html index d58d153..313a32c 100644 --- a/src/views/layout.html +++ b/src/views/layout.html @@ -2,6 +2,7 @@ {% from "govuk/components/footer/macro.njk" import govukFooter %} {% from "govuk/components/header/macro.njk" import govukHeader %} +{% from "govuk/components/panel/macro.njk" import govukPanel %} {% block head %} diff --git a/test/integration/controller/error.spec.ts b/test/integration/controller/error.spec.ts index f5e957e..66d62bc 100644 --- a/test/integration/controller/error.spec.ts +++ b/test/integration/controller/error.spec.ts @@ -1,4 +1,5 @@ jest.mock('../../../src/controller/info.controller'); +jest.mock('../../../src/utils/logger'); import { jest, beforeEach, describe, expect, test } from '@jest/globals'; import request from 'supertest'; diff --git a/test/integration/routes/confirmation.spec.ts b/test/integration/routes/confirmation.spec.ts new file mode 100644 index 0000000..1c11ed4 --- /dev/null +++ b/test/integration/routes/confirmation.spec.ts @@ -0,0 +1,31 @@ +jest.mock('../../../src/middleware/logger.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 { MOCK_GET_CONFIRMATION_RESPONSE } from '../../mock/text.mock'; + +const mockedLogger = logger as jest.Mock; +mockedLogger.mockImplementation((req: Request, res: Response, next: NextFunction) => next()); + +describe('Confirmation endpoint integration tests', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('GET tests', () => { + test('should render confirmation template', async () => { + const res = await request(app).get(config.CONFIRMATION_URL); + + expect(res.status).toEqual(200); + expect(res.text).toContain(MOCK_GET_CONFIRMATION_RESPONSE); + expect(mockedLogger).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/test/integration/routes/healthcheck.spec.ts b/test/integration/routes/healthcheck.spec.ts index bc6c434..3a84257 100644 --- a/test/integration/routes/healthcheck.spec.ts +++ b/test/integration/routes/healthcheck.spec.ts @@ -1,4 +1,5 @@ jest.mock('../../../src/middleware/logger.middleware'); +jest.mock('../../../src/utils/logger'); import { jest, beforeEach, describe, expect, test } from '@jest/globals'; import { Request, Response, NextFunction } from 'express'; diff --git a/test/integration/routes/info.spec.ts b/test/integration/routes/info.spec.ts index 59d0981..9ec7c34 100644 --- a/test/integration/routes/info.spec.ts +++ b/test/integration/routes/info.spec.ts @@ -1,4 +1,5 @@ jest.mock('../../../src/middleware/logger.middleware'); +jest.mock('../../../src/utils/logger'); import { jest, beforeEach, describe, expect, test } from '@jest/globals'; import { Request, Response, NextFunction } from 'express'; diff --git a/test/mock/text.mock.ts b/test/mock/text.mock.ts index 47f86fc..2609fc5 100644 --- a/test/mock/text.mock.ts +++ b/test/mock/text.mock.ts @@ -1,6 +1,7 @@ export const MOCK_GET_INFO_RESPONSE = 'Placeholder - Info Page'; export const MOCK_POST_INFO_RESPONSE = 'post request test'; export const MOCK_OK_RESPONSE = 'OK'; +export const MOCK_GET_CONFIRMATION_RESPONSE = 'GitHub request complete'; export const MOCK_NOT_FOUND_RESPONSE = 'Page not found'; export const MOCK_SERVICE_UNAVAILABLE = 'Sorry, there is a problem with the service'; export const MOCK_SERVER_ERROR = 'Pipe 3000 requires elevated privileges'; diff --git a/test/unit/controller/confirmation.controller.spec.ts b/test/unit/controller/confirmation.controller.spec.ts new file mode 100644 index 0000000..5f0fc95 --- /dev/null +++ b/test/unit/controller/confirmation.controller.spec.ts @@ -0,0 +1,27 @@ +import { describe, expect, afterEach, test, jest } from '@jest/globals'; +import { Request, Response } from 'express'; + +import { get } from '../../../src/controller/confirmation.controller'; +import * as config from '../../../src/config'; + +const req = {} as Request; + +const mockResponse = () => { + const res = {} as Response; + res.render = jest.fn().mockReturnValue(res) as any; + return res; +}; + +describe('Confirmation controller test suites', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + test('should render confirmation template', () => { + const res = mockResponse(); + + get(req, res); + + expect(res.render).toHaveBeenCalledWith(config.CONFIRMATION); + }); +});