class LoadingPage { static elementId = 'global-loading'; static visibleClass = 'loading-visible'; createElement({ className = '' }: { className?: string } = {}) { const div = document.createElement('div'); div.setAttribute('id', LoadingPage.elementId); div.setAttribute('class', ['global-loading', className].join(' ')); document.body.appendChild(div); } get element() { return document.getElementById(LoadingPage.elementId)!; } } describe('[ajax-handlers] loader', () => { const loadingPage = new LoadingPage(); let loader: { show: Function; hide: Function }; beforeAll(() => jest.useFakeTimers()); afterEach(() => { loadingPage.element.remove(); }); const subject = () => { jest.isolateModules(() => { loader = require('../loader').loader; }); }; test('creates loading element', () => { subject(); expect(loadingPage.element).not.toBeNull(); }); test('show() shows the loading element', () => { subject(); loader.show(); expect(loadingPage.element.className).toContain(LoadingPage.visibleClass); }); describe('when loading element is showing', () => { beforeEach(() => { subject(); loader.show(); jest.runAllTimers(); }); describe('hide()', () => { beforeEach(() => loader.hide()); test('hides the loading element', () => { expect(loadingPage.element.className).not.toContain(LoadingPage.visibleClass); }); describe('when element is done hiding', () => { beforeEach(() => jest.runAllTimers()); test("resets the element's style", () => { expect(loadingPage.element.style).toMatchObject({ display: '', opacity: '', transition: '', }); }); }); }); }); describe('when loading element already exists with "dots" class', () => { beforeEach(() => loadingPage.createElement({ className: 'dots' })); test('adds to element', () => { subject(); expect(document.querySelector(`#${LoadingPage.elementId} > span.s1`)?.textContent).toBe( '\u25AA' ); }); }); describe('when loading element already exists with "boxes" class', () => { beforeEach(() => loadingPage.createElement({ className: 'boxes' })); test('adds to element', () => { subject(); expect(document.querySelector(`#${LoadingPage.elementId} > span.h`)).not.toBeNull(); }); }); });