From 0d50a43edf4b495b0666bba7e331b6af22aac66d Mon Sep 17 00:00:00 2001 From: Felix Hamann Date: Mon, 3 Jun 2019 14:01:51 +0200 Subject: [PATCH] add rudimentary unit tests for some fe utilities --- frontend/src/utils/alerts/alerts.spec.js | 6 +++ frontend/src/utils/asidenav/asidenav.js | 12 +++-- frontend/src/utils/asidenav/asidenav.spec.js | 21 ++++++++ .../src/utils/async-form/async-form.spec.js | 21 ++++++++ frontend/src/utils/async-table/async-table.js | 11 +++- .../src/utils/async-table/async-table.spec.js | 52 +++++++++++++++++++ frontend/src/utils/check-all/check-all.js | 4 +- .../src/utils/check-all/check-all.spec.js | 27 ++++++++++ 8 files changed, 146 insertions(+), 8 deletions(-) create mode 100644 frontend/src/utils/asidenav/asidenav.spec.js create mode 100644 frontend/src/utils/async-form/async-form.spec.js create mode 100644 frontend/src/utils/async-table/async-table.spec.js create mode 100644 frontend/src/utils/check-all/check-all.spec.js 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 in its element!'); + } + + const rawTableId = table.id; this._cssIdPrefix = findCssIdPrefix(rawTableId); this._asyncTableId = rawTableId.replace(this._cssIdPrefix, ''); diff --git a/frontend/src/utils/async-table/async-table.spec.js b/frontend/src/utils/async-table/async-table.spec.js new file mode 100644 index 000000000..7dc36be0c --- /dev/null +++ b/frontend/src/utils/async-table/async-table.spec.js @@ -0,0 +1,52 @@ +import { AsyncTable } from './async-table'; + +const AppTestMock = { + httpClient: { + get: () => {}, + }, + htmlHelpers: { + parseResponse: () => {}, + }, + utilRegistry: { + setupAll: () => {}, + }, +}; + +describe('AsyncTable', () => { + + let asyncTable; + + beforeEach(() => { + const element = document.createElement('div'); + const scrollTable = document.createElement('div'); + const table = document.createElement('table'); + scrollTable.classList.add('scrolltable'); + scrollTable.appendChild(table); + element.appendChild(scrollTable); + asyncTable = new AsyncTable(element, AppTestMock); + }); + + it('should create', () => { + expect(asyncTable).toBeTruthy(); + }); + + it('should throw if element does not contain a .scrolltable', () => { + const element = document.createElement('div'); + expect(() => { + new AsyncTable(element, AppTestMock); + }).toThrow(); + }); + + it('should throw if element does not contain a table', () => { + const element = document.createElement('div'); + expect(() => { + new AsyncTable(element, AppTestMock); + }).toThrow(); + }); + + it('should throw if called without an element', () => { + expect(() => { + new AsyncTable(); + }).toThrow(); + }); +}); diff --git a/frontend/src/utils/check-all/check-all.js b/frontend/src/utils/check-all/check-all.js index c75ce2c1f..46194c029 100644 --- a/frontend/src/utils/check-all/check-all.js +++ b/frontend/src/utils/check-all/check-all.js @@ -92,8 +92,8 @@ export class CheckAll { this._checkAllCheckbox.setAttribute('id', this._getCheckboxId()); th.insertBefore(this._checkAllCheckbox, th.firstChild); - // manually set up new checkbox - this._app.utilRegistry.setup(this._app.utilRegistry.find('checkbox'), th); + // set up new checkbox + this._app.utilRegistry.setupAll(th); this._checkAllCheckbox.addEventListener('input', this._onCheckAllCheckboxInput); this._setupCheckboxListeners(); diff --git a/frontend/src/utils/check-all/check-all.spec.js b/frontend/src/utils/check-all/check-all.spec.js new file mode 100644 index 000000000..a04e50c41 --- /dev/null +++ b/frontend/src/utils/check-all/check-all.spec.js @@ -0,0 +1,27 @@ +import { CheckAll } from './check-all'; + +const MOCK_APP = { + utilRegistry: { + setupAll: () => {}, + }, +}; + +describe('CheckAll', () => { + + let checkAll; + + beforeEach(() => { + const element = document.createElement('div'); + checkAll = new CheckAll(element, MOCK_APP); + }); + + it('should create', () => { + expect(checkAll).toBeTruthy(); + }); + + it('should throw if called without an element', () => { + expect(() => { + new CheckAll(); + }).toThrow(); + }); +});