UNPKG

@defra-fish/gafl-webapp-service

Version:

The websales frontend for the GAFL service

575 lines (516 loc) • 20.3 kB
import uri, { CONTROLLER, RECURRING_TERMS_CONDITIONS } from '../../uri.js' import miscRoutes from '../misc-routes.js' import constants, { ANALYTICS } from '../../constants.js' import { addLanguageCodeToUri } from '../../processors/uri-helper.js' import { welshEnabledAndApplied } from '../../processors/page-language-helper.js' import { checkAnalyticsCookiesPage } from '../../handlers/analytics-handler.js' jest.mock('../../uri.js', () => ({ ...jest.requireActual('../../uri.js'), CONTROLLER: { uri: 'controller.uri' }, COOKIES: { uri: 'cookies.uri', page: 'biscuits' } })) jest.mock('../../constants.js', () => ({ ...jest.requireActual('../../constants.js'), CSRF_TOKEN_COOKIE_NAME_DEFAULT: 'CSRF_TOKEN_COOKIE_NAME_DEFAULT', ANALYTICS: { acceptTracking: 'accept' } })) jest.mock('../../processors/uri-helper.js') jest.mock('../../processors/page-language-helper.js') jest.mock('../../handlers/analytics-handler.js') describe('guidance page handlers', () => { const cookiesPagePostHandler = miscRoutes.find(r => r.method === 'POST' && r.path === uri.COOKIES.uri).handler const cookiesPageGetHandler = miscRoutes.find(r => r.method === 'GET' && r.path === uri.COOKIES.uri).handler const accessibilityPageHandler = miscRoutes.find(r => r.path === uri.ACCESSIBILITY_STATEMENT.uri).handler const privacyPolicyPageHandler = miscRoutes.find(r => r.path === uri.PRIVACY_POLICY.uri).handler const refundPolicyPageHandler = miscRoutes.find(r => r.path === uri.REFUND_POLICY.uri).handler const osTermsPageHandler = miscRoutes.find(r => r.path === uri.OS_TERMS.uri).handler const newPricesPageHandler = miscRoutes.find(r => r.path === uri.NEW_PRICES.uri).handler const rpTermsConditionsHandler = miscRoutes.find(r => r.path === uri.RECURRING_TERMS_CONDITIONS.uri).handler describe('cookies page handler', () => { describe.each([ ['get', cookiesPageGetHandler], ['post', cookiesPagePostHandler] ])('%s handler', (method, handler) => { const processEnv = process.env process.env.GTM_CONTAINER_ID = 'GTM-000000' beforeEach(jest.resetAllMocks) afterEach(() => { process.env = processEnv process.env.GTM_CONTAINER_ID = 'GTM-000000' }) it.each([ ['get', cookiesPageGetHandler], ['post', cookiesPagePostHandler] ])('only calls toolkit view function once for %s', async (method, handler) => { const toolkit = getMockToolkit() await handler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledTimes(1) }) it.each([ ['get', cookiesPageGetHandler, 'cookies.policy.page'], ['get', cookiesPageGetHandler, 'page.url'], ['get', cookiesPageGetHandler, 'policy-for-cookies'], ['post', cookiesPagePostHandler, 'cookies.policy.page'], ['post', cookiesPagePostHandler, 'page.url'], ['post', cookiesPagePostHandler, 'policy-for-cookies'] ])('sets cookie page for %s', async (method, handler, cookiesPage) => { const toolkit = getMockToolkit() uri.COOKIES.page = cookiesPage await handler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith(cookiesPage, expect.any(Object)) }) it.each([['csrf_token_cookie_name'], ['any_name'], ['token_cookie']])( 'sets cookie.csrf to match process.env.CSRF_TOKEN_COOKIE_NAME', async csrf => { process.env.CSRF_TOKEN_COOKIE_NAME = csrf const toolkit = getMockToolkit() await handler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ cookie: expect.objectContaining({ csrf }) }) ) } ) it.each([['default cookie name'], ['csrf-token-cookie-name-default']])( "sets cookie.csrf to default if process.env.CSRF_TOKEN_COOKIE_NAME isn't provided", async defaultName => { delete process.env.CSRF_TOKEN_COOKIE_NAME constants.CSRF_TOKEN_COOKIE_NAME_DEFAULT = defaultName const toolkit = getMockToolkit() await handler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ cookie: expect.objectContaining({ csrf: defaultName }) }) ) } ) it.each([['session-cookie-name'], ['sen'], ['session.cookie.name']])( 'sets cookie.sess to match process.env.SESSION_COOKIE_NAME', async sessionCookieName => { process.env.SESSION_COOKIE_NAME = sessionCookieName const toolkit = getMockToolkit() await handler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ cookie: expect.objectContaining({ sess: sessionCookieName }) }) ) } ) it.each([['default session cookie name'], ['session-cookie-name-default']])( "sets cookie.sess to default if process.env.SESSION_COOKIE_NAME isn't provided", async defaultName => { delete process.env.SESSION_COOKIE_NAME constants.SESSION_COOKIE_NAME_DEFAULT = defaultName const toolkit = getMockToolkit() await handler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ cookie: expect.objectContaining({ sess: defaultName }) }) ) } ) it.each([['alb cookie name'], ['alb-cookie-name-default']])( "sets cookie.sess to default if process.env.SESSION_COOKIE_NAME isn't provided", async defaultName => { constants.ALB_COOKIE_NAME = defaultName const toolkit = getMockToolkit() await handler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ cookie: expect.objectContaining({ alb: defaultName }) }) ) } ) it.each([['albcors cookie name'], ['alb-cors-cookie-name-default']])( "sets cookie.sess to default if process.env.SESSION_COOKIE_NAME isn't provided", async defaultName => { constants.ALBCORS_COOKIE_NAME = defaultName const toolkit = getMockToolkit() await handler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ cookie: expect.objectContaining({ albcors: defaultName }) }) ) } ) it.each([ [['kl', 'vu'], 'kl', 'vu'], [['si', 'we'], 'we', 'si'] ])('sets altLang to be other item in two-item language array', async (locales, locale, altLang) => { const request = getMockRequest({ locales, locale }) const toolkit = getMockToolkit() await handler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ altLang: [altLang] }) ) }) it.each([[{ msg_header: 'header1', msg_body: 'body1' }], [{ msg_header: 'header2', msg_body: 'body2' }]])( 'returns messages from catalog', async catalog => { const request = getMockRequest({ catalog }) const toolkit = getMockToolkit() await handler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ mssgs: catalog }) ) } ) it.each([['123456'], ['XXXXXX'], ['124567']])('returns gtmContainerId', async gtm => { process.env.GTM_CONTAINER_ID = gtm const request = getMockRequest({}) const toolkit = getMockToolkit() await handler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ gtmContainerId: gtm }) ) }) it('returns pageLanguageSetToWelsh', async () => { const welshEnabled = Symbol('enabled') welshEnabledAndApplied.mockReturnValueOnce(welshEnabled) const request = getMockRequest({}) const toolkit = getMockToolkit() await handler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ pageLanguageSetToWelsh: welshEnabled }) ) }) it('returns uris with language code added', async () => { const mockUri = Symbol('terms') addLanguageCodeToUri.mockReturnValue(mockUri) const request = getMockRequest({}) const toolkit = getMockToolkit() await handler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ uri: { back: mockUri, cookies: mockUri } }) ) }) it.each([ [true, 'accept'], [false, 'reject'] ])('sets value of analyticsResponse when acceptTracking is %', async (acceptTracking, expected) => { const analytics = { [ANALYTICS.acceptTracking]: acceptTracking } const referrer = CONTROLLER.uri const request = getMockRequest( { locale: 'this-locale', locales: ['this-locale', 'that-locale'], catalog: 'catalog' }, referrer, analytics ) const toolkit = getMockToolkit() await handler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ analyticsResponse: expected }) ) }) it.each([[Symbol('view-return')], [Symbol('view.return')]])('returns h.view return value', async viewReturn => { const toolkit = getMockToolkit() toolkit.view.mockReturnValue(viewReturn) const returned = await handler(getMockRequest(), toolkit) expect(returned).toEqual(viewReturn) }) }) describe('cookies page handler for post', () => { it('calls checkAnalyticsCookiesPage with the request', async () => { const request = getMockRequest() const toolkit = getMockToolkit() await cookiesPagePostHandler(request, toolkit) expect(checkAnalyticsCookiesPage).toHaveBeenCalledWith(request) }) it.each([ [{ analyticsResponse: 'accept' }, true], [{ analyticsResponse: 'reject' }, true], [{}, undefined] ])('sets showNotification based on analyticsResponse', async (payload, expected) => { const referrer = CONTROLLER.uri const request = getMockRequest( { locale: 'this-locale', locales: ['this-locale', 'that-locale'], catalog: 'catalog' }, referrer, '', payload ) const toolkit = getMockToolkit() await cookiesPagePostHandler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ showNotification: expected }) ) }) it.each([['csrf_token_cookie_name'], ['any_name'], ['token_cookie']])( 'sets CSRF_TOKEN_NAME to match process.env.CSRF_TOKEN_COOKIE_NAME', async csrf => { process.env.CSRF_TOKEN_COOKIE_NAME = csrf const toolkit = getMockToolkit() await cookiesPagePostHandler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ CSRF_TOKEN_NAME: csrf }) ) } ) it.each([['default cookie name'], ['csrf-token-cookie-name-default']])( "sets CSRF_TOKEN_NAME to default if process.env.CSRF_TOKEN_COOKIE_NAME isn't provided", async defaultName => { delete process.env.CSRF_TOKEN_COOKIE_NAME constants.CSRF_TOKEN_COOKIE_NAME_DEFAULT = defaultName const toolkit = getMockToolkit() await cookiesPagePostHandler(getMockRequest(), toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ CSRF_TOKEN_NAME: defaultName }) ) } ) it.each([['csrf_token_cookie_value'], ['any_value'], ['token_value']])( 'grabs CSRF_TOKEN_VALUE correctly based on generate from crumb', async csrf => { const request = getMockRequest( { locale: 'this-locale', locales: ['this-locale', 'that-locale'], catalog: 'catalog' }, CONTROLLER.uri, '', {}, csrf ) const toolkit = getMockToolkit() await cookiesPagePostHandler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ CSRF_TOKEN_VALUE: csrf }) ) } ) }) }) it('New prices page handler provides expected data for new prices page', async () => { const catalog = Symbol('catalog') const mockUri = Symbol('Back') addLanguageCodeToUri.mockReturnValueOnce(mockUri) const mockRequest = getMockRequest({ locale: 'this-locale', locales: ['this-locale', 'that-locale'], catalog }) const mockToolkit = getMockToolkit() await newPricesPageHandler(mockRequest, mockToolkit) expect(mockToolkit.view).toHaveBeenCalledWith(uri.NEW_PRICES.page, { altLang: ['that-locale'], gtmContainerId: 'GTM-000000', mssgs: catalog, uri: { back: mockUri } }) }) it('recurring payment terms and conditions page handler provides expected data for recurring payments terms and conditions page', async () => { const catalog = Symbol('catalog') const mockUri = Symbol('terms') const welshEnabled = Symbol('enabled') addLanguageCodeToUri.mockReturnValue(mockUri) welshEnabledAndApplied.mockReturnValueOnce(welshEnabled) const mockRequest = getMockRequest({ locale: 'this-locale', locales: ['this-locale', 'that-locale'], catalog }) const mockToolkit = getMockToolkit() await rpTermsConditionsHandler(mockRequest, mockToolkit) expect(mockToolkit.view).toHaveBeenCalledWith(uri.RECURRING_TERMS_CONDITIONS.page, { altLang: ['that-locale'], gtmContainerId: 'GTM-000000', pageLanguageSetToWelsh: welshEnabled, mssgs: catalog, uri: { privacy: mockUri, refund: mockUri } }) }) it('privacy policy page handler provides expected data for privacy page', async () => { const catalog = Symbol('catalog') const mockUri = Symbol('terms') const welshEnabled = Symbol('enabled') addLanguageCodeToUri.mockReturnValue(mockUri) welshEnabledAndApplied.mockReturnValueOnce(welshEnabled) const mockRequest = getMockRequest({ locale: 'this-locale', locales: ['this-locale', 'that-locale'], catalog }) const mockToolkit = getMockToolkit() await privacyPolicyPageHandler(mockRequest, mockToolkit) expect(mockToolkit.view).toHaveBeenCalledWith(uri.PRIVACY_POLICY.page, { altLang: ['that-locale'], gtmContainerId: 'GTM-000000', pageLanguageSetToWelsh: welshEnabled, mssgs: catalog, uri: { back: mockUri, cookies: mockUri } }) }) describe.each([ { pageHandler: accessibilityPageHandler, handlerName: 'Accessibility' }, { pageHandler: refundPolicyPageHandler, handlerName: 'Refund policy' }, { pageHandler: cookiesPageGetHandler, handlerName: 'Cookies' } ])('back button tests for $handlerName page', ({ pageHandler }) => { beforeEach(jest.resetAllMocks) it.each([[CONTROLLER.uri], [RECURRING_TERMS_CONDITIONS.uri]])( 'addLanguageCodeToUri is called with %s when referrer is %s', async referrer => { const toolkit = getMockToolkit() const request = getMockRequest({ locale: 'this-locale', locales: ['this-locale', 'that-locale'], catalog: 'catalog' }, referrer) await pageHandler(request, toolkit) expect(addLanguageCodeToUri).toHaveBeenCalledWith(request, referrer) } ) it.each([[CONTROLLER.uri], [RECURRING_TERMS_CONDITIONS.uri]])( 'back button should be set to %s when referrer is same value', async referrer => { const toolkit = getMockToolkit() const request = getMockRequest({ locale: 'this-locale', locales: ['this-locale', 'that-locale'], catalog: 'catalog' }, referrer) addLanguageCodeToUri.mockImplementation((_request, uri) => uri) await pageHandler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ uri: expect.objectContaining({ back: referrer }) }) ) } ) }) describe.each([ { pageHandler: cookiesPageGetHandler, handlerName: 'Cookies' }, { pageHandler: accessibilityPageHandler, handlerName: 'Accessibility' }, { pageHandler: privacyPolicyPageHandler, handlerName: 'Privacy policy' }, { pageHandler: refundPolicyPageHandler, handlerName: 'Refund policy' }, { pageHandler: osTermsPageHandler, handlerName: 'OS Terms' }, { pageHandler: newPricesPageHandler, handlerName: 'New Prices Page Handler' } ])('language code tests for $handlerName page', ({ pageHandler }) => { beforeEach(jest.resetAllMocks) it('uses addLanguageCodeToUri to get back url', async () => { const toolkit = getMockToolkit() const request = getMockRequest() await pageHandler(request, toolkit) expect(addLanguageCodeToUri).toHaveBeenCalledWith(request, uri.CONTROLLER.uri) }) it('uses url generated by addLanguageCodeToUri for back url', async () => { const toolkit = getMockToolkit() const request = getMockRequest() const backUrl = Symbol('backUrl') addLanguageCodeToUri.mockReturnValue(backUrl) await pageHandler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ uri: expect.objectContaining({ back: backUrl }) }) ) }) it('returns the value of welshEnabledAndApplied for pageLanguageSetToWelsh', async () => { const toolkit = getMockToolkit() const request = getMockRequest() const expectedValue = Symbol('expected') welshEnabledAndApplied.mockReturnValueOnce(expectedValue) await pageHandler(request, toolkit) expect(toolkit.view).toHaveBeenCalledWith( expect.any(String), expect.objectContaining({ pageLanguageSetToWelsh: expectedValue }) ) }) }) const getMockRequest = (i18nValues, referer, analytics, payload, csrfToken = 'token') => { const { catalog, locales, locale } = { catalog: {}, locales: [], locale: '', ...i18nValues } return { i18n: { getCatalog: () => catalog, getLocales: () => locales, getLocale: () => locale }, payload, url: { search: '' }, headers: { referer }, cache: jest.fn(() => ({ helpers: { analytics: { get: jest.fn().mockResolvedValue(analytics) } } })), server: { plugins: { crumb: { generate: jest.fn().mockResolvedValue(csrfToken) } } } } } const getMockToolkit = () => ({ view: jest.fn() }) })