queryList.spec.jsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import {browserHistory} from 'react-router';
  2. import {mountWithTheme} from 'sentry-test/enzyme';
  3. import QueryList from 'app/views/eventsV2/queryList';
  4. function openContextMenu(card) {
  5. card.find('DropdownMenu MoreOptions svg').simulate('click');
  6. }
  7. function clickMenuItem(card, selector) {
  8. card.find(`DropdownMenu MenuItem[data-test-id="${selector}"]`).simulate('click');
  9. }
  10. describe('EventsV2 > QueryList', function () {
  11. let location, savedQueries, organization, deleteMock, duplicateMock, queryChangeMock;
  12. beforeEach(function () {
  13. organization = TestStubs.Organization();
  14. savedQueries = [
  15. TestStubs.DiscoverSavedQuery(),
  16. TestStubs.DiscoverSavedQuery({name: 'saved query 2', id: '2'}),
  17. ];
  18. MockApiClient.addMockResponse({
  19. url: '/organizations/org-slug/events-stats/',
  20. method: 'GET',
  21. statusCode: 200,
  22. body: {data: []},
  23. });
  24. deleteMock = MockApiClient.addMockResponse({
  25. url: '/organizations/org-slug/discover/saved/2/',
  26. method: 'DELETE',
  27. statusCode: 200,
  28. body: {},
  29. });
  30. duplicateMock = MockApiClient.addMockResponse({
  31. url: '/organizations/org-slug/discover/saved/',
  32. method: 'POST',
  33. body: {
  34. id: '3',
  35. name: 'Saved query copy',
  36. },
  37. });
  38. location = {
  39. pathname: '/organizations/org-slug/discover/queries/',
  40. query: {cursor: '0:1:1', statsPeriod: '14d'},
  41. };
  42. queryChangeMock = jest.fn();
  43. });
  44. it('renders an empty list', function () {
  45. const wrapper = mountWithTheme(
  46. <QueryList
  47. organization={organization}
  48. savedQueries={[]}
  49. savedQuerySearchQuery="no matches"
  50. pageLinks=""
  51. onQueryChange={queryChangeMock}
  52. location={location}
  53. />,
  54. TestStubs.routerContext()
  55. );
  56. const content = wrapper.find('QueryCard');
  57. // No queries
  58. expect(content).toHaveLength(0);
  59. expect(wrapper.find('EmptyStateWarning')).toHaveLength(1);
  60. });
  61. it('renders pre-built queries and saved ones', function () {
  62. const wrapper = mountWithTheme(
  63. <QueryList
  64. organization={organization}
  65. savedQueries={savedQueries}
  66. renderPrebuilt
  67. pageLinks=""
  68. onQueryChange={queryChangeMock}
  69. location={location}
  70. />,
  71. TestStubs.routerContext()
  72. );
  73. const content = wrapper.find('QueryCard');
  74. // pre built + saved queries
  75. expect(content).toHaveLength(5);
  76. });
  77. it('can duplicate and trigger change callback', async function () {
  78. const wrapper = mountWithTheme(
  79. <QueryList
  80. organization={organization}
  81. savedQueries={savedQueries}
  82. pageLinks=""
  83. onQueryChange={queryChangeMock}
  84. location={location}
  85. />,
  86. TestStubs.routerContext()
  87. );
  88. let card = wrapper.find('QueryCard').last();
  89. expect(card.find('QueryCardContent').text()).toEqual(savedQueries[1].name);
  90. openContextMenu(card);
  91. wrapper.update();
  92. // Get a fresh node
  93. card = wrapper.find('QueryCard').last();
  94. clickMenuItem(card, 'duplicate-query');
  95. // wait for request
  96. await wrapper.update();
  97. expect(duplicateMock).toHaveBeenCalled();
  98. expect(queryChangeMock).toHaveBeenCalled();
  99. });
  100. it('can delete and trigger change callback', async function () {
  101. const wrapper = mountWithTheme(
  102. <QueryList
  103. organization={organization}
  104. savedQueries={savedQueries}
  105. pageLinks=""
  106. onQueryChange={queryChangeMock}
  107. location={location}
  108. />,
  109. TestStubs.routerContext()
  110. );
  111. let card = wrapper.find('QueryCard').last();
  112. expect(card.find('QueryCardContent').text()).toEqual(savedQueries[1].name);
  113. openContextMenu(card);
  114. wrapper.update();
  115. card = wrapper.find('QueryCard').last();
  116. clickMenuItem(card, 'delete-query');
  117. // wait for request
  118. await wrapper.update();
  119. expect(deleteMock).toHaveBeenCalled();
  120. expect(queryChangeMock).toHaveBeenCalled();
  121. });
  122. it('returns short url location for saved query', async function () {
  123. const wrapper = mountWithTheme(
  124. <QueryList
  125. organization={organization}
  126. savedQueries={savedQueries}
  127. pageLinks=""
  128. onQueryChange={queryChangeMock}
  129. location={location}
  130. />,
  131. TestStubs.routerContext()
  132. );
  133. const card = wrapper.find('QueryCard').last();
  134. const link = card.find('Link').last().prop('to');
  135. expect(link.pathname).toEqual('/organizations/org-slug/discover/results/');
  136. expect(link.query).toEqual({
  137. id: '2',
  138. statsPeriod: '14d',
  139. user: '1',
  140. });
  141. });
  142. it('can redirect on last query deletion', async function () {
  143. const wrapper = mountWithTheme(
  144. <QueryList
  145. organization={organization}
  146. savedQueries={savedQueries.slice(1)}
  147. pageLinks=""
  148. onQueryChange={queryChangeMock}
  149. location={location}
  150. />,
  151. TestStubs.routerContext()
  152. );
  153. let card = wrapper.find('QueryCard').last();
  154. expect(card.find('QueryCardContent').text()).toEqual(savedQueries[1].name);
  155. // Open the context menu
  156. openContextMenu(card);
  157. wrapper.update();
  158. card = wrapper.find('QueryCard').last();
  159. clickMenuItem(card, 'delete-query');
  160. // wait for request
  161. await wrapper.update();
  162. expect(deleteMock).toHaveBeenCalled();
  163. expect(queryChangeMock).not.toHaveBeenCalled();
  164. expect(browserHistory.push).toHaveBeenCalledWith({
  165. pathname: location.pathname,
  166. query: {cursor: undefined, statsPeriod: '14d'},
  167. });
  168. });
  169. });