import { expect, it, jest, describe, afterEach } from '@jest/globals'; import { _createAlertBanner, UserError, FetchError, ErrorCode } from '../../src/exceptions'; describe('Test _createAlertBanner', () => { afterEach(() => { // Ensure we always have a clean body document.body.innerHTML = `
Hello World
`; }); it("error level shouldn't contain close button", async () => { _createAlertBanner('Something went wrong!', 'error'); const banner = document.getElementsByClassName('alert-banner'); const closeButton = document.getElementById('alert-close-button'); expect(banner.length).toBe(1); expect(banner[0].innerHTML).toBe('Something went wrong!'); expect(closeButton).toBeNull(); }); it('warning level should contain close button', async () => { _createAlertBanner('This is a warning', 'warning'); const banner = document.getElementsByClassName('alert-banner'); const closeButton = document.getElementById('alert-close-button'); expect(banner.length).toBe(1); expect(banner[0].innerHTML).toContain('This is a warning'); expect(closeButton).not.toBeNull(); }); it('error level banner should log to console', async () => { const logSpy = jest.spyOn(console, 'error'); _createAlertBanner('Something went wrong!'); expect(logSpy).toHaveBeenCalledWith('Something went wrong!'); }); it('warning level banner should log to console', async () => { const logSpy = jest.spyOn(console, 'warn'); _createAlertBanner('This warning', 'warning'); expect(logSpy).toHaveBeenCalledWith('This warning'); }); it('close button should remove element from page', async () => { let banner = document.getElementsByClassName('alert-banner'); expect(banner.length).toBe(0); _createAlertBanner('Warning!', 'warning'); // Just a sanity check banner = document.getElementsByClassName('alert-banner'); expect(banner.length).toBe(1); const closeButton = document.getElementById('alert-close-button'); if (closeButton) { closeButton.click(); // Confirm that clicking the close button, removes the element banner = document.getElementsByClassName('alert-banner'); expect(banner.length).toBe(0); } else { fail('Unable to find close button on the page, but should exist'); } }); it("toggling logging off on error alert shouldn't log to console", async () => { const errorLogSpy = jest.spyOn(console, 'error'); _createAlertBanner('Test error', 'error', 'text', false); expect(errorLogSpy).not.toHaveBeenCalledWith('Test error'); }); it("toggling logging off on warning alert shouldn't log to console", async () => { const warnLogSpy = jest.spyOn(console, 'warn'); _createAlertBanner('Test warning', 'warning', 'text', false); expect(warnLogSpy).not.toHaveBeenCalledWith('Test warning'); }); it('_createAlertbanner messageType text writes message to content', async () => { let banner = document.getElementsByClassName('alert-banner'); expect(banner.length).toBe(0); const message = '

Test message

'; _createAlertBanner(message, 'error', 'text'); banner = document.getElementsByClassName('alert-banner'); expect(banner.length).toBe(1); expect(banner[0].innerHTML).toBe('<p>Test message</p>'); expect(banner[0].textContent).toBe(message); }); it('_createAlertbanner messageType html writes message to innerHTML', async () => { let banner = document.getElementsByClassName('alert-banner'); expect(banner.length).toBe(0); const message = '

Test message

'; _createAlertBanner(message, 'error', 'html'); banner = document.getElementsByClassName('alert-banner'); expect(banner.length).toBe(1); expect(banner[0].innerHTML).toBe(message); expect(banner[0].textContent).toBe('Test message'); }); }); describe('Test Exceptions', () => { it('UserError contains errorCode and shows in message', async () => { const errorCode = ErrorCode.BAD_CONFIG; const message = 'Test error'; const userError = new UserError(ErrorCode.BAD_CONFIG, message); expect(userError.errorCode).toBe(errorCode); expect(userError.message).toBe(`(${errorCode}): ${message}`); }); it('FetchError contains errorCode and shows in message', async () => { const errorCode = ErrorCode.FETCH_NOT_FOUND_ERROR; const message = 'Test error'; const fetchError = new FetchError(errorCode, message); expect(fetchError.errorCode).toBe(errorCode); expect(fetchError.message).toBe(`(${errorCode}): ${message}`); }); });