collapse.test.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import { Collapse } from '../../index';
  2. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants'; // import toJson from 'enzyme-to-json';
  3. import { IconPlus, IconMinus, IconCopy } from '@douyinfe/semi-icons';
  4. let getCollapse = (collapseProps, panel1Props) => {
  5. let props = collapseProps ? collapseProps : {};
  6. let panelProps = panel1Props ? panel1Props : {};
  7. return (
  8. <Collapse {...collapseProps}>
  9. <Collapse.Panel header="This is panel header 1" itemKey="1" {...panelProps}>
  10. <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
  11. </Collapse.Panel>
  12. <Collapse.Panel header="This is panel header 2" itemKey="2">
  13. <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
  14. </Collapse.Panel>
  15. <Collapse.Panel header="This is panel header 3" itemKey="3">
  16. <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
  17. </Collapse.Panel>
  18. </Collapse>
  19. );
  20. };
  21. let collapseCls = `.${BASE_CLASS_PREFIX}-collapse`;
  22. let expandAttr = 'aria-expanded';
  23. describe('Collapse', () => {
  24. it('Collapse with custom className & style', () => {
  25. let props = {
  26. className: 'test',
  27. style: {
  28. color: 'red',
  29. },
  30. };
  31. const collapse = shallow(getCollapse(props));
  32. expect(collapse.exists('.test')).toEqual(true);
  33. expect(collapse.find('div.test')).toHaveStyle('color', 'red');
  34. });
  35. it('Collapse with defaultActiveKey', () => {
  36. // 直接测试对应dom是否有对应的attribute
  37. let oneExpandProps = {
  38. defaultActiveKey: '1',
  39. };
  40. let moreExpandProps = {
  41. defaultActiveKey: ['1', '2'],
  42. };
  43. const oneExpand = mount(getCollapse(oneExpandProps));
  44. const moreExpand = mount(getCollapse(moreExpandProps));
  45. const oneExpandHeaders = oneExpand.find('.semi-collapse-header');
  46. expect(oneExpandHeaders.at(0).getDOMNode().getAttribute(expandAttr)).toEqual("true");
  47. expect(oneExpandHeaders.at(1).getDOMNode().getAttribute(expandAttr)).toEqual("false");
  48. expect(oneExpandHeaders.at(2).getDOMNode().getAttribute(expandAttr)).toEqual("false");
  49. const moreExpandHeaders = moreExpand.find('.semi-collapse-header')
  50. expect(moreExpandHeaders.at(0).getDOMNode().getAttribute(expandAttr)).toEqual("true");
  51. expect(moreExpandHeaders.at(1).getDOMNode().getAttribute(expandAttr)).toEqual("true");
  52. expect(moreExpandHeaders.at(2).getDOMNode().getAttribute(expandAttr)).toEqual("false");
  53. });
  54. it('Collapse with custom expandIcon / collapseIcon', () => {
  55. let plusIcon = <IconPlus />;
  56. let minIcon = <IconMinus />;
  57. let props = {
  58. expandIcon: plusIcon,
  59. collapseIcon: minIcon,
  60. };
  61. let collapse = mount(getCollapse(props));
  62. expect(collapse.props().expandIcon).toEqual(plusIcon);
  63. expect(collapse.props().collapseIcon).toEqual(minIcon);
  64. expect(collapse.contains(plusIcon)).toEqual(true);
  65. expect(collapse.contains(minIcon)).toEqual(false);
  66. collapse
  67. .find(`.${BASE_CLASS_PREFIX}-collapse-header`)
  68. .at(0)
  69. .simulate('click');
  70. expect(collapse.contains(minIcon)).toEqual(true);
  71. });
  72. it('Collapse with custom extra content', () => {
  73. let extra1 = '1234';
  74. let extra2 = <IconCopy />;
  75. let collapse = mount(
  76. <Collapse>
  77. <Collapse.Panel header="This is panel header 1" itemKey="1" extra={extra1}>
  78. <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
  79. </Collapse.Panel>
  80. <Collapse.Panel header="This is panel header 2" itemKey="2" extra={extra2}>
  81. <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
  82. </Collapse.Panel>
  83. </Collapse>
  84. );
  85. let panels = collapse.find(`.${BASE_CLASS_PREFIX}-collapse-header-right`);
  86. let panel1 = panels.at(0);
  87. let panel2 = panels.at(1);
  88. expect(panel1.contains(extra1)).toEqual(true);
  89. expect(panel1.contains(extra1)).toEqual(true);
  90. });
  91. it('Collapse onChange', () => {
  92. let onChange = value => {};
  93. let spyOnChange = sinon.spy(onChange);
  94. let props = {
  95. onChange: spyOnChange,
  96. };
  97. const collapse = mount(getCollapse(props));
  98. collapse
  99. .find(`.${BASE_CLASS_PREFIX}-collapse-header`)
  100. .at(2)
  101. .simulate('click');
  102. expect(spyOnChange.calledWithMatch(['3'])).toBe(true);
  103. expect(spyOnChange.calledOnce).toBe(true);
  104. });
  105. it('expand more than one panel', () => {
  106. const collapse = mount(getCollapse());
  107. collapse
  108. .find(`.${BASE_CLASS_PREFIX}-collapse-header`)
  109. .at(1)
  110. .simulate('click');
  111. collapse
  112. .find(`.${BASE_CLASS_PREFIX}-collapse-header`)
  113. .at(2)
  114. .simulate('click');
  115. let activeSet = [...collapse.state().activeSet];
  116. expect(JSON.stringify(activeSet)).toEqual('["2","3"]');
  117. const headers = collapse.find('.semi-collapse-header');
  118. expect(headers.at(0).getDOMNode().getAttribute(expandAttr)).toEqual("false");
  119. expect(headers.at(1).getDOMNode().getAttribute(expandAttr)).toEqual("true");
  120. expect(headers.at(2).getDOMNode().getAttribute(expandAttr)).toEqual("true");
  121. });
  122. it('accordion, Only one expansion is allowed', () => {
  123. let props = {
  124. accordion: true,
  125. defaultActiveKey: ['1', '2'],
  126. };
  127. const collapse = mount(getCollapse(props));
  128. let activeSet = [...collapse.state().activeSet];
  129. expect(activeSet[0]).toEqual('1');
  130. // only first key active when accordion is true & defaultActiveKey set more than one key
  131. const headers = collapse.find('.semi-collapse-header');
  132. expect(headers.at(0).getDOMNode().getAttribute(expandAttr)).toEqual("true");
  133. expect(headers.at(1).getDOMNode().getAttribute(expandAttr)).toEqual("false");
  134. // simulate click panel-3
  135. collapse.find(`.${BASE_CLASS_PREFIX}-collapse-header`).at(2).simulate('click');
  136. activeSet = [...collapse.state().activeSet];
  137. expect(activeSet[0]).toEqual('3');
  138. expect(headers.at(0).getDOMNode().getAttribute(expandAttr)).toEqual("false");
  139. expect(headers.at(1).getDOMNode().getAttribute(expandAttr)).toEqual("false");
  140. expect(headers.at(2).getDOMNode().getAttribute(expandAttr)).toEqual("true");
  141. });
  142. it('disable Collapse', () => {
  143. let props = {
  144. disabled: true,
  145. };
  146. const disabledPanel = mount(getCollapse({}, props));
  147. expect(disabledPanel.exists('.semi-collapse-header-disabled')).toEqual(true);
  148. });
  149. it('hide the panel icon', () => {
  150. const hidePanelArrow = mount(
  151. <Collapse >
  152. <Collapse.Panel header="This is panel header 1" itemKey="1" showArrow={false}>
  153. <p>Hi, bytedance dance dance. This is the docsite of Semi UI. </p>
  154. </Collapse.Panel>
  155. </Collapse>);
  156. expect(hidePanelArrow.exists('.semi-collapse-header-icon')).toEqual(false);
  157. });
  158. });