searchBar.spec.jsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import React from 'react';
  2. import {mount} from 'enzyme';
  3. import SearchBar from 'app/views/organizationEvents/searchBar';
  4. import TagStore from 'app/stores/tagStore';
  5. const focusInput = el => el.find('input[name="query"]').simulate('focus');
  6. const selectFirstAutocompleteItem = el => {
  7. focusInput(el);
  8. el
  9. .find('.search-autocomplete-item')
  10. .first()
  11. .simulate('click');
  12. const input = el.find('input');
  13. input
  14. .getDOMNode()
  15. .setSelectionRange(input.prop('value').length, input.prop('value').length);
  16. return el;
  17. };
  18. const setQuery = (el, query) => {
  19. el
  20. .find('input')
  21. .simulate('change', {target: {value: query}})
  22. .getDOMNode()
  23. .setSelectionRange(query.length, query.length);
  24. };
  25. describe('SearchBar', function() {
  26. let options;
  27. let tagValuesMock;
  28. let tagKeysMock;
  29. let organization = TestStubs.Organization();
  30. let props = {
  31. organization,
  32. };
  33. beforeEach(function() {
  34. TagStore.reset();
  35. TagStore.onLoadTagsSuccess(TestStubs.Tags());
  36. options = TestStubs.routerContext();
  37. tagValuesMock = MockApiClient.addMockResponse({
  38. url: '/organizations/org-slug/tags/gpu/values/',
  39. body: [{count: 2, name: 'Nvidia 1080ti'}],
  40. });
  41. tagKeysMock = MockApiClient.addMockResponse({
  42. url: '/organizations/org-slug/tags/',
  43. body: [{count: 3, key: 'gpu'}, {count: 3, key: 'mytag'}],
  44. });
  45. });
  46. afterEach(function() {
  47. MockApiClient.clearMockResponses();
  48. });
  49. it('fetches organization tags on mount', async function() {
  50. let wrapper = await mount(<SearchBar {...props} />, options);
  51. expect(tagKeysMock).toHaveBeenCalledTimes(1);
  52. wrapper.update();
  53. expect(wrapper.find('SmartSearchBar').prop('supportedTags')).toEqual(
  54. expect.objectContaining({
  55. gpu: {key: 'gpu', name: 'gpu'},
  56. mytag: {key: 'mytag', name: 'mytag'},
  57. })
  58. );
  59. });
  60. it('searches and selects an event field value', async function() {
  61. let wrapper = await mount(<SearchBar {...props} />, options);
  62. setQuery(wrapper, 'gpu:');
  63. expect(tagValuesMock).toHaveBeenCalledWith(
  64. '/organizations/org-slug/tags/gpu/values/',
  65. expect.objectContaining({data: {query: ''}})
  66. );
  67. await tick();
  68. wrapper.update();
  69. expect(wrapper.find('SearchDropdown').prop('searchSubstring')).toEqual('');
  70. expect(wrapper.find('SearchDropdown').prop('items')).toEqual([
  71. expect.objectContaining({
  72. value: '"Nvidia 1080ti"',
  73. }),
  74. ]);
  75. selectFirstAutocompleteItem(wrapper);
  76. wrapper.update();
  77. expect(wrapper.find('input').prop('value')).toBe('gpu:"Nvidia 1080ti" ');
  78. });
  79. it('does not requery for event field values if query does not change', async function() {
  80. let wrapper = await mount(<SearchBar {...props} />, options);
  81. setQuery(wrapper, 'gpu:');
  82. expect(tagValuesMock).toHaveBeenCalledTimes(1);
  83. // Click will fire "updateAutocompleteItems"
  84. wrapper.find('input').simulate('click');
  85. await tick();
  86. wrapper.update();
  87. expect(tagValuesMock).toHaveBeenCalledTimes(1);
  88. });
  89. it('removes highlight when query is empty', async function() {
  90. let wrapper = await mount(<SearchBar {...props} />, options);
  91. setQuery(wrapper, 'gpu');
  92. await tick();
  93. wrapper.update();
  94. expect(wrapper.find('.search-description strong').text()).toBe('gpu');
  95. // Should have nothing highlighted
  96. setQuery(wrapper, '');
  97. expect(wrapper.find('.search-description strong')).toHaveLength(0);
  98. });
  99. it('ignores negation ("!") at the beginning of search term', async function() {
  100. let wrapper = await mount(<SearchBar {...props} />, options);
  101. setQuery(wrapper, '!gp');
  102. await tick();
  103. wrapper.update();
  104. expect(wrapper.find('.search-autocomplete-item')).toHaveLength(1);
  105. expect(wrapper.find('.search-autocomplete-item').text()).toBe('gpu:');
  106. });
  107. it('ignores wildcard ("*") at the beginning of tag value query', async function() {
  108. let wrapper = await mount(<SearchBar {...props} />, options);
  109. setQuery(wrapper, '!gpu:*');
  110. await tick();
  111. wrapper.update();
  112. expect(tagValuesMock).toHaveBeenCalledWith(
  113. '/organizations/org-slug/tags/gpu/values/',
  114. expect.objectContaining({data: {query: ''}})
  115. );
  116. selectFirstAutocompleteItem(wrapper);
  117. expect(wrapper.find('input').prop('value')).toBe('!gpu:*"Nvidia 1080ti" ');
  118. });
  119. });