227 lines
6.9 KiB
JavaScript
227 lines
6.9 KiB
JavaScript
import {
|
|
InitializationHelpers,
|
|
generatePortalBgColor,
|
|
generatePortalBg,
|
|
generateGradientToBottom,
|
|
setPortalStyles,
|
|
setPortalClass,
|
|
updateThemeStyles,
|
|
} from '../portalHelpers';
|
|
|
|
describe('#navigateToLocalePage', () => {
|
|
it('returns correct cookie name', () => {
|
|
const elemDiv = document.createElement('div');
|
|
elemDiv.classList.add('locale-switcher');
|
|
document.body.appendChild(elemDiv);
|
|
|
|
const allLocaleSwitcher = document.querySelector('.locale-switcher');
|
|
|
|
allLocaleSwitcher.addEventListener = jest
|
|
.fn()
|
|
.mockImplementationOnce((event, callback) => {
|
|
callback({ target: { value: 1 } });
|
|
});
|
|
|
|
InitializationHelpers.navigateToLocalePage();
|
|
expect(allLocaleSwitcher.addEventListener).toBeCalledWith(
|
|
'change',
|
|
expect.any(Function)
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('Theme Functions', () => {
|
|
describe('#generatePortalBgColor', () => {
|
|
it('returns mixed color for dark theme', () => {
|
|
const result = generatePortalBgColor('#FF5733', 'dark');
|
|
expect(result).toBe('color-mix(in srgb, #FF5733 20%, black)');
|
|
});
|
|
|
|
it('returns mixed color for light theme', () => {
|
|
const result = generatePortalBgColor('#FF5733', 'light');
|
|
expect(result).toBe('color-mix(in srgb, #FF5733 20%, white)');
|
|
});
|
|
});
|
|
|
|
describe('#generatePortalBg', () => {
|
|
it('returns background for dark theme', () => {
|
|
const result = generatePortalBg('#FF5733', 'dark');
|
|
expect(result).toBe(
|
|
'background: url(/assets/images/hc/hexagon-dark.svg) color-mix(in srgb, #FF5733 20%, black)'
|
|
);
|
|
});
|
|
|
|
it('returns background for light theme', () => {
|
|
const result = generatePortalBg('#FF5733', 'light');
|
|
expect(result).toBe(
|
|
'background: url(/assets/images/hc/hexagon-light.svg) color-mix(in srgb, #FF5733 20%, white)'
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('#generateGradientToBottom', () => {
|
|
it('returns gradient for dark theme', () => {
|
|
const result = generateGradientToBottom('dark');
|
|
expect(result).toBe(
|
|
'background-image: linear-gradient(to bottom, transparent, #151718)'
|
|
);
|
|
});
|
|
|
|
it('returns gradient for light theme', () => {
|
|
const result = generateGradientToBottom('light');
|
|
expect(result).toBe(
|
|
'background-image: linear-gradient(to bottom, transparent, white)'
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('#setPortalStyles', () => {
|
|
let mockPortalBgDiv;
|
|
let mockPortalBgGradientDiv;
|
|
|
|
beforeEach(() => {
|
|
// Mocking portal background div
|
|
mockPortalBgDiv = document.createElement('div');
|
|
mockPortalBgDiv.id = 'portal-bg';
|
|
document.body.appendChild(mockPortalBgDiv);
|
|
|
|
// Mocking portal background gradient div
|
|
mockPortalBgGradientDiv = document.createElement('div');
|
|
mockPortalBgGradientDiv.id = 'portal-bg-gradient';
|
|
document.body.appendChild(mockPortalBgGradientDiv);
|
|
});
|
|
|
|
afterEach(() => {
|
|
document.body.innerHTML = '';
|
|
});
|
|
|
|
it('sets styles for portal background based on theme', () => {
|
|
window.portalConfig = { portalColor: '#FF5733' };
|
|
|
|
setPortalStyles('dark');
|
|
const expectedPortalBgStyle =
|
|
'background: url(/assets/images/hc/hexagon-dark.svg) color-mix(in srgb, #FF5733 20%, black)';
|
|
const expectedGradientStyle =
|
|
'background-image: linear-gradient(to bottom, transparent, #151718)';
|
|
|
|
expect(mockPortalBgDiv.getAttribute('style')).toBe(expectedPortalBgStyle);
|
|
expect(mockPortalBgGradientDiv.getAttribute('style')).toBe(
|
|
expectedGradientStyle
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('#setPortalClass', () => {
|
|
let mockPortalDiv;
|
|
|
|
beforeEach(() => {
|
|
// Mocking portal div
|
|
mockPortalDiv = document.createElement('div');
|
|
mockPortalDiv.id = 'portal';
|
|
mockPortalDiv.classList.add('light');
|
|
document.body.appendChild(mockPortalDiv);
|
|
});
|
|
|
|
afterEach(() => {
|
|
document.body.innerHTML = '';
|
|
});
|
|
|
|
it('sets portal class based on theme', () => {
|
|
setPortalClass('dark');
|
|
|
|
expect(mockPortalDiv.classList.contains('dark')).toBe(true);
|
|
expect(mockPortalDiv.classList.contains('light')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('#updateThemeStyles', () => {
|
|
let mockPortalDiv;
|
|
let mockPortalBgDiv;
|
|
let mockPortalBgGradientDiv;
|
|
|
|
beforeEach(() => {
|
|
// Mocking portal div
|
|
mockPortalDiv = document.createElement('div');
|
|
mockPortalDiv.id = 'portal';
|
|
document.body.appendChild(mockPortalDiv);
|
|
|
|
// Mocking portal background div
|
|
mockPortalBgDiv = document.createElement('div');
|
|
mockPortalBgDiv.id = 'portal-bg';
|
|
document.body.appendChild(mockPortalBgDiv);
|
|
|
|
// Mocking portal background gradient div
|
|
mockPortalBgGradientDiv = document.createElement('div');
|
|
mockPortalBgGradientDiv.id = 'portal-bg-gradient';
|
|
document.body.appendChild(mockPortalBgGradientDiv);
|
|
});
|
|
|
|
afterEach(() => {
|
|
document.body.innerHTML = '';
|
|
});
|
|
|
|
it('updates theme styles based on theme', () => {
|
|
window.portalConfig = { portalColor: '#FF5733' };
|
|
|
|
updateThemeStyles('dark');
|
|
|
|
const expectedPortalBgStyle =
|
|
'background: url(/assets/images/hc/hexagon-dark.svg) color-mix(in srgb, #FF5733 20%, black)';
|
|
const expectedGradientStyle =
|
|
'background-image: linear-gradient(to bottom, transparent, #151718)';
|
|
|
|
expect(mockPortalDiv.classList.contains('dark')).toBe(true);
|
|
expect(mockPortalBgDiv.getAttribute('style')).toBe(expectedPortalBgStyle);
|
|
expect(mockPortalBgGradientDiv.getAttribute('style')).toBe(
|
|
expectedGradientStyle
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('#initializeTheme', () => {
|
|
let mockPortalDiv;
|
|
|
|
beforeEach(() => {
|
|
mockPortalDiv = document.createElement('div');
|
|
mockPortalDiv.id = 'portal';
|
|
document.body.appendChild(mockPortalDiv);
|
|
});
|
|
|
|
afterEach(() => {
|
|
document.body.innerHTML = '';
|
|
});
|
|
|
|
it('updates theme based on system preferences', () => {
|
|
const mediaQueryList = {
|
|
matches: true,
|
|
addEventListener: jest.fn(),
|
|
};
|
|
window.matchMedia = jest.fn().mockReturnValue(mediaQueryList);
|
|
window.portalConfig = { theme: 'system' };
|
|
|
|
InitializationHelpers.initializeTheme();
|
|
|
|
expect(mediaQueryList.addEventListener).toBeCalledWith(
|
|
'change',
|
|
expect.any(Function)
|
|
);
|
|
expect(mockPortalDiv.classList.contains('dark')).toBe(true);
|
|
});
|
|
|
|
it('does not update theme if themeFromServer is not "system"', () => {
|
|
const mediaQueryList = {
|
|
matches: true,
|
|
addEventListener: jest.fn(),
|
|
};
|
|
window.matchMedia = jest.fn().mockReturnValue(mediaQueryList);
|
|
window.portalConfig = { theme: 'dark' };
|
|
|
|
InitializationHelpers.initializeTheme();
|
|
|
|
expect(mediaQueryList.addEventListener).not.toBeCalled();
|
|
expect(mockPortalDiv.classList.contains('dark')).toBe(false);
|
|
expect(mockPortalDiv.classList.contains('light')).toBe(false);
|
|
});
|
|
});
|
|
});
|