From ed1c0d203928f978acf6d3bd71ffe870ccaa1f08 Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Tue, 12 Mar 2024 09:40:32 +0100 Subject: [PATCH] test: mock broadcast channel Signed-off-by: Camila Belo --- .../src/setupTests.ts | 25 +++++++++++++++++++ .../TechDocsReaderPage.test.tsx | 4 +-- .../TechDocsReaderPage/TechDocsReaderPage.tsx | 4 ++- plugins/techdocs/src/setupTests.ts | 25 +++++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/plugins/techdocs-module-addons-contrib/src/setupTests.ts b/plugins/techdocs-module-addons-contrib/src/setupTests.ts index 56b9b18321..228079bc19 100644 --- a/plugins/techdocs-module-addons-contrib/src/setupTests.ts +++ b/plugins/techdocs-module-addons-contrib/src/setupTests.ts @@ -16,3 +16,28 @@ import '@testing-library/jest-dom'; Element.prototype.scrollIntoView = jest.fn(); + +type Listener = (event: { data: any }) => void; + +global.BroadcastChannel = jest + .fn() + .mockImplementation((_channelName: string) => { + let listeners: Listener[] = []; + return { + postMessage: jest.fn((message: any) => { + // Simulate message event for all listeners + listeners.forEach(listener => listener({ data: message })); + }), + addEventListener: jest.fn((event: string, listener: Listener) => { + if (event === 'message') { + listeners.push(listener); + } + }), + removeEventListener: jest.fn((event: string, listener: Listener) => { + if (event === 'message') { + listeners = listeners.filter(l => l !== listener); + } + }), + close: jest.fn(), + }; + }); diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx index feebb0d9d4..8a8261cd42 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.test.tsx @@ -59,12 +59,12 @@ const mockTechDocsMetadata = { const getEntityMetadata = jest.fn(); const getTechDocsMetadata = jest.fn(); -const issueUserCookie = jest.fn(); +const getCookie = jest.fn(); const techdocsApiMock = { getEntityMetadata, getTechDocsMetadata, - issueUserCookie, + getCookie, }; const techdocsStorageApiMock: jest.Mocked = { diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx index 197bf15de7..5259a09bac 100644 --- a/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsReaderPage/TechDocsReaderPage.tsx @@ -181,15 +181,17 @@ function TechDocsAuthProvider({ children }: { children: ReactNode }) { if (!value) return () => {}; channel.postMessage({ action: 'COOKIE_REFRESHED', payload: value }); let stopCookieRefresh = startCookieRefresh(value.expiresAt); - channel.onmessage = event => { + const handleMessage = (event: MessageEvent): void => { const { action, payload } = event.data; if (action === 'COOKIE_REFRESHED') { stopCookieRefresh(); stopCookieRefresh = startCookieRefresh(payload.expiresAt); } }; + channel.addEventListener('message', handleMessage); return () => { stopCookieRefresh(); + channel.removeEventListener('message', handleMessage); }; }, [value, channel, startCookieRefresh]); diff --git a/plugins/techdocs/src/setupTests.ts b/plugins/techdocs/src/setupTests.ts index 6c7fc2d3e3..0bdcc73ccb 100644 --- a/plugins/techdocs/src/setupTests.ts +++ b/plugins/techdocs/src/setupTests.ts @@ -17,3 +17,28 @@ import '@testing-library/jest-dom'; Element.prototype.scrollIntoView = jest.fn(); + +type Listener = (event: { data: any }) => void; + +global.BroadcastChannel = jest + .fn() + .mockImplementation((_channelName: string) => { + let listeners: Listener[] = []; + return { + postMessage: jest.fn((message: any) => { + // Simulate message event for all listeners + listeners.forEach(listener => listener({ data: message })); + }), + addEventListener: jest.fn((event: string, listener: Listener) => { + if (event === 'message') { + listeners.push(listener); + } + }), + removeEventListener: jest.fn((event: string, listener: Listener) => { + if (event === 'message') { + listeners = listeners.filter(l => l !== listener); + } + }), + close: jest.fn(), + }; + });