dropdownAutoCompleteMenu.spec.jsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. 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).toMatchSnapshot();
  55. });
  56. it('selects', function() {
  57. const mock = jest.fn();
  58. const wrapper = mount(
  59. <DropdownAutoCompleteMenu
  60. isOpen={true}
  61. items={[
  62. {
  63. value: 'countries',
  64. label: 'countries',
  65. items: [
  66. {
  67. value: 'new zealand',
  68. label: <div>New Zealand</div>,
  69. },
  70. {
  71. value: 'australia',
  72. label: <div>Australia</div>,
  73. },
  74. ],
  75. },
  76. ]}
  77. >
  78. {({selectedItem}) => (selectedItem ? selectedItem.label : 'Click me!')}
  79. </DropdownAutoCompleteMenu>,
  80. routerContext
  81. );
  82. wrapper
  83. .find('AutoCompleteItem')
  84. .last()
  85. .simulate('click');
  86. expect(mock).toMatchSnapshot();
  87. });
  88. it('shows empty message when there are no items', function() {
  89. const wrapper = mount(
  90. <DropdownAutoCompleteMenu
  91. emptyHidesInput
  92. isOpen={true}
  93. items={[]}
  94. emptyMessage="No items!"
  95. >
  96. {({selectedItem}) => (selectedItem ? selectedItem.label : 'Click me!')}
  97. </DropdownAutoCompleteMenu>,
  98. routerContext
  99. );
  100. expect(wrapper.find('EmptyMessage')).toHaveLength(1);
  101. expect(wrapper.find('EmptyMessage').text()).toBe('No items!');
  102. // No input because there are no items
  103. expect(wrapper.find('StyledInput')).toHaveLength(0);
  104. });
  105. it('shows default empty results message when there are no items found in search', function() {
  106. const wrapper = mount(
  107. <DropdownAutoCompleteMenu isOpen={true} items={items} emptyMessage="No items!">
  108. {({selectedItem}) => (selectedItem ? selectedItem.label : 'Click me!')}
  109. </DropdownAutoCompleteMenu>,
  110. routerContext
  111. );
  112. wrapper.find('StyledInput').simulate('change', {target: {value: 'U-S-A'}});
  113. expect(wrapper.find('EmptyMessage')).toHaveLength(1);
  114. expect(wrapper.find('EmptyMessage').text()).toBe('No items! found');
  115. });
  116. it('overrides default empty results message', function() {
  117. const wrapper = mount(
  118. <DropdownAutoCompleteMenu
  119. isOpen={true}
  120. items={items}
  121. emptyMessage="No items!"
  122. noResultsMessage="No search results"
  123. >
  124. {({selectedItem}) => (selectedItem ? selectedItem.label : 'Click me!')}
  125. </DropdownAutoCompleteMenu>,
  126. routerContext
  127. );
  128. wrapper.find('StyledInput').simulate('change', {target: {value: 'U-S-A'}});
  129. expect(wrapper.find('EmptyMessage').text()).toBe('No search results');
  130. });
  131. it('hides filter with `hideInput` prop', function() {
  132. const wrapper = mount(
  133. <DropdownAutoCompleteMenu isOpen={true} items={items} hideInput>
  134. {() => 'Click Me!'}
  135. </DropdownAutoCompleteMenu>,
  136. routerContext
  137. );
  138. expect(wrapper.find('StyledInput')).toHaveLength(0);
  139. });
  140. it('filters using a value from prop instead of input', function() {
  141. const wrapper = mount(
  142. <DropdownAutoCompleteMenu isOpen={true} items={items} filterValue="Apple">
  143. {() => 'Click Me!'}
  144. </DropdownAutoCompleteMenu>,
  145. routerContext
  146. );
  147. wrapper.find('StyledInput').simulate('change', {target: {value: 'U-S-A'}});
  148. expect(wrapper.find('EmptyMessage')).toHaveLength(0);
  149. expect(wrapper.find('AutoCompleteItem')).toHaveLength(1);
  150. expect(wrapper.find('AutoCompleteItem').text()).toBe('Apple');
  151. });
  152. });