slider.test.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import Slider from '..';
  2. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
  3. import isEqual from 'lodash/isEqual';
  4. // TODO 细化单测,目前覆盖的场景过少
  5. describe('Slider', () => {
  6. it('default value & default range value', () => {
  7. const wrapper = mount(
  8. <div>
  9. <div>Default</div>
  10. <Slider defaultValue={10} showBoundary={true}></Slider>
  11. <Slider defaultValue={[20, 60]} range></Slider>
  12. </div>
  13. );
  14. const handles =wrapper.find(`.${BASE_CLASS_PREFIX}-slider-handle`);
  15. expect(handles.at(0).getDOMNode().style.left).toBe('10%');
  16. expect(handles.at(1).getDOMNode().style.left).toBe('20%');
  17. expect(handles.at(2).getDOMNode().style.left).toBe('60%');
  18. const sliders = wrapper.find(Slider);
  19. expect(sliders.at(0).state('currentValue')).toBe(10);
  20. expect(isEqual(sliders.at(1).state('currentValue'), [20, 60])).toBe(true);
  21. wrapper.unmount();
  22. });
  23. it('onChange', () => {
  24. const onChange = sinon.spy();
  25. const STYLE = { width: 100, height: 32, marginLeft: 13 }; // it is really hack to mock slider wrapper getBoundingClientRect data
  26. const wrapper = mount(<Slider style={STYLE} step={1} onChange={onChange}></Slider>);
  27. const rail = wrapper.find('.semi-slider-rail');
  28. const railNode = rail.getDOMNode();
  29. // click max position
  30. rail.simulate('click', { pageX: 113, pageY: 16, target: railNode }); // these value calculate from storybook, and simulate here
  31. expect(wrapper.state('currentValue')).toBe(100);
  32. expect(onChange.calledOnce).toBe(true);
  33. // click min position
  34. rail.simulate('click', { pageX: 13, pageY: 16, target: railNode });
  35. expect(wrapper.state('currentValue')).toBe(0);
  36. expect(onChange.getCall(1).args[0]).toBe(0);
  37. });
  38. it('range onChange', () => {
  39. const onChange = sinon.spy();
  40. const STYLE = { width: 4, height: 400, marginLeft: 20, marginTop: 40 }; // it is really hack to mock slider wrapper getBoundingClientRect data
  41. const wrapper = mount(<Slider range vertical defaultValue={[20, 60]} style={STYLE} onChange={onChange}></Slider>);
  42. const rail = wrapper.find('.semi-slider-rail');
  43. const railNode = rail.getDOMNode();
  44. // click min position
  45. rail.simulate('click', { pageX: 22, pageY: 40, target: railNode }); // these value calculate from storybook, and simulate here
  46. expect(isEqual(wrapper.state('currentValue'), [0, 60])).toBe(true);
  47. expect(onChange.calledOnce).toBe(true);
  48. // click max position
  49. rail.simulate('click', { pageX: 22, pageY: 440, target: railNode });
  50. expect(isEqual(wrapper.state('currentValue'), [0, 100])).toBe(true);
  51. expect(isEqual(onChange.getCall(1).args[0], [0, 100])).toBe(true);
  52. });
  53. it('controlled value', () => {
  54. const onChange = sinon.spy();
  55. const wrapper = mount(<Slider value={10} step={1} onChange={onChange}></Slider>);
  56. expect(wrapper.state('currentValue')).toBe(10);
  57. wrapper.setProps({ 'value': 20 });
  58. expect(wrapper.state('currentValue')).toBe(20);
  59. wrapper.setProps({ 'value': 100 + 1 })
  60. expect(wrapper.state('currentValue')).toBe(100);
  61. wrapper.unmount();
  62. });
  63. // TODO: body event not work
  64. // it('drag and move', () => {
  65. // const STYLE = { width: 100, height: 32, marginLeft: 13 }; // it is really hack to mock slider wrapper getBoundingClientRect data
  66. // const wrapper = mount(<Slider style={STYLE} step={1}></Slider>);
  67. // const handle = wrapper.find('.semi-slider-handle');
  68. // const handleNode = handle.getDOMNode();
  69. // handle.simulate('mousedown', { pageX: 13, pageY: 16, target: handleNode }); // these value calculate from storybook, and simulate here
  70. // document.dispatchEvent(new Event('mousemove', { pageX: 55, pageY: 16, target: handleNode, bubbles: true }));
  71. // document.dispatchEvent(new Event('mouseup', { pageX: 55, pageY: 16, target: handleNode, bubbles: true }));
  72. // handle.simulate('mouseup', { pageX: 55, pageY: 16, target: handleNode }); // these value calculate from storybook, and simulate here
  73. // expect(wrapper.state('currentValue')).toBe(54);
  74. // });
  75. it('should show tooltip when hovering slider handler', () => {
  76. const wrapper = mount(<Slider defaultValue={30} />);
  77. wrapper
  78. .find(`.${BASE_CLASS_PREFIX}-slider-handle`)
  79. .at(0)
  80. .simulate('mouseEnter');
  81. expect(render(wrapper.find(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`))).toMatchSnapshot();
  82. wrapper
  83. .find(`.${BASE_CLASS_PREFIX}-slider-handle`)
  84. .at(0)
  85. .simulate('mouseLeave');
  86. expect(render(wrapper.find(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`))).toMatchSnapshot();
  87. });
  88. it('when hover into slider', () => {
  89. let wrapper = mount(<Slider showBoundary={true} />);
  90. wrapper
  91. .find(`.${BASE_CLASS_PREFIX}-slider-wrapper`)
  92. .at(0)
  93. .simulate('mouseEnter');
  94. expect(
  95. wrapper
  96. .find(`.${BASE_CLASS_PREFIX}-slider-boundary`)
  97. .at(0)
  98. .hasClass(`${BASE_CLASS_PREFIX}-slider-boundary-show`)
  99. ).toEqual(true);
  100. wrapper
  101. .find(`.${BASE_CLASS_PREFIX}-slider-wrapper`)
  102. .at(0)
  103. .simulate('mouseLeave');
  104. expect(
  105. wrapper
  106. .find(`.${BASE_CLASS_PREFIX}-slider-boundary`)
  107. .at(0)
  108. .hasClass(`${BASE_CLASS_PREFIX}-slider-boundary-show`)
  109. ).toEqual(false);
  110. });
  111. it('when range is true or defaultValue is array', () => {
  112. let wrapper = shallow(<Slider range defaultValue={[1, 29]} />);
  113. let wrapper2 = shallow(<Slider range />);
  114. expect(wrapper.find(`.${BASE_CLASS_PREFIX}-slider-handle`).length === 2).toEqual(true);
  115. expect(wrapper2.find(`.${BASE_CLASS_PREFIX}-slider-handle`).length === 2).toEqual(true);
  116. expect(wrapper.state().currentValue).toEqual([1, 29]);
  117. });
  118. it('has marks', () => {
  119. let wrapper = shallow(<Slider marks={{ 20: '20c', 40: '40c' }} defaultValue={[0, 100]} range />);
  120. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-slider-dot`)).toBe(true);
  121. });
  122. it('marks clickable', () => {
  123. const STYLE = { width: 100, height: 32 }; // it is really hack to mock slider wrapper getBoundingClientRect data
  124. let slider = mount(<Slider style={STYLE} marks={{ 20: '20c', 40: '40c' }} defaultValue={[0, 100]} range />);
  125. expect(slider.exists(`.${BASE_CLASS_PREFIX}-slider-dot`)).toBe(true);
  126. expect(slider.state('currentValue')).toEqual([0, 100])
  127. slider.find(`.${BASE_CLASS_PREFIX}-slider-dot`).at(0).simulate('click', {pageX: 20 })
  128. expect(slider.state('currentValue')).toEqual([20, 100])
  129. });
  130. it('when tooltipVisible is true, tooltip should show always, or should never show', () => {
  131. let wrapper = mount(<Slider defaultValue={30} tooltipVisible />);
  132. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`)).toBe(true);
  133. wrapper.find(`.${BASE_CLASS_PREFIX}-slider-handle`).at(0).simulate('mouseEnter');
  134. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`)).toBe(true);
  135. wrapper = mount(<Slider defaultValue={30} tooltipVisible={null} />);
  136. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`)).toBe(false);
  137. });
  138. it('disabled', () => {
  139. let wrapper = shallow(<Slider disabled defaultValue={10} />);
  140. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-slider-disabled`)).toBe(true);
  141. wrapper.setProps({ disabled: false });
  142. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-slider-disabled`)).toBe(false);
  143. });
  144. });