dropdownAutoCompleteMenu.spec.jsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import React from 'react';
  2. import {mount} from 'enzyme';
  3. import DropdownAutoCompleteMenu from 'app/components/dropdownAutoCompleteMenu';
  4. describe('DropdownAutoCompleteMenu', function() {
  5. const routerContext = TestStubs.routerContext();
  6. const items = [
  7. {
  8. value: 'apple',
  9. label: <div>Apple</div>,
  10. },
  11. {
  12. value: 'bacon',
  13. label: <div>Bacon</div>,
  14. },
  15. {
  16. value: 'corn',
  17. label: <div>Corn</div>,
  18. },
  19. ];
  20. it('renders without a group', function() {
  21. const wrapper = mount(
  22. <DropdownAutoCompleteMenu isOpen={true} items={items}>
  23. {() => 'Click Me!'}
  24. </DropdownAutoCompleteMenu>,
  25. routerContext
  26. );
  27. expect(wrapper).toMatchSnapshot();
  28. });
  29. it('renders with a group', function() {
  30. const wrapper = mount(
  31. <DropdownAutoCompleteMenu
  32. isOpen={true}
  33. items={[
  34. {
  35. id: 'countries',
  36. value: 'countries',
  37. label: 'countries',
  38. items: [
  39. {
  40. value: 'new zealand',
  41. label: <div>New Zealand</div>,
  42. },
  43. {
  44. value: 'australia',
  45. label: <div>Australia</div>,
  46. },
  47. ],
  48. },
  49. ]}
  50. >
  51. {() => 'Click Me!'}
  52. </DropdownAutoCompleteMenu>,
  53. routerContext
  54. );
  55. expect(wrapper).toMatchSnapshot();
  56. });
  57. it('selects', function() {
  58. const mock = jest.fn();
  59. const wrapper = mount(
  60. <DropdownAutoCompleteMenu
  61. isOpen={true}
  62. items={[
  63. {
  64. id: 'countries',
  65. value: 'countries',
  66. label: 'countries',
  67. items: [
  68. {
  69. value: 'new zealand',
  70. label: <div>New Zealand</div>,
  71. },
  72. {
  73. value: 'australia',
  74. label: <div>Australia</div>,
  75. },
  76. ],
  77. },
  78. ]}
  79. >
  80. {({selectedItem}) => (selectedItem ? selectedItem.label : 'Click me!')}
  81. </DropdownAutoCompleteMenu>,
  82. routerContext
  83. );
  84. wrapper
  85. .find('AutoCompleteItem')
  86. .last()
  87. .simulate('click');
  88. expect(mock).toMatchSnapshot();
  89. });
  90. it('shows empty message when there are no items', function() {
  91. const wrapper = mount(
  92. <DropdownAutoCompleteMenu
  93. emptyHidesInput
  94. isOpen={true}
  95. items={[]}
  96. emptyMessage="No items!"
  97. >
  98. {({selectedItem}) => (selectedItem ? selectedItem.label : 'Click me!')}
  99. </DropdownAutoCompleteMenu>,
  100. routerContext
  101. );
  102. expect(wrapper.find('EmptyMessage')).toHaveLength(1);
  103. expect(wrapper.find('EmptyMessage').text()).toBe('No items!');
  104. // No input because there are no items
  105. expect(wrapper.find('StyledInput')).toHaveLength(0);
  106. });
  107. it('shows default empty results message when there are no items found in search', function() {
  108. const wrapper = mount(
  109. <DropdownAutoCompleteMenu isOpen={true} items={items} emptyMessage="No items!">
  110. {({selectedItem}) => (selectedItem ? selectedItem.label : 'Click me!')}
  111. </DropdownAutoCompleteMenu>,
  112. routerContext
  113. );
  114. wrapper.find('StyledInput').simulate('change', {target: {value: 'U-S-A'}});
  115. expect(wrapper.find('EmptyMessage')).toHaveLength(1);
  116. expect(wrapper.find('EmptyMessage').text()).toBe('No items! found');
  117. });
  118. it('overrides default empty results message', function() {
  119. const wrapper = mount(
  120. <DropdownAutoCompleteMenu
  121. isOpen={true}
  122. items={items}
  123. emptyMessage="No items!"
  124. noResultsMessage="No search results"
  125. >
  126. {({selectedItem}) => (selectedItem ? selectedItem.label : 'Click me!')}
  127. </DropdownAutoCompleteMenu>,
  128. routerContext
  129. );
  130. wrapper.find('StyledInput').simulate('change', {target: {value: 'U-S-A'}});
  131. expect(wrapper.find('EmptyMessage').text()).toBe('No search results');
  132. });
  133. it('hides filter with `hideInput` prop', function() {
  134. const wrapper = mount(
  135. <DropdownAutoCompleteMenu isOpen={true} items={items} hideInput>
  136. {() => 'Click Me!'}
  137. </DropdownAutoCompleteMenu>,
  138. routerContext
  139. );
  140. expect(wrapper.find('StyledInput')).toHaveLength(0);
  141. });
  142. it('filters using a value from prop instead of input', function() {
  143. const wrapper = mount(
  144. <DropdownAutoCompleteMenu isOpen={true} items={items} filterValue="Apple">
  145. {() => 'Click Me!'}
  146. </DropdownAutoCompleteMenu>,
  147. routerContext
  148. );
  149. wrapper.find('StyledInput').simulate('change', {target: {value: 'U-S-A'}});
  150. expect(wrapper.find('EmptyMessage')).toHaveLength(0);
  151. expect(wrapper.find('AutoCompleteItem')).toHaveLength(1);
  152. expect(wrapper.find('AutoCompleteItem').text()).toBe('Apple');
  153. });
  154. });