materialuiupgraded
Version:
Material-UI's workspace package
185 lines (153 loc) • 5.98 kB
JavaScript
import { assert } from 'chai';
import getScrollbarSize from 'dom-helpers/util/scrollbarSize';
import ModalManager from './ModalManager';
describe('ModalManager', () => {
let modalManager;
let container1;
before(() => {
modalManager = new ModalManager();
container1 = document.createElement('div');
document.body.appendChild(container1);
});
after(() => {
document.body.removeChild(container1);
});
it('should add a modal only once', () => {
const modal = {};
const modalManager2 = new ModalManager();
const idx = modalManager2.add(modal, container1);
assert.strictEqual(modalManager2.add(modal, container1), idx);
modalManager2.remove(modal);
});
describe('managing modals', () => {
let modal1;
let modal2;
let modal3;
before(() => {
modal1 = {};
modal2 = {};
modal3 = {};
});
it('should add modal1', () => {
const idx = modalManager.add(modal1, container1);
assert.strictEqual(idx, 0, 'should be the first modal');
assert.strictEqual(modalManager.isTopModal(modal1), true);
});
it('should add modal2', () => {
const idx = modalManager.add(modal2, container1);
assert.strictEqual(idx, 1, 'should be the second modal');
assert.strictEqual(modalManager.isTopModal(modal2), true);
});
it('should add modal3', () => {
const idx = modalManager.add(modal3, container1);
assert.strictEqual(idx, 2, 'should be the third modal');
assert.strictEqual(modalManager.isTopModal(modal3), true);
});
it('should remove modal2', () => {
const idx = modalManager.remove(modal2);
assert.strictEqual(idx, 1, 'should be the second modal');
});
it('should add modal2', () => {
const idx = modalManager.add(modal2, container1);
assert.strictEqual(idx, 2, 'should be the "third" modal');
assert.strictEqual(modalManager.isTopModal(modal2), true);
assert.strictEqual(
modalManager.isTopModal(modal3),
false,
'modal3 should not be the top modal',
);
});
it('should remove modal3', () => {
const idx = modalManager.remove(modal3);
assert.strictEqual(idx, 1);
});
it('should remove modal2', () => {
const idx = modalManager.remove(modal2);
assert.strictEqual(idx, 1);
assert.strictEqual(modalManager.isTopModal(modal1), true);
});
it('should remove modal1', () => {
const idx = modalManager.remove(modal1);
assert.strictEqual(idx, 0);
});
it('should not do anything', () => {
const idx = modalManager.remove({ nonExisting: true });
assert.strictEqual(idx, -1);
});
});
describe('overflow', () => {
let fixedNode;
beforeEach(() => {
fixedNode = document.createElement('div');
fixedNode.classList.add('mui-fixed');
fixedNode.style.padding = '14px';
document.body.appendChild(fixedNode);
window.innerWidth += 1; // simulate a scrollbar
});
afterEach(() => {
document.body.removeChild(fixedNode);
window.innerWidth -= 1;
});
it('should handle the scroll', () => {
const modal = {};
const paddingRightBefore = container1.style.paddingRight;
modalManager.add(modal, container1);
assert.strictEqual(container1.style.overflow, 'hidden');
assert.strictEqual(container1.style.paddingRight, `${getScrollbarSize()}px`);
assert.strictEqual(fixedNode.style.paddingRight, `${14 + getScrollbarSize()}px`);
modalManager.remove(modal);
assert.strictEqual(container1.style.overflow, '');
assert.strictEqual(container1.style.paddingRight, paddingRightBefore);
assert.strictEqual(fixedNode.style.paddingRight, '14px');
});
});
describe('container aria-hidden', () => {
let mountNode1;
let container2;
beforeEach(() => {
container2 = document.createElement('div');
document.body.appendChild(container2);
mountNode1 = document.createElement('div');
container2.appendChild(mountNode1);
modalManager = new ModalManager();
});
afterEach(() => {
document.body.removeChild(container2);
});
it('should add aria-hidden to container siblings', () => {
modalManager.add({}, container2);
assert.strictEqual(mountNode1.getAttribute('aria-hidden'), 'true');
});
it('should add aria-hidden to previous modals', () => {
const modal2 = {};
const modal3 = {};
const mountNode2 = document.createElement('div');
modal2.mountNode = mountNode2;
container2.appendChild(mountNode2);
modalManager.add(modal2, container2);
modalManager.add(modal3, container2);
assert.strictEqual(mountNode1.getAttribute('aria-hidden'), 'true');
assert.strictEqual(mountNode2.getAttribute('aria-hidden'), 'true');
});
it('should remove aria-hidden on americas next top modal', () => {
const modal2 = {};
const modal3 = {};
const mountNode2 = document.createElement('div');
modal2.mountNode = mountNode2;
container2.appendChild(mountNode2);
modalManager.add({}, container1);
modalManager.add(modal2, container2);
modalManager.add(modal3, container2);
assert.strictEqual(mountNode2.getAttribute('aria-hidden'), 'true');
modalManager.remove(modal3, container2);
assert.strictEqual(mountNode2.getAttribute('aria-hidden'), null);
});
it('should remove aria-hidden on siblings', () => {
const modal = {};
modalManager.add(modal, container2);
assert.strictEqual(mountNode1.getAttribute('aria-hidden'), 'true');
modalManager.remove(modal, container2);
assert.strictEqual(mountNode1.getAttribute('aria-hidden'), null);
});
});
});