import { jest } from '@jest/globals';
import { act, renderHook } from '@testing-library/react';
import Cookies from 'js-cookie';
import React from 'react';
import config from './examples/config';
import { Provider } from './TrackingManagerContext';
import { Region } from './types';
jest.mock('js-cookie', () => ({
__esModule: true,
default: {
get: jest.fn(),
set: jest.fn(),
remove: jest.fn(),
},
}));
describe('CookieContext', () => {
const log = jest.fn();
let shadowMode = false;
const region = Region.DEFAULT;
const cookies = {
some_cookie: JSON.stringify('value1'),
locale: JSON.stringify('value3'),
cgl_prog: JSON.stringify('value5'),
cm_default_preferences: JSON.stringify({
region: Region.DEFAULT,
consent: ['performance'],
}),
};
let onPreferenceChange: jest.Mock;
const renderFormHook = () =>
renderHook(() => {}, {
wrapper: ({ children }: { children: React.ReactNode }) => (
{children}
),
});
beforeEach(() => {
onPreferenceChange = jest.fn();
});
it('removes the right cookies on mount', async () => {
const remove = jest.fn();
const mockGet = Cookies.get as jest.MockedFunction;
const mockRemove = Cookies.remove as jest.MockedFunction;
// @ts-expect-error: Mocking Cookies.get
mockGet.mockImplementation(jest.fn(() => cookies));
mockRemove.mockImplementation(remove);
const { rerender } = renderFormHook();
expect(remove).toHaveBeenCalledTimes(2);
['cgl_prog'].forEach((cookie) => {
expect(remove).toHaveBeenCalledWith(cookie, { domain: 'localhost', path: '/' });
});
act(() => {
rerender();
});
expect(remove).toHaveBeenCalledTimes(2);
expect(onPreferenceChange).toHaveBeenCalledTimes(1);
});
it('does not remove cookies in shadow mode', async () => {
const remove = jest.fn();
shadowMode = true;
const mockGet = Cookies.get as jest.MockedFunction;
const mockRemove = Cookies.remove as jest.MockedFunction;
// @ts-expect-error: Mocking Cookies.get
mockGet.mockImplementation(jest.fn(() => cookies));
mockRemove.mockImplementation(remove);
const { rerender } = renderFormHook();
expect(remove).not.toHaveBeenCalled();
expect(log).toHaveBeenCalledWith('Cookie does not have consent and will be removed', {
cookie: 'cgl_prog',
});
act(() => {
rerender();
});
expect(remove).not.toHaveBeenCalled();
expect(onPreferenceChange).toHaveBeenCalledTimes(1);
});
});