test: mock broadcast channel

Signed-off-by: Camila Belo <camilaibs@gmail.com>
This commit is contained in:
Camila Belo
2024-03-12 09:40:32 +01:00
parent 43bf40c812
commit ed1c0d2039
4 changed files with 55 additions and 3 deletions
@@ -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<typeof techdocsStorageApiRef.T> = {
@@ -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<any>): 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]);
+25
View File
@@ -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(),
};
});