diff --git a/frontend/src/utils/alerts/alerts.spec.js b/frontend/src/utils/alerts/alerts.spec.js index c823488c6..0b4749e97 100644 --- a/frontend/src/utils/alerts/alerts.spec.js +++ b/frontend/src/utils/alerts/alerts.spec.js @@ -18,4 +18,10 @@ describe('Alerts', () => { it('should create', () => { expect(alerts).toBeTruthy(); }); + + it('should throw if called without an element', () => { + expect(() => { + new Alerts(); + }).toThrow(); + }); }); diff --git a/frontend/src/utils/asidenav/asidenav.js b/frontend/src/utils/asidenav/asidenav.js index 3b5c048ff..2964e1617 100644 --- a/frontend/src/utils/asidenav/asidenav.js +++ b/frontend/src/utils/asidenav/asidenav.js @@ -42,11 +42,13 @@ export class Asidenav { _initFavoritesButton() { const favoritesBtn = document.querySelector('.' + FAVORITES_BTN_CLASS); - favoritesBtn.addEventListener('click', (event) => { - favoritesBtn.classList.toggle(FAVORITES_BTN_ACTIVE_CLASS); - this._element.classList.toggle(ASIDENAV_EXPANDED_CLASS); - event.preventDefault(); - }, true); + if (favoritesBtn) { + favoritesBtn.addEventListener('click', (event) => { + favoritesBtn.classList.toggle(FAVORITES_BTN_ACTIVE_CLASS); + this._element.classList.toggle(ASIDENAV_EXPANDED_CLASS); + event.preventDefault(); + }, true); + } } _initAsidenavSubmenus() { diff --git a/frontend/src/utils/asidenav/asidenav.spec.js b/frontend/src/utils/asidenav/asidenav.spec.js new file mode 100644 index 000000000..bdc7aee68 --- /dev/null +++ b/frontend/src/utils/asidenav/asidenav.spec.js @@ -0,0 +1,21 @@ +import { Asidenav } from './asidenav'; + +describe('Asidenav', () => { + + let asidenav; + + beforeEach(() => { + const element = document.createElement('div'); + asidenav = new Asidenav(element); + }); + + it('should create', () => { + expect(asidenav).toBeTruthy(); + }); + + it('should throw if called without an element', () => { + expect(() => { + new Asidenav(); + }).toThrow(); + }); +}); diff --git a/frontend/src/utils/async-form/async-form.spec.js b/frontend/src/utils/async-form/async-form.spec.js new file mode 100644 index 000000000..f01280b8a --- /dev/null +++ b/frontend/src/utils/async-form/async-form.spec.js @@ -0,0 +1,21 @@ +import { AsyncForm } from './async-form'; + +describe('AsyncForm', () => { + + let asyncForm; + + beforeEach(() => { + const element = document.createElement('div'); + asyncForm = new AsyncForm(element); + }); + + it('should create', () => { + expect(asyncForm).toBeTruthy(); + }); + + it('should throw if called without an element', () => { + expect(() => { + new AsyncForm(); + }).toThrow(); + }); +}); diff --git a/frontend/src/utils/async-table/async-table.js b/frontend/src/utils/async-table/async-table.js index f32f8df33..32e0abab4 100644 --- a/frontend/src/utils/async-table/async-table.js +++ b/frontend/src/utils/async-table/async-table.js @@ -44,6 +44,10 @@ export class AsyncTable { throw new Error('Async Table utility cannot be setup without an element!'); } + if (!app) { + throw new Error('Async Table utility cannot be setup without an app!'); + } + this._element = element; this._app = app; @@ -56,7 +60,12 @@ export class AsyncTable { this._asyncTableHeader = this._element.dataset.asyncTableDbHeader; } - const rawTableId = this._element.querySelector('table').id; + const table = this._element.querySelector('table'); + if (!table) { + throw new Error('Async Table utility needs a