import Alert from '../../src/alert.js' import { getTransitionDurationFromElement } from '../../src/util/index.js' import { clearFixture, getFixture, jQueryMock } from '../helpers/fixture.js' describe('Alert', () => { let fixtureEl beforeAll(() => { fixtureEl = getFixture() }) afterEach(() => { clearFixture() }) it('should take care of element either passed as a CSS selector or DOM element', () => { fixtureEl.innerHTML = '
' const alertEl = fixtureEl.querySelector('.alert') const alertBySelector = new Alert('.alert') const alertByElement = new Alert(alertEl) expect(alertBySelector._element).toEqual(alertEl) expect(alertByElement._element).toEqual(alertEl) }) it('should return version', () => { expect(Alert.VERSION).toEqual(jasmine.any(String)) }) describe('DATA_KEY', () => { it('should return plugin data key', () => { expect(Alert.DATA_KEY).toEqual('bs.alert') }) }) describe('data-api', () => { it('should close an alert without instantiating it manually', () => { fixtureEl.innerHTML = [ '
', ' ', '
' ].join('') const button = document.querySelector('button') button.click() expect(document.querySelectorAll('.alert')).toHaveSize(0) }) it('should close an alert without instantiating it manually with the parent selector', () => { fixtureEl.innerHTML = [ '
', ' ', '
' ].join('') const button = document.querySelector('button') button.click() expect(document.querySelectorAll('.alert')).toHaveSize(0) }) }) describe('close', () => { it('should close an alert', () => { return new Promise(resolve => { const spy = jasmine.createSpy('spy', getTransitionDurationFromElement) fixtureEl.innerHTML = '
' const alertEl = document.querySelector('.alert') const alert = new Alert(alertEl) alertEl.addEventListener('closed.bs.alert', () => { expect(document.querySelectorAll('.alert')).toHaveSize(0) expect(spy).not.toHaveBeenCalled() resolve() }) alert.close() }) }) it('should close alert with fade class', () => { return new Promise(resolve => { fixtureEl.innerHTML = '
' const alertEl = document.querySelector('.alert') const alert = new Alert(alertEl) alertEl.addEventListener('transitionend', () => { expect().nothing() }) alertEl.addEventListener('closed.bs.alert', () => { expect(document.querySelectorAll('.alert')).toHaveSize(0) resolve() }) alert.close() }) }) it('should not remove alert if close event is prevented', () => { return new Promise((resolve, reject) => { fixtureEl.innerHTML = '
' const getAlert = () => document.querySelector('.alert') const alertEl = getAlert() const alert = new Alert(alertEl) alertEl.addEventListener('close.bs.alert', event => { event.preventDefault() setTimeout(() => { expect(getAlert()).not.toBeNull() resolve() }, 10) }) alertEl.addEventListener('closed.bs.alert', () => { reject(new Error('should not fire closed event')) }) alert.close() }) }) }) describe('dispose', () => { it('should dispose an alert', () => { fixtureEl.innerHTML = '
' const alertEl = document.querySelector('.alert') const alert = new Alert(alertEl) expect(Alert.getInstance(alertEl)).not.toBeNull() alert.dispose() expect(Alert.getInstance(alertEl)).toBeNull() }) }) describe('jQueryInterface', () => { it('should handle config passed and toggle existing alert', () => { fixtureEl.innerHTML = '
' const alertEl = fixtureEl.querySelector('.alert') const alert = new Alert(alertEl) const spy = spyOn(alert, 'close') jQueryMock.fn.alert = Alert.jQueryInterface jQueryMock.elements = [alertEl] jQueryMock.fn.alert.call(jQueryMock, 'close') expect(spy).toHaveBeenCalled() }) it('should create new alert instance and call close', () => { fixtureEl.innerHTML = '
' const alertEl = fixtureEl.querySelector('.alert') jQueryMock.fn.alert = Alert.jQueryInterface jQueryMock.elements = [alertEl] expect(Alert.getInstance(alertEl)).toBeNull() jQueryMock.fn.alert.call(jQueryMock, 'close') expect(fixtureEl.querySelector('.alert')).toBeNull() }) it('should just create an alert instance without calling close', () => { fixtureEl.innerHTML = '
' const alertEl = fixtureEl.querySelector('.alert') jQueryMock.fn.alert = Alert.jQueryInterface jQueryMock.elements = [alertEl] jQueryMock.fn.alert.call(jQueryMock) expect(Alert.getInstance(alertEl)).not.toBeNull() expect(fixtureEl.querySelector('.alert')).not.toBeNull() }) it('should throw an error on undefined method', () => { fixtureEl.innerHTML = '
' const div = fixtureEl.querySelector('div') const action = 'undefinedMethod' jQueryMock.fn.alert = Alert.jQueryInterface jQueryMock.elements = [div] expect(() => { jQueryMock.fn.alert.call(jQueryMock, action) }).toThrowError(TypeError, `No method named "${action}"`) }) it('should throw an error on protected method', () => { fixtureEl.innerHTML = '
' const div = fixtureEl.querySelector('div') const action = '_getConfig' jQueryMock.fn.alert = Alert.jQueryInterface jQueryMock.elements = [div] expect(() => { jQueryMock.fn.alert.call(jQueryMock, action) }).toThrowError(TypeError, `No method named "${action}"`) }) }) describe('getInstance', () => { it('should return alert instance', () => { fixtureEl.innerHTML = '
' const div = fixtureEl.querySelector('div') const alert = new Alert(div) expect(Alert.getInstance(div)).toEqual(alert) expect(Alert.getInstance(div)).toBeInstanceOf(Alert) }) it('should return null when there is no alert instance', () => { fixtureEl.innerHTML = '
' const div = fixtureEl.querySelector('div') expect(Alert.getInstance(div)).toBeNull() }) }) describe('getOrCreateInstance', () => { it('should return alert instance', () => { fixtureEl.innerHTML = '
' const div = fixtureEl.querySelector('div') const alert = new Alert(div) expect(Alert.getOrCreateInstance(div)).toEqual(alert) expect(Alert.getInstance(div)).toEqual(Alert.getOrCreateInstance(div, {})) expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert) }) it('should return new instance when there is no alert instance', () => { fixtureEl.innerHTML = '
' const div = fixtureEl.querySelector('div') expect(Alert.getInstance(div)).toBeNull() expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert) }) }) })