import { Modal } from '../../index';
// import toJson from 'enzyme-to-json';
import { clear } from 'jest-date-mock';
import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
import { cssClasses } from '@douyinfe/semi-foundation/icons/constants';
import { IconEyeClosed } from '@douyinfe/semi-icons';
const prefixCls = cssClasses.PREFIX;
function getModal(modalProps, children) {
let props = modalProps ? modalProps : {};
return (
{children ? children : This is content of basic modal
}
);
}
function mountToBody(component) {
return mount(component, { attachTo: document.getElementById('container') });
}
describe('modal', () => {
beforeEach(() => {
// Avoid `attachTo: document.body` Warning
const div = document.createElement('div');
div.setAttribute('id', 'container');
document.body.appendChild(div);
clear();
});
afterEach(() => {
document.body.innerHTML = '';
});
it('className / style / maskStyle / bodyStyle / zIndex', () => {
let component = getModal({
className: 'test',
style: { color: 'red' },
visible: true,
maskStyle: { color: 'grey' },
bodyStyle: { color: 'pink' },
zIndex: 500,
});
let modal = mount(component, { attachTo: document.getElementById('container') });
// let modal = mount(component, { attachTo: document.body });
// test className
expect(modal.exists('div.test')).toEqual(true);
// test style
expect(modal.find(`.${BASE_CLASS_PREFIX}-modal`)).toHaveStyle('color', 'red')
// test bodyStyle
expect(modal.find(`.${BASE_CLASS_PREFIX}-modal-body`)).toHaveStyle('color', 'pink');
// test maskStyle
expect(modal.find(`.${BASE_CLASS_PREFIX}-modal-mask`)).toHaveStyle('color', 'grey');
// test zIndex
expect(document.querySelector(`.${BASE_CLASS_PREFIX}-portal`).style.zIndex).toEqual("500");
modal.unmount();
});
it('visible', (done) => {
let component = getModal();
let modal = mount(component, { attachTo: document.getElementById('container') });
expect(modal.exists(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(false);
// set true
modal.setProps({ visible: true });
modal.update(); // 必须调用一次update
expect(modal.exists(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(true);
expect(document.body.style.overflow).toEqual('hidden');
// set false
modal.setProps({ visible: false });
modal.update(); // 必须调用一次update
expect(document.body.style.overflow).not.toEqual('hidden');
setTimeout(() => {
expect(document.querySelector(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(null);
done();
}, 2000);
});
it('render basic content', () => {
let com = getModal({ title: 'SemiTitle', visible: true })
let modal = mount(com, { attachTo: document.getElementById('container') });
// test title
let sheetTitle = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-title`);
expect(sheetTitle.textContent).toEqual('SemiTitle');
// test content
let sheetContent = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-body`);
// the content in getModal could not be overwritten
expect(sheetContent.textContent).toEqual('This is content of basic modal');
modal.unmount();
});
it('footer / header', () => {
let com = getModal({ header: (
This is a header
), footer: (This is a footer
), visible: true })
let modal = mount(com, { attachTo: document.getElementById('container') });
expect(modal.find(`.${BASE_CLASS_PREFIX}-modal-content`).children().at(0).html()).toEqual('This is a header
');
expect(modal.find(`.${BASE_CLASS_PREFIX}-modal-footer`).contains(This is a footer
)).toEqual(true);
// test null
modal.setProps({ header: null, footer: null });
let content = modal.find(`.${BASE_CLASS_PREFIX}-modal-content`).children();
expect(content.length).toEqual(1);
expect(content.text()).toEqual('This is content of basic modal')
modal.unmount();
});
it('height / width', () => {
let com = getModal({ width: '413px', height: '613px', visible: true })
let modal = mount(com, { attachTo: document.getElementById('container') });
let dom = modal.find(`.${BASE_CLASS_PREFIX}-modal`).getDOMNode();
expect(window.getComputedStyle(dom).width).toEqual('413px')
expect(window.getComputedStyle(dom).height).toEqual('613px')
modal.unmount();
});
it('size', () => {
let com = getModal({ size: 'small', visible: true })
let modal = mount(com, { attachTo: document.getElementById('container') });
expect(modal.exists(`.${BASE_CLASS_PREFIX}-modal-small`)).toEqual(true);
// test medium size
modal.setProps({ size: 'medium' });
expect(modal.exists(`.${BASE_CLASS_PREFIX}-modal-medium`)).toEqual(true);
// test large size
modal.setProps({ size: 'large' });
expect(modal.exists(`.${BASE_CLASS_PREFIX}-modal-large`)).toEqual(true);
// test full-width
modal.setProps({ size: 'full-width' });
expect(modal.exists(`.${BASE_CLASS_PREFIX}-modal-full-width`)).toEqual(true);
modal.unmount();
});
it('closable', () => {
let closeCom = getModal({ closable: true, visible: true });
let nocloseCom = getModal({ closable: false, visible: true });
let modal = mount(closeCom, { attachTo: document.getElementById('container') });
expect(modal.exists(`.${BASE_CLASS_PREFIX}-modal-close`)).toEqual(true);
modal.unmount();
let notClosableSideSheet = mount(nocloseCom, { attachTo: document.getElementById('container') });
expect(notClosableSideSheet.exists(`.${BASE_CLASS_PREFIX}-modal-close`)).toEqual(false);
notClosableSideSheet.unmount();
});
it('getPopupContainer', () => {
let containedcom = (
document.querySelector('.modal-container')}
/>
)
let wrapper = mount(containedcom, { attachTo: document.getElementById('container') });
let container = document.querySelector('.modal-container').querySelector(`.${BASE_CLASS_PREFIX}-modal`);
expect(wrapper.find(`div.${BASE_CLASS_PREFIX}-modal`).html()).toEqual(container.outerHTML);
});
it('maskClosable', () => {
let onCancel = () => { };
let spyOnCancel = sinon.spy(onCancel);
let spyOnCancel2 = sinon.spy(onCancel);
let closeCom = getModal({
maskClosable: true,
visible: true,
onCancel: spyOnCancel
});
let modal = mount(closeCom, { attachTo: document.getElementById('container') });
// maskClosable
modal.find(`.${BASE_CLASS_PREFIX}-modal-wrap`).simulate('click');
expect(spyOnCancel.calledOnce).toBe(true);
modal.unmount();
// mask not closable
let notMaskClosableSideSheet = mount(getModal({
maskClosable: false,
visible: true,
onCancel: spyOnCancel2
}), { attachTo: document.getElementById('container') });
notMaskClosableSideSheet.find(`.${BASE_CLASS_PREFIX}-modal-wrap`).simulate('click');
expect(spyOnCancel2.calledOnce).toBe(false);
notMaskClosableSideSheet.unmount();
});
it('button props: cancelText / okText / okButtonProps / cancelButtonProps / hasCancel / confirmLoading ', () => {
let component = getModal({
cancelText: 'cancel',
okText: 'ok',
okType: 'secondary',
visible: true,
// remove close btn to avoid selected by selector
closable: false,
});
let modal = mount(component, { attachTo: document.getElementById('container') });
let footerBtn = modal.find(`.${BASE_CLASS_PREFIX}-button`)
expect(footerBtn.at(0).text()).toEqual('cancel');
expect(footerBtn.at(1).text()).toEqual('ok');
expect(footerBtn.at(1)).toHaveClassName(`${BASE_CLASS_PREFIX}-button-secondary`);
// test passing props
modal.setProps({
okButtonProps: { size: 'small', type: 'warning' },
cancelButtonProps: { size: 'small', disabled: true }
});
footerBtn = modal.find(`.${BASE_CLASS_PREFIX}-button`)
expect(footerBtn.at(0)).toHaveClassName(`${BASE_CLASS_PREFIX}-button-disabled ${BASE_CLASS_PREFIX}-button-size-small`);
expect(footerBtn.at(1)).toHaveClassName(`${BASE_CLASS_PREFIX}-button-warning ${BASE_CLASS_PREFIX}-button-size-small`);
// ok Btn loading, no cancel
modal.setProps({
hasCancel: false,
confirmLoading: true,
});
footerBtn = modal.find(`.${BASE_CLASS_PREFIX}-button`)
expect(footerBtn.length).toEqual(1);
expect(footerBtn.at(0)).toHaveClassName(`${BASE_CLASS_PREFIX}-button-loading`);
});
it('onCancel / onOk', () => {
// onCancel on close btn
// debugger
let onCancel = () => { };
let onOk = () => { };
let spyOnCancel = sinon.spy(onCancel);
let spyOnOk = sinon.spy(onOk);
let closeCom = getModal({
visible: true,
onCancel: spyOnCancel,
onOk: spyOnOk
});
let modal = mount(closeCom, { attachTo: document.getElementById('container') });
let btn = modal.find(`.${BASE_CLASS_PREFIX}-button`)
modal.find(`button.${BASE_CLASS_PREFIX}-modal-close`).simulate('click');
btn.at(1).simulate('click');
btn.at(2).simulate('click');
expect(spyOnCancel.calledTwice).toBe(true);
expect(spyOnOk.calledOnce).toBe(true);
});
it('no mask', () => {
let com = getModal({
mask: false,
visible: true,
});
let modal = mount(com, { attachTo: document.getElementById('container') });
expect(modal.exists(`.${BASE_CLASS_PREFIX}-modal-mask`)).toEqual(false);
});
it('closeIcon', () => {
let com = getModal({
visible: true,
closeIcon: ()
});
let modal = mount(com, { attachTo: document.getElementById('container') });
expect(modal.find(`.${BASE_CLASS_PREFIX}-icon-eye_closed`).length).toBe(1);
});
it('motion false', () => {
let com = getModal({ visible: true, motion: false });
let modal = mount(com, { attachTo: document.getElementById('container') });
expect(modal.find(`div.${BASE_CLASS_PREFIX}-modal`)).not.toHaveStyle('transform');
// visible false
modal.setProps({ visible: false });
modal.update(); // 必须调用一次update
expect(document.querySelector(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(null);
});
it('centered', (done) => {
let com = getModal({ centered: true, visible: true, motion: true });
let modal = mount(com, { attachTo: document.getElementById('container') });
setTimeout(() => {
modal.update();
expect(modal.find(`div.${BASE_CLASS_PREFIX}-modal-content`)).toHaveClassName(`semi-modal-content-animate-show`);
done();
}, 2000);
});
it('centered without motion', () => {
let com = getModal({ centered: true, visible: true, motion: false });
let modal = mount(com, { attachTo: document.getElementById('container') });
expect(modal.find(`div.${BASE_CLASS_PREFIX}-modal`)).toHaveStyle({ transform: 'translateY(-50%)', top: '50%' });
});
it('keepDOM', () => {
let component = getModal({ keepDOM: true });
let modal = mount(component, { attachTo: document.getElementById('container') });
expect(modal.exists(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(false);
// set true
modal.setProps({ visible: true });
modal.update(); // 必须调用一次update
expect(modal.exists(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(true);
expect(document.body.style.overflow).toEqual('hidden');
// set false but still exist
modal.setProps({ visible: false });
modal.update(); // 必须调用一次update
expect(modal.state().hidden).toEqual(true);
expect(modal.exists(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(true);
});
it('keepDOM + lazyRender=false', () => {
let component = getModal({ keepDOM: true, lazyRender: false });
let modal = mount(component, { attachTo: document.getElementById('container') });
expect(modal.exists(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(true);
// set true
modal.setProps({ visible: true });
modal.update(); // 必须调用一次update
expect(modal.exists(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(true);
expect(document.body.style.overflow).toEqual('hidden');
// set false but still exist
modal.setProps({ visible: false });
modal.update(); // 必须调用一次update
expect(modal.state().hidden).toEqual(true);
expect(modal.exists(`div.${BASE_CLASS_PREFIX}-modal`)).toEqual(true);
});
})