1
0

textArea.test.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import TextArea from '../textarea';
  2. import Icon from '../../icons/index';
  3. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
  4. import GraphemeSplitter from 'grapheme-splitter';
  5. import { isString } from 'lodash';
  6. function getValueLength(str) {
  7. if (isString(str)) {
  8. const splitter = new GraphemeSplitter();
  9. return splitter.countGraphemes(str);
  10. } else {
  11. return -1;
  12. }
  13. }
  14. describe('TextArea', () => {
  15. it('TextArea with custom className & style', () => {
  16. const wrapper = mount(<TextArea className='test' style={{ color: 'red' }} />);
  17. expect(wrapper.hasClass('test')).toEqual(true);
  18. expect(wrapper.find('div.test')).toHaveStyle('color', 'red');
  19. });
  20. it('TextArea defaultValue', () => {
  21. let defaultValue = 'semi';
  22. const textAreaWithDefaultValue = mount(<TextArea defaultValue={defaultValue} />);
  23. const textareaDom = textAreaWithDefaultValue.find('textarea');
  24. expect(textareaDom.instance().value).toEqual(defaultValue);
  25. });
  26. it('TextArea onChange trigger when value change', () => {
  27. let textAreaValue = 'semi';
  28. let event = { target: { value: textAreaValue } };
  29. let onChange = value => {
  30. console.log(value);
  31. };
  32. let spyOnChange = sinon.spy(onChange);
  33. const textArea = mount(<TextArea onChange={spyOnChange} />);
  34. textArea.find('textarea').simulate('change', event);
  35. expect(spyOnChange.calledOnce).toBe(true);
  36. expect(spyOnChange.calledWithMatch(textAreaValue)).toBe(true);
  37. })
  38. it('TextArea show maxCount', () => {
  39. const textarea = mount(<TextArea maxCount={10} />);
  40. const counter = textarea.find(`.${BASE_CLASS_PREFIX}-input-textarea-counter`);
  41. expect(counter.instance().textContent).toEqual('0/10');
  42. textarea.setProps({ value: 'semi' });
  43. expect(counter.instance().textContent).toEqual('4/10');
  44. });
  45. it('TextArea with placeholder', () => {
  46. let placeholderText = 'semi placeholder';
  47. const textarea = mount(<TextArea placeholder={placeholderText} />);
  48. let textareaDom = textarea.find('textarea');
  49. expect(textareaDom.props().placeholder).toEqual(placeholderText);
  50. })
  51. it('TextArea disabled', () => {
  52. const textarea = mount(<TextArea disabled />);
  53. let textareaDom = textarea.find(`textarea.${BASE_CLASS_PREFIX}-input-textarea-disabled`);
  54. expect(textareaDom.props().disabled).toEqual(true);
  55. })
  56. it('TextArea showClear / onClear', () => {
  57. const spyOnClear = sinon.spy(()=>{});
  58. const textarea = mount(<TextArea showClear defaultValue='123' onClear={spyOnClear}/>);
  59. textarea.simulate('mouseEnter', {}).find(`.${BASE_CLASS_PREFIX}-input-clearbtn`).simulate('click');
  60. expect(spyOnClear.calledOnce).toBe(true);
  61. expect(textarea.find(`.${BASE_CLASS_PREFIX}-input-textarea`).getDOMNode().textContent).toEqual('');
  62. })
  63. // TODO
  64. // it('TextArea autosize', () => {
  65. // let placeholderText = 'semi placeholder';
  66. // const textarea = mount(<TextArea autoSize />);
  67. // let textareaDom = textarea.find('textarea');
  68. // expect(textareaDom.props().placeholder).toEqual(placeholderText);
  69. // })
  70. it('TextArea onEnterPress', () => {
  71. let onEnterPress = e => {
  72. console.log(e);
  73. };
  74. let spyOnPressEnter = sinon.spy(onEnterPress);
  75. const textArea = mount(<TextArea onEnterPress={spyOnPressEnter} />);
  76. let event = { key: 'Enter', keyCode: 13 };
  77. // textArea.find('textarea').simulate('keypress', event);
  78. textArea.find('textarea').simulate('keydown', event);
  79. expect(spyOnPressEnter.calledOnce).toBe(true);
  80. });
  81. it('TextArea controlled mode', () => {
  82. let onChange = e => {
  83. console.log(e);
  84. };
  85. let spyOnChange = sinon.spy(onChange);
  86. const textArea = mount(<TextArea onChange={spyOnChange} value='semi' />);
  87. const textareaDom = textArea.find('textarea');
  88. expect(textareaDom.instance().value).toEqual('semi');
  89. let newValue = 'vita lemon';
  90. let event = { target: { value: newValue } };
  91. textArea.find('textarea').simulate('change', event);
  92. expect(spyOnChange.calledOnce).toBe(true);
  93. expect(spyOnChange.calledWithMatch(newValue)).toBe(true);
  94. textArea.setProps({ value: newValue });
  95. expect(textareaDom.instance().value).toEqual(newValue);
  96. });
  97. it('TextArea maxCount exceed', async () => {
  98. const defaultValue = '💖💖💖💖💖💖💖💖💖💖';
  99. const textarea = mount(<TextArea defaultValue={defaultValue} maxCount={10} />);
  100. const counter = textarea.find(`.${BASE_CLASS_PREFIX}-input-textarea-counter`);
  101. expect(counter.hasClass('semi-input-textarea-counter-exceed')).toEqual(true);
  102. textarea.setProps({ getValueLength });
  103. const counter2 = textarea.find(`.${BASE_CLASS_PREFIX}-input-textarea-counter`);
  104. expect(counter2.hasClass('semi-input-textarea-counter-exceed')).toEqual(false);
  105. });
  106. it('test minLength', () => {
  107. let inputValue = '💖💖💖';
  108. let inputValue1 = '💖💖💖💖';
  109. let minLength = 4;
  110. let event = { target: { value: inputValue } };
  111. let event1 = { target: { value: inputValue1 } };
  112. let onChange = value => {
  113. console.log(value);
  114. };
  115. let spyOnChange = sinon.spy(onChange);
  116. const textArea = mount(<TextArea onChange={spyOnChange} minLength={minLength} getValueLength={getValueLength} />);
  117. const textAreaDom = textArea.find('textarea');
  118. textAreaDom.simulate('change', event);
  119. expect(spyOnChange.calledOnce).toBe(true);
  120. expect(spyOnChange.calledWithMatch(textAreaDom)).toBe(true);
  121. expect(textAreaDom.instance().minLength).toEqual(inputValue.length + (minLength - getValueLength(inputValue)));
  122. textAreaDom.simulate('change', event1);
  123. expect(spyOnChange.calledWithMatch(textAreaDom)).toBe(true);
  124. expect(textAreaDom.instance().minLength).toEqual(minLength)
  125. });
  126. it('test maxLength + truncateValue', () => {
  127. function truncateValue(inputValue, maxLength, getValueLength) {
  128. let event = { target: { value: inputValue } };
  129. let onChange = value => {
  130. console.log(value);
  131. };
  132. let spyOnChange = sinon.spy(onChange);
  133. const textArea = mount(<TextArea onChange={spyOnChange} maxLength={maxLength} getValueLength={getValueLength} />);
  134. const textAreaDom = textArea.find('textarea');
  135. textAreaDom.simulate('change', event);
  136. expect(spyOnChange.calledOnce).toBe(true);
  137. return textAreaDom.instance().value;
  138. }
  139. const testCases = [
  140. // 自定义valueLength
  141. ['Semi', 5, getValueLength, 'Semi'],
  142. ['Semi Design', 4, getValueLength, 'Semi'],
  143. ['💖💖💖💖💖💖💖💖💖💖👨👩👧👦', 10, getValueLength, '💖💖💖💖💖💖💖💖💖💖'],
  144. ['💖', -1, getValueLength, ''],
  145. ['🆗', 1, getValueLength, '🆗'],
  146. ];
  147. for (let [value, length, fc, result] of testCases) {
  148. expect(truncateValue(value, length, fc)).toBe(result);
  149. }
  150. })
  151. })