test: add test suite for anatole-theme-switcher.js
- Install jest and jest-environment-jsdom
- Add conditional exports to `assets/js/anatole-theme-switcher.js`
- Add integration test mimicking click toggling for switchTheme
Co-authored-by: KarelZe <12801659+KarelZe@users.noreply.github.com>
3 files modified
1 files added
| | |
| | | } else { |
| | | setLightTheme(); |
| | | } |
| | | |
| | | if (typeof module !== 'undefined' && module.exports) { |
| | | module.exports = { switchTheme }; |
| | | } |
| New file |
| | |
| | | /** |
| | | * @jest-environment jsdom |
| | | */ |
| | | |
| | | describe('theme switcher', () => { |
| | | beforeEach(() => { |
| | | document.documentElement.className = ''; |
| | | document.body.innerHTML = '<div class="themeswitch"></div>'; |
| | | |
| | | window.matchMedia = jest.fn().mockImplementation(query => ({ |
| | | matches: false, |
| | | media: query, |
| | | onchange: null, |
| | | addListener: jest.fn(), |
| | | removeListener: jest.fn(), |
| | | addEventListener: jest.fn(), |
| | | removeEventListener: jest.fn(), |
| | | dispatchEvent: jest.fn(), |
| | | })); |
| | | |
| | | const localStorageMock = (function() { |
| | | let store = {}; |
| | | return { |
| | | getItem(key) { return store[key] || null; }, |
| | | setItem(key, value) { store[key] = value.toString(); }, |
| | | clear() { store = {}; } |
| | | }; |
| | | })(); |
| | | Object.defineProperty(window, 'localStorage', { |
| | | value: localStorageMock, |
| | | writable: true |
| | | }); |
| | | }); |
| | | |
| | | afterEach(() => { |
| | | jest.resetModules(); |
| | | }); |
| | | |
| | | it('should toggle theme on click', () => { |
| | | require('./anatole-theme-switcher.js'); |
| | | |
| | | const event = document.createEvent('Event'); |
| | | event.initEvent('DOMContentLoaded', true, true); |
| | | window.document.dispatchEvent(event); |
| | | |
| | | const themeSwitcher = document.querySelector('.themeswitch'); |
| | | |
| | | themeSwitcher.dispatchEvent(new Event('click')); |
| | | expect(window.localStorage.getItem('theme')).toBe('dark'); |
| | | expect(document.documentElement.classList.contains('theme--dark')).toBe(true); |
| | | |
| | | themeSwitcher.dispatchEvent(new Event('click')); |
| | | expect(window.localStorage.getItem('theme')).toBe('light'); |
| | | expect(document.documentElement.classList.contains('theme--light')).toBe(true); |
| | | }); |
| | | }); |
| | |
| | | "prepare": "husky", |
| | | "release": "release-it", |
| | | "setup": "npm install && npm run prepare", |
| | | "test": "" |
| | | "test": "jest" |
| | | }, |
| | | "repository": { |
| | | "type": "git", |
| | |
| | | "@release-it/conventional-changelog": "^11.0.1", |
| | | "conventional-commits-filter": "^6.0.1", |
| | | "husky": "^9.1.7", |
| | | "jest": "^30.5.2", |
| | | "jest-environment-jsdom": "^30.5.2", |
| | | "prettier": "^3.8.1", |
| | | "prettier-plugin-go-template": "^0.0.15", |
| | | "release-it": "^20.2.1", |