slider.test.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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('when hover into slider', () => {
  76. let wrapper = mount(<Slider showBoundary={true} />);
  77. wrapper
  78. .find(`.${BASE_CLASS_PREFIX}-slider-wrapper`)
  79. .at(0)
  80. .simulate('mouseEnter');
  81. expect(
  82. wrapper
  83. .find(`.${BASE_CLASS_PREFIX}-slider-boundary`)
  84. .at(0)
  85. .hasClass(`${BASE_CLASS_PREFIX}-slider-boundary-show`)
  86. ).toEqual(true);
  87. wrapper
  88. .find(`.${BASE_CLASS_PREFIX}-slider-wrapper`)
  89. .at(0)
  90. .simulate('mouseLeave');
  91. expect(
  92. wrapper
  93. .find(`.${BASE_CLASS_PREFIX}-slider-boundary`)
  94. .at(0)
  95. .hasClass(`${BASE_CLASS_PREFIX}-slider-boundary-show`)
  96. ).toEqual(false);
  97. });
  98. it('when range is true or defaultValue is array', () => {
  99. let wrapper = shallow(<Slider range defaultValue={[1, 29]} />);
  100. let wrapper2 = shallow(<Slider range />);
  101. expect(wrapper.find(`.${BASE_CLASS_PREFIX}-slider-handle`).length === 2).toEqual(true);
  102. expect(wrapper2.find(`.${BASE_CLASS_PREFIX}-slider-handle`).length === 2).toEqual(true);
  103. expect(wrapper.state().currentValue).toEqual([1, 29]);
  104. });
  105. it('has marks', () => {
  106. let wrapper = shallow(<Slider marks={{ 20: '20c', 40: '40c' }} defaultValue={[0, 100]} range />);
  107. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-slider-dot`)).toBe(true);
  108. });
  109. it('marks clickable', () => {
  110. const STYLE = { width: 100, height: 32 }; // it is really hack to mock slider wrapper getBoundingClientRect data
  111. let slider = mount(<Slider style={STYLE} marks={{ 20: '20c', 40: '40c' }} defaultValue={[0, 100]} range />);
  112. expect(slider.exists(`.${BASE_CLASS_PREFIX}-slider-dot`)).toBe(true);
  113. expect(slider.state('currentValue')).toEqual([0, 100])
  114. slider.find(`.${BASE_CLASS_PREFIX}-slider-dot`).at(0).simulate('click', {pageX: 20 })
  115. expect(slider.state('currentValue')).toEqual([20, 100])
  116. });
  117. it('when tooltipVisible is true, tooltip should show always, or should never show', () => {
  118. let wrapper = mount(<Slider defaultValue={30} tooltipVisible />);
  119. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`)).toBe(true);
  120. wrapper.find(`.${BASE_CLASS_PREFIX}-slider-handle`).at(0).simulate('mouseEnter');
  121. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`)).toBe(true);
  122. wrapper = mount(<Slider defaultValue={30} tooltipVisible={null} />);
  123. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`)).toBe(false);
  124. });
  125. it('disabled', () => {
  126. let wrapper = shallow(<Slider disabled defaultValue={10} />);
  127. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-slider-disabled`)).toBe(true);
  128. wrapper.setProps({ disabled: false });
  129. expect(wrapper.exists(`.${BASE_CLASS_PREFIX}-slider-disabled`)).toBe(false);
  130. });
  131. });