| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- import Backdrop from '../../../src/util/backdrop.js'
- import { getTransitionDurationFromElement } from '../../../src/util/index.js'
- import { clearFixture, getFixture } from '../../helpers/fixture.js'
- const CLASS_BACKDROP = '.modal-backdrop'
- const CLASS_NAME_FADE = 'fade'
- const CLASS_NAME_SHOW = 'show'
- describe('Backdrop', () => {
- let fixtureEl
- beforeAll(() => {
- fixtureEl = getFixture()
- })
- afterEach(() => {
- clearFixture()
- const list = document.querySelectorAll(CLASS_BACKDROP)
- for (const el of list) {
- el.remove()
- }
- })
- describe('show', () => {
- it('should append the backdrop html once on show and include the "show" class if it is "shown"', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: true,
- isAnimated: false
- })
- const getElements = () => document.querySelectorAll(CLASS_BACKDROP)
- expect(getElements()).toHaveSize(0)
- instance.show()
- instance.show(() => {
- expect(getElements()).toHaveSize(1)
- for (const el of getElements()) {
- expect(el).toHaveClass(CLASS_NAME_SHOW)
- }
- resolve()
- })
- })
- })
- it('should not append the backdrop html if it is not "shown"', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: false,
- isAnimated: true
- })
- const getElements = () => document.querySelectorAll(CLASS_BACKDROP)
- expect(getElements()).toHaveSize(0)
- instance.show(() => {
- expect(getElements()).toHaveSize(0)
- resolve()
- })
- })
- })
- it('should append the backdrop html once and include the "fade" class if it is "shown" and "animated"', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: true,
- isAnimated: true
- })
- const getElements = () => document.querySelectorAll(CLASS_BACKDROP)
- expect(getElements()).toHaveSize(0)
- instance.show(() => {
- expect(getElements()).toHaveSize(1)
- for (const el of getElements()) {
- expect(el).toHaveClass(CLASS_NAME_FADE)
- }
- resolve()
- })
- })
- })
- })
- describe('hide', () => {
- it('should remove the backdrop html', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: true,
- isAnimated: true
- })
- const getElements = () => document.body.querySelectorAll(CLASS_BACKDROP)
- expect(getElements()).toHaveSize(0)
- instance.show(() => {
- expect(getElements()).toHaveSize(1)
- instance.hide(() => {
- expect(getElements()).toHaveSize(0)
- resolve()
- })
- })
- })
- })
- it('should remove the "show" class', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: true,
- isAnimated: true
- })
- const elem = instance._getElement()
- instance.show()
- instance.hide(() => {
- expect(elem).not.toHaveClass(CLASS_NAME_SHOW)
- resolve()
- })
- })
- })
- it('should not try to remove Node on remove method if it is not "shown"', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: false,
- isAnimated: true
- })
- const getElements = () => document.querySelectorAll(CLASS_BACKDROP)
- const spy = spyOn(instance, 'dispose').and.callThrough()
- expect(getElements()).toHaveSize(0)
- expect(instance._isAppended).toBeFalse()
- instance.show(() => {
- instance.hide(() => {
- expect(getElements()).toHaveSize(0)
- expect(spy).not.toHaveBeenCalled()
- expect(instance._isAppended).toBeFalse()
- resolve()
- })
- })
- })
- })
- it('should not error if the backdrop no longer has a parent', () => {
- return new Promise(resolve => {
- fixtureEl.innerHTML = '<div id="wrapper"></div>'
- const wrapper = fixtureEl.querySelector('#wrapper')
- const instance = new Backdrop({
- isVisible: true,
- isAnimated: true,
- rootElement: wrapper
- })
- const getElements = () => document.querySelectorAll(CLASS_BACKDROP)
- instance.show(() => {
- wrapper.remove()
- instance.hide(() => {
- expect(getElements()).toHaveSize(0)
- resolve()
- })
- })
- })
- })
- })
- describe('click callback', () => {
- it('should execute callback on click', () => {
- return new Promise(resolve => {
- const spy = jasmine.createSpy('spy')
- const instance = new Backdrop({
- isVisible: true,
- isAnimated: false,
- clickCallback: () => spy()
- })
- const endTest = () => {
- setTimeout(() => {
- expect(spy).toHaveBeenCalled()
- resolve()
- }, 10)
- }
- instance.show(() => {
- const clickEvent = new Event('mousedown', { bubbles: true, cancelable: true })
- document.querySelector(CLASS_BACKDROP).dispatchEvent(clickEvent)
- endTest()
- })
- })
- })
- describe('animation callbacks', () => {
- it('should show and hide backdrop after counting transition duration if it is animated', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: true,
- isAnimated: true
- })
- const spy2 = jasmine.createSpy('spy2')
- const execDone = () => {
- setTimeout(() => {
- expect(spy2).toHaveBeenCalledTimes(2)
- resolve()
- }, 10)
- }
- instance.show(spy2)
- instance.hide(() => {
- spy2()
- execDone()
- })
- expect(spy2).not.toHaveBeenCalled()
- })
- })
- it('should show and hide backdrop without a delay if it is not animated', () => {
- return new Promise(resolve => {
- const spy = jasmine.createSpy('spy', getTransitionDurationFromElement)
- const instance = new Backdrop({
- isVisible: true,
- isAnimated: false
- })
- const spy2 = jasmine.createSpy('spy2')
- instance.show(spy2)
- instance.hide(spy2)
- setTimeout(() => {
- expect(spy2).toHaveBeenCalled()
- expect(spy).not.toHaveBeenCalled()
- resolve()
- }, 10)
- })
- })
- it('should not call delay callbacks if it is not "shown"', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: false,
- isAnimated: true
- })
- const spy = jasmine.createSpy('spy', getTransitionDurationFromElement)
- instance.show()
- instance.hide(() => {
- expect(spy).not.toHaveBeenCalled()
- resolve()
- })
- })
- })
- })
- describe('Config', () => {
- describe('rootElement initialization', () => {
- it('should be appended on "document.body" by default', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: true
- })
- const getElement = () => document.querySelector(CLASS_BACKDROP)
- instance.show(() => {
- expect(getElement().parentElement).toEqual(document.body)
- resolve()
- })
- })
- })
- it('should find the rootElement if passed as a string', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: true,
- rootElement: 'body'
- })
- const getElement = () => document.querySelector(CLASS_BACKDROP)
- instance.show(() => {
- expect(getElement().parentElement).toEqual(document.body)
- resolve()
- })
- })
- })
- it('should be appended on any element given by the proper config', () => {
- return new Promise(resolve => {
- fixtureEl.innerHTML = '<div id="wrapper"></div>'
- const wrapper = fixtureEl.querySelector('#wrapper')
- const instance = new Backdrop({
- isVisible: true,
- rootElement: wrapper
- })
- const getElement = () => document.querySelector(CLASS_BACKDROP)
- instance.show(() => {
- expect(getElement().parentElement).toEqual(wrapper)
- resolve()
- })
- })
- })
- })
- describe('ClassName', () => {
- it('should allow configuring className', () => {
- return new Promise(resolve => {
- const instance = new Backdrop({
- isVisible: true,
- className: 'foo'
- })
- const getElement = () => document.querySelector('.foo')
- instance.show(() => {
- expect(getElement()).toEqual(instance._getElement())
- instance.dispose()
- resolve()
- })
- })
- })
- })
- })
- })
- })
|