daynitejs
Version:
A lightweight JavaScript library for toggling light and dark themes.
100 lines (91 loc) • 4 kB
JavaScript
/**
* Unit tests for storage utilities.
*/
globalThis.localStorageStore = {};
const originalLocalStorage = globalThis.localStorage;
globalThis.localStorage = {
getItem: (key) => globalThis.localStorageStore[key] || null,
setItem: (key, val) => { globalThis.localStorageStore[key] = val; },
removeItem: (key) => { delete globalThis.localStorageStore[key]; },
clear: () => { globalThis.localStorageStore = {}; }
};
describe('Storage Utils', () => {
afterEach(() => {
globalThis.localStorageStore = {};
globalThis.localStorage = {
getItem: (key) => globalThis.localStorageStore[key] || null,
setItem: (key, val) => { globalThis.localStorageStore[key] = val; },
removeItem: (key) => { delete globalThis.localStorageStore[key]; },
clear: () => { globalThis.localStorageStore = {}; }
};
delete require.cache[require.resolve('../src/utils/storage.js')];
});
afterAll(() => {
globalThis.localStorage = originalLocalStorage;
});
beforeEach(() => {
jest.resetModules();
globalThis.localStorageStore = {};
globalThis.localStorage = {
getItem: (key) => globalThis.localStorageStore[key] || null,
setItem: (key, val) => { globalThis.localStorageStore[key] = val; },
removeItem: (key) => { delete globalThis.localStorageStore[key]; },
clear: () => { globalThis.localStorageStore = {}; }
};
delete require.cache[require.resolve('../src/utils/storage.js')];
});
test('getStoredTheme retrieves theme', () => {
jest.setTimeout(10000);
globalThis.localStorage.setItem('DayniteJs-theme', 'dark');
const { getStoredTheme } = require('../src/utils/storage.js');
expect(getStoredTheme('DayniteJs-theme')).toBe('dark');
});
test('getStoredTheme handles localStorage error', () => {
jest.setTimeout(10000);
// Ensure no value is set in localStorageStore
globalThis.localStorageStore = {};
const consoleWarn = jest.spyOn(console, 'warn').mockImplementation();
// Mock error BEFORE requiring the module
globalThis.localStorage = {
getItem: () => { throw new Error('Storage error'); },
setItem: (key, val) => { globalThis.localStorageStore[key] = val; },
removeItem: (key) => { delete globalThis.localStorageStore[key]; },
clear: () => { globalThis.localStorageStore = {}; }
};
delete require.cache[require.resolve('../src/utils/storage.js')];
jest.resetModules();
// Double check store is empty
expect(globalThis.localStorageStore['DayniteJs-theme']).toBeUndefined();
const { getStoredTheme } = require('../src/utils/storage.js');
expect(getStoredTheme('DayniteJs-theme')).toBe(null);
expect(consoleWarn).toHaveBeenCalled();
consoleWarn.mockRestore();
});
test('storeTheme saves theme', () => {
jest.setTimeout(10000);
const { storeTheme } = require('../src/utils/storage.js');
storeTheme('DayniteJs-theme', 'dark');
expect(globalThis.localStorage.getItem('DayniteJs-theme')).toBe('dark');
});
test('storeTheme handles localStorage error', () => {
jest.setTimeout(10000);
// Ensure no value is set in localStorageStore
globalThis.localStorageStore = {};
delete require.cache[require.resolve('../src/utils/storage.js')];
jest.resetModules();
const consoleWarn = jest.spyOn(console, 'warn').mockImplementation();
// Mock error BEFORE requiring the module
globalThis.localStorage = {
getItem: (key) => globalThis.localStorageStore[key] || null,
setItem: () => { throw new Error('Storage error'); },
removeItem: (key) => { delete globalThis.localStorageStore[key]; },
clear: () => { globalThis.localStorageStore = {}; }
};
// Double check store is empty
expect(globalThis.localStorageStore['DayniteJs-theme']).toBeUndefined();
const { storeTheme } = require('../src/utils/storage.js');
storeTheme('DayniteJs-theme', 'dark');
expect(consoleWarn).toHaveBeenCalled();
consoleWarn.mockRestore();
});
});