From 290af250fc5c81f31094a1858061254b6ca7d8b2 Mon Sep 17 00:00:00 2001 From: Patrick Cartlidge Date: Thu, 19 Sep 2024 16:24:57 +0100 Subject: [PATCH] `checkSupport` now `static` and `protected` `checkSupport` of `GOVUKFrontend` can be overloaded by classes that extend it. Added tests for `createAll` when `checkSupport` has been overloaded. --- .../src/govuk/govuk-frontend-component.mjs | 3 +- .../src/govuk/init.jsdom.test.mjs | 47 ++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/govuk-frontend/src/govuk/govuk-frontend-component.mjs b/packages/govuk-frontend/src/govuk/govuk-frontend-component.mjs index 7f0cd7ffdd..99b86c4b72 100644 --- a/packages/govuk-frontend/src/govuk/govuk-frontend-component.mjs +++ b/packages/govuk-frontend/src/govuk/govuk-frontend-component.mjs @@ -49,7 +49,8 @@ export class GOVUKFrontendComponent { /** * Validates whether components are supported * - * @private + * @protected + * @static * @throws {SupportError} when the components are not supported */ checkSupport() { diff --git a/packages/govuk-frontend/src/govuk/init.jsdom.test.mjs b/packages/govuk-frontend/src/govuk/init.jsdom.test.mjs index 58462f9458..00645a7f11 100644 --- a/packages/govuk-frontend/src/govuk/init.jsdom.test.mjs +++ b/packages/govuk-frontend/src/govuk/init.jsdom.test.mjs @@ -4,6 +4,7 @@ import { } from '@govuk-frontend/lib/names' import * as GOVUKFrontend from './all.mjs' +import { GOVUKFrontendComponent } from './govuk-frontend-component.mjs' import { initAll, createAll } from './init.mjs' // Annoyingly these don't get hoisted if done in a loop @@ -226,8 +227,9 @@ describe('createAll', () => { document.body.outerHTML = '' }) - class MockComponent { + class MockComponent extends GOVUKFrontendComponent { constructor(...args) { + super(...args) this.args = args } @@ -292,6 +294,49 @@ describe('createAll', () => { ) }) + it('executes overloaded checkSupport of component', () => { + const componentRoot = document.createElement('div') + componentRoot.setAttribute('data-module', 'mock-component') + document.body.appendChild(componentRoot) + + const checkSupportMock = jest.fn(() => {}) + + class MockComponentWithCheckSupport extends MockComponent { + checkSupport() { + checkSupportMock() + } + } + + const result = createAll(MockComponentWithCheckSupport) + + expect(checkSupportMock).toHaveBeenCalled() + expect(result).toStrictEqual([expect.any(MockComponent)]) + }) + + it('returns empty array if overloaded checkSupport of component throws error', () => { + const componentRoot = document.createElement('div') + componentRoot.setAttribute('data-module', 'mock-component') + document.body.appendChild(componentRoot) + + // Silence warnings in test output, and allow us to 'expect' them + jest.spyOn(global.console, 'log').mockImplementation() + + const checkSupportMock = jest.fn(() => { + throw Error('Mock error') + }) + + class MockComponentWithCheckSupport extends MockComponent { + checkSupport() { + checkSupportMock() + } + } + + const result = createAll(MockComponentWithCheckSupport) + expect(checkSupportMock).toHaveBeenCalled() + expect(result).toStrictEqual([]) + expect(global.console.log).toHaveBeenCalledWith(expect.any(Error)) + }) + it('returns an empty array if no matching components exist on the page', () => { const componentRoot = document.createElement('div') componentRoot.setAttribute(