confirm.test.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import { Icon, Modal } from '../../index';
  2. // import toJson from 'enzyme-to-json';
  3. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
  4. import { IconSend } from '@douyinfe/semi-icons';
  5. function getModal(modalProps, children) {
  6. let props = modalProps ? modalProps : {};
  7. return (
  8. <Modal
  9. {...props}
  10. >
  11. {children ? children : <p>This is content of basic modal</p>}
  12. </Modal>
  13. );
  14. }
  15. function mountToBody(component) {
  16. return mount(component, { attachTo: document.getElementById('container') });
  17. }
  18. describe('modal', () => {
  19. beforeEach(() => {
  20. // Avoid `attachTo: document.body` Warning
  21. const div = document.createElement('div');
  22. div.setAttribute('id', 'container');
  23. document.body.appendChild(div);
  24. });
  25. afterEach(() => {
  26. document.body.innerHTML = '';
  27. });
  28. it('confirm title/contentß', () => {
  29. Modal.confirm({ 'title': 'Semi', 'content': 'Content' });
  30. let modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  31. expect(modal.querySelector(`.${BASE_CLASS_PREFIX}-modal-title`).textContent).toEqual('Semi');
  32. expect(modal.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm-content`).textContent).toEqual('Content');
  33. let portal = document.querySelector(`.${BASE_CLASS_PREFIX}-portal`);
  34. if (portal) {
  35. document.body.removeChild(portal);
  36. }
  37. Modal.error({ 'title': 'Semi', 'content': 'Content' });
  38. modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  39. debugger
  40. expect(modal.querySelector(`.${BASE_CLASS_PREFIX}-modal-error-icon`)).not.toEqual(null);
  41. portal = document.querySelector(`.${BASE_CLASS_PREFIX}-portal`);
  42. if (portal) {
  43. document.body.removeChild(portal);
  44. }
  45. Modal.success({ 'title': 'Semi', 'content': 'Content' });
  46. modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  47. expect(modal.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm-icon`).classList.contains(`${BASE_CLASS_PREFIX}-modal-success-icon`)).toEqual(true);
  48. portal = document.querySelector(`.${BASE_CLASS_PREFIX}-portal`);
  49. if (portal) {
  50. document.body.removeChild(portal);
  51. }
  52. Modal.info({ 'title': 'Semi', 'content': 'Content' });
  53. modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  54. expect(modal.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm-icon`).classList.contains(`${BASE_CLASS_PREFIX}-modal-info-icon`)).toEqual(true);
  55. portal = document.querySelector(`.${BASE_CLASS_PREFIX}-portal`);
  56. if (portal) {
  57. document.body.removeChild(portal);
  58. }
  59. Modal.warning({ 'title': 'Semi', 'content': 'Content' });
  60. modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  61. expect(modal.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm-icon`).classList.contains(`${BASE_CLASS_PREFIX}-modal-warning-icon`)).toEqual(true);
  62. portal = document.querySelector(`.${BASE_CLASS_PREFIX}-portal`);
  63. if (portal) {
  64. document.body.removeChild(portal);
  65. }
  66. });
  67. it('custom icon', () => {
  68. Modal.confirm({ 'title': 'Semi', 'content': 'Content', icon: <IconSend /> });
  69. let modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  70. expect(modal.querySelector(`.${BASE_CLASS_PREFIX}-icon-send`)).not.toEqual(null);
  71. });
  72. it('confirm callback', () => {
  73. let onCancel = () => { };
  74. let onOk = () => { };
  75. let spyOnCancel = sinon.spy(onCancel);
  76. let spyOnOk = sinon.spy(onOk);
  77. Modal.confirm({ 'title': 'Semi', 'content': 'Content', onOk: spyOnOk, onCancel: spyOnCancel });
  78. let modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  79. let btn = modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)
  80. btn[0].click();
  81. btn[1].click();
  82. btn[2].click();
  83. expect(modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)[1].classList.contains(`${BASE_CLASS_PREFIX}-button-loading`)).toEqual(false);
  84. expect(modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)[2].classList.contains(`${BASE_CLASS_PREFIX}-button-loading`)).toEqual(false);
  85. expect(spyOnCancel.calledTwice).toBe(true);
  86. expect(spyOnOk.calledOnce).toBe(true);
  87. });
  88. it('confirm ok callback promise loading', (done) => {
  89. let onOk = () => new Promise(resolve => {
  90. setTimeout(() => {
  91. resolve();
  92. }, 1000);
  93. });
  94. let spyOnOk = sinon.spy(onOk);
  95. Modal.confirm({ 'title': 'Semi', 'content': 'Content', onOk: spyOnOk });
  96. let modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  97. let btn = modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)
  98. btn[2].click();
  99. expect(spyOnOk.calledOnce).toBe(true);
  100. expect(modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)[2].classList.contains(`${BASE_CLASS_PREFIX}-button-loading`)).toEqual(true);
  101. setTimeout(() => {
  102. debugger
  103. expect(modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)[2].classList.contains(`${BASE_CLASS_PREFIX}-button-loading`)).toEqual(false);
  104. done();
  105. }, 2000);
  106. });
  107. it('confirm ok callback promise error', (done) => {
  108. const error = new Error('something wrong');
  109. let onOk = () => Promise.reject(error);
  110. let spyOnOk = sinon.spy(onOk);
  111. // let spyLog = sinon.spy(console, 'error')
  112. Modal.confirm({ 'title': 'Semi', 'content': 'Content', onOk: spyOnOk });
  113. let modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  114. let btn = modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)
  115. btn[2].click();
  116. setTimeout(() => {
  117. debugger
  118. // expect(spyLog.calledWithMatch(error)).toBe(true);
  119. expect(modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)[2].classList.contains(`${BASE_CLASS_PREFIX}-button-loading`)).toEqual(false);
  120. expect(document.querySelector(`div.${BASE_CLASS_PREFIX}-modal`)).not.toEqual(null);
  121. // console.error.restore();
  122. done();
  123. }, 1000);
  124. });
  125. it('confirm cancel callback promise loading', (done) => {
  126. let onCancel = () => new Promise(resolve => {
  127. setTimeout(() => {
  128. resolve();
  129. }, 1000);
  130. });;
  131. let spyOnCancel = sinon.spy(onCancel);
  132. Modal.confirm({ 'title': 'Semi', 'content': 'Content', onCancel: spyOnCancel });
  133. let modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  134. let btn = modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)
  135. btn[0].click();
  136. expect(spyOnCancel.calledOnce).toBe(true);
  137. expect(modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)[1].classList.contains(`${BASE_CLASS_PREFIX}-button-loading`)).toEqual(true);
  138. setTimeout(() => {
  139. expect(modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)[1].classList.contains(`${BASE_CLASS_PREFIX}-button-loading`)).toEqual(false);
  140. done();
  141. }, 2000);
  142. });
  143. it('confirm cancel callback promise error', (done) => {
  144. const error = new Error('something wrong');
  145. let onCancel = () => Promise.reject(error);
  146. let spyOnCancel = sinon.spy(onCancel);
  147. // let spyLog = sinon.spy(console, 'error')
  148. Modal.confirm({ 'title': 'Semi', 'content': 'Content', onCancel: spyOnCancel });
  149. let modal = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  150. let btn = modal.querySelectorAll(`.${BASE_CLASS_PREFIX}-button`)
  151. btn[1].click();
  152. setTimeout(() => {
  153. // expect(spyLog.calledWithMatch(error)).toBe(true);
  154. // console.error.restore();
  155. done();
  156. }, 1000);
  157. });
  158. it('modal update', () => {
  159. let modal = Modal.confirm({ 'title': 'Semi', 'content': 'Content' });
  160. let modalDom = document.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm`);
  161. expect(modalDom.querySelector(`.${BASE_CLASS_PREFIX}-modal-title`).textContent).toEqual('Semi');
  162. expect(modalDom.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm-content`).textContent).toEqual('Content');
  163. modal.update({ 'title': 'Updated Semi', 'content': 'Updated Content' });
  164. expect(modalDom.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm-title-text`).textContent).toEqual('Updated Semi');
  165. expect(modalDom.querySelector(`.${BASE_CLASS_PREFIX}-modal-confirm-content`).textContent).toEqual('Updated Content');
  166. });
  167. // TODO: modal destroy
  168. // async function destroy(modal) {
  169. // modal.destroy && modal.destroy();
  170. // // Allow requestAnimationFrame to be invoked before continuing
  171. // await new Promise(resolve => setTimeout(resolve, 3000));
  172. // }
  173. // it('modal destroy', async done => {
  174. // let modal = Modal.confirm({ 'title': 'Semi', 'content': 'Content' });
  175. // expect(document.querySelector('div.${BASE_CLASS_PREFIX}-modal')).not.toEqual(null);
  176. // await destroy(modal);
  177. // debugger
  178. // expect(document.querySelector('div.${BASE_CLASS_PREFIX}-modal')).toEqual(null);
  179. // done();
  180. // });
  181. })