| import Alert from '../../src/alert.js' |
| import { getTransitionDurationFromElement } from '../../src/util/index.js' |
| import { clearFixture, getFixture } 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 = '<div class="alert"></div>' |
| |
| 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 = [ |
| '<div class="alert">', |
| ' <button type="button" data-bs-dismiss="alert">x</button>', |
| '</div>' |
| ].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 = [ |
| '<div class="alert">', |
| ' <button type="button" data-bs-target=".alert" data-bs-dismiss="alert">x</button>', |
| '</div>' |
| ].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 = '<div class="alert"></div>' |
| |
| 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 = '<div class="alert fade"></div>' |
| |
| 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 = '<div class="alert"></div>' |
| |
| 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 = '<div class="alert"></div>' |
| |
| const alertEl = document.querySelector('.alert') |
| const alert = new Alert(alertEl) |
| |
| expect(Alert.getInstance(alertEl)).not.toBeNull() |
| |
| alert.dispose() |
| |
| expect(Alert.getInstance(alertEl)).toBeNull() |
| }) |
| }) |
| |
| describe('getInstance', () => { |
| it('should return alert instance', () => { |
| fixtureEl.innerHTML = '<div></div>' |
| |
| 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 = '<div></div>' |
| |
| const div = fixtureEl.querySelector('div') |
| |
| expect(Alert.getInstance(div)).toBeNull() |
| }) |
| }) |
| |
| describe('getOrCreateInstance', () => { |
| it('should return alert instance', () => { |
| fixtureEl.innerHTML = '<div></div>' |
| |
| 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 = '<div></div>' |
| |
| const div = fixtureEl.querySelector('div') |
| |
| expect(Alert.getInstance(div)).toBeNull() |
| expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert) |
| }) |
| }) |
| }) |