index.spec.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. import Field from '..';
  2. import { mount, later } from '../../../test/utils';
  3. test('input event', () => {
  4. const wrapper = mount(Field);
  5. const input = wrapper.find('input');
  6. input.element.value = '1';
  7. input.trigger('input');
  8. expect(wrapper.emitted('input')[0][0]).toEqual('1');
  9. });
  10. test('click icon event', () => {
  11. const onIconClick = jest.fn();
  12. const wrapper = mount(Field, {
  13. propsData: {
  14. value: 'a',
  15. leftIcon: 'contact',
  16. rightIcon: 'search',
  17. onIconClick
  18. }
  19. });
  20. wrapper.find('.van-field__left-icon').trigger('click');
  21. wrapper.find('.van-field__right-icon').trigger('click');
  22. expect(wrapper.emitted('click-icon')).toBeTruthy();
  23. expect(wrapper.emitted('click-left-icon')).toBeTruthy();
  24. expect(wrapper.emitted('click-right-icon')).toBeTruthy();
  25. expect(onIconClick).toHaveBeenCalled();
  26. });
  27. test('keypress event', () => {
  28. const wrapper = mount(Field, {
  29. propsData: {
  30. value: '',
  31. type: 'number'
  32. }
  33. });
  34. const fn = jest.fn();
  35. const { calls } = fn.mock;
  36. const press = keyCode => wrapper.vm.onKeypress({
  37. keyCode,
  38. preventDefault: fn
  39. });
  40. press(0);
  41. expect(calls.length).toBe(1);
  42. press(50);
  43. expect(calls.length).toBe(1);
  44. wrapper.setProps({ value: '0.1' });
  45. press(46);
  46. expect(calls.length).toBe(2);
  47. wrapper.setProps({ type: 'text' });
  48. press(0);
  49. expect(calls.length).toBe(2);
  50. });
  51. test('render textarea', async () => {
  52. const wrapper = mount(Field, {
  53. propsData: {
  54. type: 'textarea',
  55. autosize: true
  56. }
  57. });
  58. await later();
  59. expect(wrapper).toMatchSnapshot();
  60. });
  61. test('autosize textarea field', () => {
  62. const wrapper = mount(Field, {
  63. propsData: {
  64. type: 'textarea',
  65. autosize: {}
  66. }
  67. });
  68. const value = '1'.repeat(20);
  69. const textarea = wrapper.find('.van-field__control');
  70. wrapper.setProps({ value });
  71. expect(textarea.element.value).toEqual(value);
  72. });
  73. test('autosize object', async () => {
  74. const wrapper = mount(Field, {
  75. propsData: {
  76. type: 'textarea',
  77. autosize: {
  78. maxHeight: 100,
  79. minHeight: 50
  80. }
  81. }
  82. });
  83. const textarea = wrapper.find('.van-field__control');
  84. await later();
  85. expect(textarea.element.style.height).toEqual(('50px'));
  86. });
  87. test('blur method', () => {
  88. const fn = jest.fn();
  89. const wrapper = mount(Field);
  90. wrapper.vm.$on('blur', fn);
  91. wrapper.find('input').element.focus();
  92. wrapper.vm.blur();
  93. expect(fn).toHaveBeenCalledTimes(1);
  94. });
  95. test('focus method', () => {
  96. const fn = jest.fn();
  97. const wrapper = mount(Field);
  98. wrapper.vm.$on('focus', fn);
  99. wrapper.vm.focus();
  100. expect(fn).toHaveBeenCalledTimes(1);
  101. });
  102. test('maxlength', async () => {
  103. const wrapper = mount(Field, {
  104. attrs: {
  105. maxlength: 3
  106. },
  107. propsData: {
  108. value: 1234,
  109. type: 'number'
  110. }
  111. });
  112. const input = wrapper.find('input');
  113. expect(input.element.value).toEqual('123');
  114. input.element.value = 1234;
  115. await later();
  116. input.trigger('input');
  117. expect(input.element.value).toEqual('123');
  118. expect(wrapper.emitted('input')[0][0]).toEqual('123');
  119. });
  120. test('clearable', () => {
  121. const wrapper = mount(Field, {
  122. propsData: {
  123. value: 'test',
  124. clearable: true
  125. }
  126. });
  127. expect(wrapper).toMatchSnapshot();
  128. const input = wrapper.find('input');
  129. input.trigger('focus');
  130. expect(wrapper).toMatchSnapshot();
  131. wrapper.find('.van-field__clear').trigger('touchstart');
  132. expect(wrapper.emitted('input')[0][0]).toEqual('');
  133. expect(wrapper.emitted('clear')).toBeTruthy();
  134. });
  135. test('render label slot', () => {
  136. const wrapper = mount({
  137. template: `
  138. <field label="Default Label">
  139. <template v-slot:label>Custom Label</template>
  140. </field>
  141. `,
  142. components: {
  143. Field
  144. }
  145. });
  146. expect(wrapper).toMatchSnapshot();
  147. });
  148. test('render right icon with icon prop for old version', () => {
  149. const wrapper = mount(Field, {
  150. propsData: {
  151. icon: 'success'
  152. }
  153. });
  154. expect(wrapper).toMatchSnapshot();
  155. });
  156. test('size prop', () => {
  157. const wrapper = mount(Field, {
  158. propsData: {
  159. size: 'large'
  160. }
  161. });
  162. expect(wrapper).toMatchSnapshot();
  163. });
  164. test('label-width prop with unit', () => {
  165. const wrapper = mount(Field, {
  166. propsData: {
  167. label: 'Label',
  168. labelWidth: '10rem'
  169. }
  170. });
  171. expect(wrapper).toMatchSnapshot();
  172. });
  173. test('label-width prop without unit', () => {
  174. const wrapper = mount(Field, {
  175. propsData: {
  176. label: 'Label',
  177. labelWidth: 100
  178. }
  179. });
  180. expect(wrapper).toMatchSnapshot();
  181. });