dropdownAutoCompleteMenu.spec.jsx 4.9 KB

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