diff --git a/src/server/plugins/router.ts b/src/server/plugins/router.ts index 89b53a1ea..fe585f413 100644 --- a/src/server/plugins/router.ts +++ b/src/server/plugins/router.ts @@ -9,7 +9,7 @@ import { pathSchema, stateSchema } from '@defra/forms-engine-plugin/schema.js' -import { slugSchema } from '@defra/forms-model' +import { FormStatus, slugSchema } from '@defra/forms-model' import Boom from '@hapi/boom' import { type Request, @@ -34,7 +34,10 @@ import { publicRoutes, saveAndExitRoutes } from '~/src/server/routes/index.js' -import { getFormMetadata } from '~/src/server/services/formsService.js' +import { + getFormDefinition, + getFormMetadata +} from '~/src/server/services/formsService.js' import { getFeedbackFormLink } from '~/src/server/utils/utils.js' const routes: ServerRoute[] = [...publicRoutes, healthRoute] @@ -134,12 +137,16 @@ export default { async handler(request, h) { const { slug } = request.params const form = await getFormMetadata(slug) + const definition = await getFormDefinition(form.id, FormStatus.Draft) return h.view('help/privacy-notice', { form, saveAndExitExpiryDays, storeCompletedApplicationsFor, - storeFeedbackFor + storeFeedbackFor, + ...(definition?.options?.disableUserFeedback + ? {} + : getFeedbackFormLink(form.id)) }) }, options @@ -151,9 +158,13 @@ export default { async handler(request, h) { const { slug } = request.params const form = await getFormMetadata(slug) + const definition = await getFormDefinition(form.id, FormStatus.Draft) return h.view('help/privacy-notice-specific', { - form + form, + ...(definition?.options?.disableUserFeedback + ? {} + : getFeedbackFormLink(form.id)) }) }, options diff --git a/src/server/routes/index.test.ts b/src/server/routes/index.test.ts index d63c5eb6a..ec5c6556e 100644 --- a/src/server/routes/index.test.ts +++ b/src/server/routes/index.test.ts @@ -1,9 +1,13 @@ +import { type FormDefinition, type FormMetadata } from '@defra/forms-model' import { type Server } from '@hapi/hapi' import { StatusCodes } from 'http-status-codes' import { config } from '~/src/config/index.js' import { createServer } from '~/src/server/index.js' -import { getFormMetadata } from '~/src/server/services/formsService.js' +import { + getFormDefinition, + getFormMetadata +} from '~/src/server/services/formsService.js' import * as fixtures from '~/test/fixtures/index.js' import { renderResponse } from '~/test/helpers/component-helpers.js' @@ -163,7 +167,13 @@ describe('Routes', () => { expect($banner).toHaveTextContent('Hello world') }) - test('privacy notice (general) page is served', async () => { + test('privacy notice (general) page is served with feedback form link', async () => { + jest + .mocked(getFormMetadata) + .mockResolvedValueOnce({ id: '123' } as unknown as FormMetadata) + jest + .mocked(getFormDefinition) + .mockResolvedValueOnce({} as unknown as FormDefinition) const options = { method: 'GET', url: '/help/privacy/slug' @@ -176,11 +186,76 @@ describe('Routes', () => { level: 1 }) + const $link = container.getByRole('link', { + name: 'give your feedback (opens in new tab)' + }) + + expect($heading).toBeInTheDocument() + expect($heading).toHaveClass('govuk-heading-l') + expect($link).toBeInTheDocument() + }) + + test('privacy notice (general) page is served with feedback by email link', async () => { + jest + .mocked(getFormMetadata) + .mockResolvedValueOnce({ id: '123' } as unknown as FormMetadata) + jest.mocked(getFormDefinition).mockResolvedValueOnce({ + options: { disableUserFeedback: true } + } as unknown as FormDefinition) + const options = { + method: 'GET', + url: '/help/privacy/slug' + } + + const { container } = await renderResponse(server, options) + + const $heading = container.getByRole('heading', { + name: 'Submit a form to Defra - privacy notice', + level: 1 + }) + + const $link = container.getByRole('link', { + name: 'give your feedback by email' + }) + expect($heading).toBeInTheDocument() expect($heading).toHaveClass('govuk-heading-l') + expect($link).toBeInTheDocument() + }) + + test('privacy notice (specific) page is served with feedback form link', async () => { + jest + .mocked(getFormDefinition) + .mockResolvedValueOnce({} as unknown as FormDefinition) + jest.mocked(getFormMetadata).mockResolvedValue({ + ...fixtures.form.metadata, + privacyNoticeType: 'text', + privacyNoticeText: '# Privacy markdown heading' + }) + const options = { + method: 'GET', + url: '/help/privacy-specific/slug' + } + + const { container } = await renderResponse(server, options) + + const $heading = container.getByRole('heading', { + name: 'Privacy markdown heading', + level: 1 + }) + + const $link = container.getByRole('link', { + name: 'give your feedback (opens in new tab)' + }) + + expect($heading).toBeInTheDocument() + expect($link).toBeInTheDocument() }) - test('privacy notice (specific) page is served', async () => { + test('privacy notice (specific) page is served with feedback by email link', async () => { + jest.mocked(getFormDefinition).mockResolvedValueOnce({ + options: { disableUserFeedback: true } + } as unknown as FormDefinition) jest.mocked(getFormMetadata).mockResolvedValue({ ...fixtures.form.metadata, privacyNoticeType: 'text', @@ -198,6 +273,11 @@ describe('Routes', () => { level: 1 }) + const $link = container.getByRole('link', { + name: 'give your feedback by email' + }) + expect($heading).toBeInTheDocument() + expect($link).toBeInTheDocument() }) }) diff --git a/src/server/views/layout.html b/src/server/views/layout.html index 8d41aa14d..89a6a190c 100644 --- a/src/server/views/layout.html +++ b/src/server/views/layout.html @@ -145,11 +145,11 @@ {% if phaseTag and not hidePhaseBanner %} {% set feedbackLinkHtml -%} {% if feedbackLink %} - + give your feedback (opens in new tab) {% else %} - + give your feedback by email {% endif %}