sideSheet.test.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. import { Icon, SideSheet, Modal } from '../../index';
  2. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
  3. import { IconEyeClosed } from '@douyinfe/semi-icons';
  4. // import toJson from 'enzyme-to-json';
  5. function getSideSheet(SideSheetProps, children) {
  6. let props = SideSheetProps ? SideSheetProps : {};
  7. return (
  8. <SideSheet
  9. {...props}
  10. >
  11. {children ? children : <p>This is content of basic sideSheet</p>}
  12. </SideSheet>
  13. );
  14. }
  15. function mountToBody(component) {
  16. return mount(component, { attachTo: document.getElementById('container') });
  17. }
  18. describe('SideSheet', () => {
  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. const div = document.getElementById('container');
  27. if (div) {
  28. document.body.removeChild(div);
  29. }
  30. });
  31. it('className / style / maskStyle / bodyStyle / headerStyle / zIndex', () => {
  32. debugger
  33. let component = getSideSheet({
  34. className: 'test',
  35. style: { color: 'red' },
  36. visible: true,
  37. maskStyle: { color: 'grey' },
  38. headerStyle: { color: 'green' },
  39. bodyStyle: { color: 'pink' },
  40. zIndex: 500,
  41. });
  42. let sideSheet = mount(component, { attachTo: document.getElementById('container') });
  43. // let sideSheet = mount(component, { attachTo: document.body });
  44. // test className
  45. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet.test`)).toEqual(true);
  46. // test style
  47. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle('color', 'red')
  48. // test bodyStyle
  49. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-body`)).toHaveStyle('color', 'pink');
  50. // test headerStyle
  51. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-header`)).toHaveStyle('color', 'green');
  52. // test maskStyle
  53. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-mask`)).toHaveStyle('color', 'grey');
  54. // test zIndex
  55. expect(document.querySelector(`.${BASE_CLASS_PREFIX}-portal`).style.zIndex).toEqual("500");
  56. sideSheet.unmount();
  57. });
  58. it('visible', () => {
  59. let component = getSideSheet();
  60. // let sideSheet = mount(component, { attachTo: document.body }); // 如果用body的话,第一个测试用例可以过,但第二个就不行
  61. let sideSheet = mount(component, { attachTo: document.getElementById('container') });
  62. expect(sideSheet.exists(`div.${BASE_CLASS_PREFIX}-sidesheet`)).toEqual(false);
  63. sideSheet.setProps({ visible: true });
  64. sideSheet.update(); // 必须调用一次update
  65. expect(sideSheet.exists(`div.${BASE_CLASS_PREFIX}-sidesheet`)).toEqual(true);
  66. sideSheet.unmount();
  67. });
  68. it('test', () => {
  69. let bottomCom = getSideSheet({ placement: 'bottom', visible: true });
  70. let bottomSideSheet = mount(bottomCom, { attachTo: document.getElementById('container') });
  71. expect(bottomSideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-bottom`)).toEqual(true);
  72. bottomSideSheet.unmount();
  73. })
  74. it('different position', () => {
  75. let topCom = getSideSheet({ placement: 'top', visible: true });
  76. let sideSheet = mount(topCom, { attachTo: document.getElementById('container') });
  77. // top
  78. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-top`)).toEqual(true);
  79. // expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ transform: 'translateY(-100%)', width: '100%' });
  80. // bottom
  81. sideSheet.setProps({ placement: 'bottom' });
  82. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-bottom`)).toEqual(true);
  83. // expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ transform: 'translateY(100%)', width: '100%' });
  84. // left
  85. sideSheet.setProps({ placement: 'left' });
  86. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-left`)).toEqual(true);
  87. // expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ transform: 'translateX(-0%)', height: '100%' });
  88. // right
  89. sideSheet.setProps({ placement: 'right' });
  90. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-right`)).toEqual(true);
  91. // expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ transform: 'translateX(0%)', height: '100%' });
  92. sideSheet.unmount();
  93. });
  94. // it('onCancel', () => {
  95. // });
  96. it('render basiclly', () => {
  97. let com = getSideSheet({ title: 'SemiTitle', visible: true })
  98. let sideSheet = mount(com, { attachTo: document.getElementById('container') });
  99. // test title
  100. let sheetTitle = document.querySelector(`.${BASE_CLASS_PREFIX}-sidesheet-title`);
  101. expect(sheetTitle.textContent).toEqual('SemiTitle');
  102. // test content
  103. let sheetContent = document.querySelector(`.${BASE_CLASS_PREFIX}-sidesheet-body`);
  104. // the content in getSideSheet could not be overwritten
  105. expect(sheetContent.textContent).toEqual('This is content of basic sideSheet');
  106. sideSheet.unmount();
  107. });
  108. it('size', () => {
  109. let com = getSideSheet({ size: 'small', visible: true })
  110. let sideSheet = mount(com, { attachTo: document.getElementById('container') });
  111. // test small size
  112. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveClassName("semi-sidesheet-size-small");
  113. // test medium size
  114. sideSheet.setProps({ size: 'medium' });
  115. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveClassName("semi-sidesheet-size-medium");
  116. // test large size
  117. sideSheet.setProps({ size: 'large' });
  118. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveClassName("semi-sidesheet-size-large");
  119. sideSheet.unmount();
  120. });
  121. it('height / width', () => {
  122. let com = getSideSheet({ width: '413px', visible: true })
  123. let sideSheet = mount(com, { attachTo: document.getElementById('container') });
  124. // test width on left
  125. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ width: '413px' });
  126. // test height on left
  127. sideSheet.setProps({ height: '413px' });
  128. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ height: '100%' });
  129. // test width on right
  130. sideSheet.setProps({ placement: 'right' });
  131. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ width: '413px' });
  132. // test height on right
  133. sideSheet.setProps({ height: '413px' });
  134. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ height: '100%' });
  135. // test height on top
  136. sideSheet.setProps({ height: '413px', placement: 'top' });
  137. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ height: '413px' });
  138. // test width on top
  139. sideSheet.setProps({ width: '413px' });
  140. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ width: '100%' });
  141. // test height on bottom
  142. sideSheet.setProps({ height: '413px', placement: 'bottom' });
  143. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ height: '413px' });
  144. // test width on bottom
  145. sideSheet.setProps({ width: '413px' });
  146. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).toHaveStyle({ width: '100%' });
  147. sideSheet.unmount();
  148. });
  149. it('disableScroll', () => {
  150. let com = getSideSheet({ visible: true })
  151. let sideSheet = mount(com, { attachTo: document.getElementById('container') });
  152. // test default
  153. expect(document.body.style.overflow).toEqual('hidden');
  154. sideSheet.setProps({ visible: false });
  155. expect(document.body.style.overflow).not.toEqual('hidden');
  156. // test disableScroll
  157. sideSheet.setProps({ disableScroll: false, visible: true });
  158. expect(document.body.style.overflow).not.toEqual('hidden');
  159. sideSheet.unmount();
  160. });
  161. it('closable', () => {
  162. let closeCom = getSideSheet({ closable: true, visible: true });
  163. let nocloseCom = getSideSheet({ closable: false, visible: true });
  164. let sideSheet = mount(closeCom, { attachTo: document.getElementById('container') });
  165. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-close`)).toEqual(true);
  166. sideSheet.unmount();
  167. let notClosableSideSheet = mount(nocloseCom, { attachTo: document.getElementById('container') });
  168. expect(notClosableSideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-close`)).toEqual(false);
  169. notClosableSideSheet.unmount();
  170. });
  171. it('maskClosable', () => {
  172. let onCancel = () => { };
  173. let spyOnCancel = sinon.spy(onCancel);
  174. let spyOnCancel2 = sinon.spy(onCancel);
  175. let closeCom = getSideSheet({
  176. maskClosable: true,
  177. visible: true,
  178. onCancel: spyOnCancel
  179. });
  180. let sideSheet = mount(closeCom, { attachTo: document.getElementById('container') });
  181. // maskClosable
  182. sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-mask`).simulate('click');
  183. expect(spyOnCancel.calledOnce).toBe(true);
  184. sideSheet.unmount();
  185. // mask not closable
  186. let notMaskClosableSideSheet = mount(getSideSheet({
  187. maskClosable: false,
  188. visible: true,
  189. onCancel: spyOnCancel2
  190. }), { attachTo: document.getElementById('container') });
  191. notMaskClosableSideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-mask`).simulate('click');
  192. expect(spyOnCancel2.calledOnce).toBe(false);
  193. notMaskClosableSideSheet.unmount();
  194. });
  195. it('onCancel', () => {
  196. // onCancel on mask tested in [maskClosable]
  197. // onCancel on close btn
  198. // debugger
  199. let onCancel = () => { };
  200. let spyOnCancel = sinon.spy(onCancel);
  201. let closeCom = getSideSheet({
  202. visible: true,
  203. onCancel: spyOnCancel
  204. });
  205. let sideSheet = mount(closeCom, { attachTo: document.getElementById('container') });
  206. // let dom = sideSheet.find('div.${BASE_CLASS_PREFIX}-sidesheet-close').getDOMNode();
  207. sideSheet.find(`button.${BASE_CLASS_PREFIX}-sidesheet-close`).simulate('click');
  208. expect(spyOnCancel.calledOnce).toBe(true);
  209. sideSheet.unmount();
  210. });
  211. it('no mask', () => {
  212. let com = getSideSheet({
  213. mask: false
  214. });
  215. let sideSheet = mount(com, { attachTo: document.getElementById('container') });
  216. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-modal-mask`)).toEqual(false);
  217. // TODO: add a button to see if could be clicked
  218. sideSheet.unmount();
  219. });
  220. it('getPopupContainer', () => {
  221. debugger
  222. let containedcom = (
  223. <div
  224. style={{
  225. height: 320,
  226. overflow: 'hidden',
  227. position: 'relative',
  228. }}
  229. className='sidesheet-container'
  230. >
  231. <SideSheet
  232. visible={true}
  233. getPopupContainer={() => document.querySelector('.sidesheet-container')}
  234. />
  235. </div>
  236. )
  237. let wrapper1 = mount(containedcom, { attachTo: document.getElementById('container') });
  238. let container1 = document.querySelector('.sidesheet-container').querySelector(`.${BASE_CLASS_PREFIX}-sidesheet`);
  239. expect(wrapper1.find(`div.${BASE_CLASS_PREFIX}-sidesheet`).html()).toEqual(container1.outerHTML);
  240. // get popup container no body overflow
  241. debugger
  242. expect(document.body.style.overflow).not.toEqual('hidden');
  243. wrapper1.unmount();
  244. // no getPopupContainer
  245. let com = (
  246. <div
  247. style={{
  248. height: 320,
  249. overflow: 'hidden',
  250. position: 'relative',
  251. }}
  252. className='sidesheet-container'
  253. >
  254. <SideSheet
  255. visible={true}
  256. />
  257. </div>
  258. )
  259. let wrapper2 = mount(com, { attachTo: document.getElementById('container') });
  260. let container2 = document.querySelector('.sidesheet-container').querySelector(`.${BASE_CLASS_PREFIX}-sidesheet`);
  261. expect(container2).toEqual(null);
  262. wrapper2.unmount();
  263. });
  264. it('motion false', () => {
  265. let topCom = getSideSheet({ placement: 'top', visible: true, motion: false });
  266. let sideSheet = mount(topCom, { attachTo: document.getElementById('container') });
  267. // top
  268. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-top`)).toEqual(true);
  269. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).not.toHaveStyle({ transform: 'translateY(-100%)' });
  270. // bottom
  271. sideSheet.setProps({ placement: 'bottom' });
  272. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-bottom`)).toEqual(true);
  273. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).not.toHaveStyle({ transform: 'translateY(100%)' });
  274. // left
  275. sideSheet.setProps({ placement: 'left' });
  276. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-left`)).toEqual(true);
  277. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).not.toHaveStyle({ transform: 'translateX(-0%)' });
  278. // right
  279. sideSheet.setProps({ placement: 'right' });
  280. expect(sideSheet.exists(`.${BASE_CLASS_PREFIX}-sidesheet-right`)).toEqual(true);
  281. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-sidesheet-inner`)).not.toHaveStyle({ transform: 'translateX(0%)' });
  282. // visible false
  283. sideSheet.setProps({ visible: false });
  284. sideSheet.update(); // 必须调用一次update
  285. expect(sideSheet.exists(`div.${BASE_CLASS_PREFIX}-sidesheet`)).toEqual(false);
  286. sideSheet.unmount();
  287. });
  288. it('closeIcon', () => {
  289. let com = getSideSheet({
  290. visible: true,
  291. closeIcon: (<IconEyeClosed />)
  292. });
  293. let sideSheet = mount(com, { attachTo: document.getElementById('container') });
  294. expect(sideSheet.find(`.${BASE_CLASS_PREFIX}-icon-eye_closed`).length).toBe(1);
  295. });
  296. })