search_srv.test.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. import { SearchSrv } from 'app/core/services/search_srv';
  2. import { BackendSrvMock } from 'test/mocks/backend_srv';
  3. import impressionSrv from 'app/core/services/impression_srv';
  4. import { contextSrv } from 'app/core/services/context_srv';
  5. import { beforeEach } from 'test/lib/common';
  6. jest.mock('app/core/store', () => {
  7. return {
  8. getBool: jest.fn(),
  9. set: jest.fn(),
  10. };
  11. });
  12. jest.mock('app/core/services/impression_srv', () => {
  13. return {
  14. getDashboardOpened: jest.fn,
  15. };
  16. });
  17. describe('SearchSrv', () => {
  18. let searchSrv, backendSrvMock;
  19. beforeEach(() => {
  20. backendSrvMock = new BackendSrvMock();
  21. searchSrv = new SearchSrv(backendSrvMock, Promise);
  22. contextSrv.isSignedIn = true;
  23. impressionSrv.getDashboardOpened = jest.fn().mockReturnValue([]);
  24. });
  25. describe('With recent dashboards', () => {
  26. let results;
  27. beforeEach(() => {
  28. backendSrvMock.search = jest
  29. .fn()
  30. .mockReturnValueOnce(
  31. Promise.resolve([{ id: 2, title: 'second but first' }, { id: 1, title: 'first but second' }])
  32. )
  33. .mockReturnValue(Promise.resolve([]));
  34. impressionSrv.getDashboardOpened = jest.fn().mockReturnValue([1, 2]);
  35. return searchSrv.search({ query: '' }).then(res => {
  36. results = res;
  37. });
  38. });
  39. it('should include recent dashboards section', () => {
  40. expect(results[0].title).toBe('Recent');
  41. });
  42. it('should return order decided by impressions store not api', () => {
  43. expect(results[0].items[0].title).toBe('first but second');
  44. expect(results[0].items[1].title).toBe('second but first');
  45. });
  46. describe('and 3 recent dashboards removed in backend', () => {
  47. let results;
  48. beforeEach(() => {
  49. backendSrvMock.search = jest
  50. .fn()
  51. .mockReturnValueOnce(Promise.resolve([{ id: 2, title: 'two' }, { id: 1, title: 'one' }]))
  52. .mockReturnValue(Promise.resolve([]));
  53. impressionSrv.getDashboardOpened = jest.fn().mockReturnValue([4, 5, 1, 2, 3]);
  54. return searchSrv.search({ query: '' }).then(res => {
  55. results = res;
  56. });
  57. });
  58. it('should return 2 dashboards', () => {
  59. expect(results[0].items.length).toBe(2);
  60. expect(results[0].items[0].id).toBe(1);
  61. expect(results[0].items[1].id).toBe(2);
  62. });
  63. });
  64. });
  65. describe('With starred dashboards', () => {
  66. let results;
  67. beforeEach(() => {
  68. backendSrvMock.search = jest.fn().mockReturnValue(Promise.resolve([{ id: 1, title: 'starred' }]));
  69. return searchSrv.search({ query: '' }).then(res => {
  70. results = res;
  71. });
  72. });
  73. it('should include starred dashboards section', () => {
  74. expect(results[0].title).toBe('Starred');
  75. expect(results[0].items.length).toBe(1);
  76. });
  77. });
  78. describe('With starred dashboards and recent', () => {
  79. let results;
  80. beforeEach(() => {
  81. backendSrvMock.search = jest
  82. .fn()
  83. .mockReturnValueOnce(
  84. Promise.resolve([{ id: 1, title: 'starred and recent', isStarred: true }, { id: 2, title: 'recent' }])
  85. )
  86. .mockReturnValue(Promise.resolve([{ id: 1, title: 'starred and recent' }]));
  87. impressionSrv.getDashboardOpened = jest.fn().mockReturnValue([1, 2]);
  88. return searchSrv.search({ query: '' }).then(res => {
  89. results = res;
  90. });
  91. });
  92. it('should not show starred in recent', () => {
  93. expect(results[1].title).toBe('Recent');
  94. expect(results[1].items[0].title).toBe('recent');
  95. });
  96. it('should show starred', () => {
  97. expect(results[0].title).toBe('Starred');
  98. expect(results[0].items[0].title).toBe('starred and recent');
  99. });
  100. });
  101. describe('with no query string and dashboards with folders returned', () => {
  102. let results;
  103. beforeEach(() => {
  104. backendSrvMock.search = jest
  105. .fn()
  106. .mockReturnValueOnce(Promise.resolve([]))
  107. .mockReturnValue(
  108. Promise.resolve([
  109. {
  110. title: 'folder1',
  111. type: 'dash-folder',
  112. id: 1,
  113. },
  114. {
  115. title: 'dash with no folder',
  116. type: 'dash-db',
  117. id: 2,
  118. },
  119. {
  120. title: 'dash in folder1 1',
  121. type: 'dash-db',
  122. id: 3,
  123. folderId: 1,
  124. },
  125. {
  126. title: 'dash in folder1 2',
  127. type: 'dash-db',
  128. id: 4,
  129. folderId: 1,
  130. },
  131. ])
  132. );
  133. return searchSrv.search({ query: '' }).then(res => {
  134. results = res;
  135. });
  136. });
  137. it('should create sections for each folder and root', () => {
  138. expect(results).toHaveLength(2);
  139. });
  140. it('should place folders first', () => {
  141. expect(results[0].title).toBe('folder1');
  142. });
  143. });
  144. describe('with query string and dashboards with folders returned', () => {
  145. let results;
  146. beforeEach(() => {
  147. backendSrvMock.search = jest.fn();
  148. backendSrvMock.search.mockReturnValue(
  149. Promise.resolve([
  150. {
  151. id: 2,
  152. title: 'dash with no folder',
  153. type: 'dash-db',
  154. },
  155. {
  156. id: 3,
  157. title: 'dash in folder1 1',
  158. type: 'dash-db',
  159. folderId: 1,
  160. folderUid: 'uid',
  161. folderTitle: 'folder1',
  162. folderUrl: '/dashboards/f/uid/folder1',
  163. },
  164. ])
  165. );
  166. return searchSrv.search({ query: 'search' }).then(res => {
  167. results = res;
  168. });
  169. });
  170. it('should not specify folder ids', () => {
  171. expect(backendSrvMock.search.mock.calls[0][0].folderIds).toHaveLength(0);
  172. });
  173. it('should group results by folder', () => {
  174. expect(results).toHaveLength(2);
  175. expect(results[0].id).toEqual(0);
  176. expect(results[1].id).toEqual(1);
  177. expect(results[1].uid).toEqual('uid');
  178. expect(results[1].title).toEqual('folder1');
  179. expect(results[1].url).toEqual('/dashboards/f/uid/folder1');
  180. });
  181. });
  182. describe('with tags', () => {
  183. beforeEach(() => {
  184. backendSrvMock.search = jest.fn();
  185. backendSrvMock.search.mockReturnValue(Promise.resolve([]));
  186. return searchSrv.search({ tag: ['atag'] }).then(() => {});
  187. });
  188. it('should send tags query to backend search', () => {
  189. expect(backendSrvMock.search.mock.calls[0][0].tag).toHaveLength(1);
  190. });
  191. });
  192. describe('with starred', () => {
  193. beforeEach(() => {
  194. backendSrvMock.search = jest.fn();
  195. backendSrvMock.search.mockReturnValue(Promise.resolve([]));
  196. return searchSrv.search({ starred: true }).then(() => {});
  197. });
  198. it('should send starred query to backend search', () => {
  199. expect(backendSrvMock.search.mock.calls[0][0].starred).toEqual(true);
  200. });
  201. });
  202. describe('when skipping recent dashboards', () => {
  203. let getRecentDashboardsCalled = false;
  204. beforeEach(() => {
  205. backendSrvMock.search = jest.fn();
  206. backendSrvMock.search.mockReturnValue(Promise.resolve([]));
  207. searchSrv.getRecentDashboards = () => {
  208. getRecentDashboardsCalled = true;
  209. };
  210. return searchSrv.search({ skipRecent: true }).then(() => {});
  211. });
  212. it('should not fetch recent dashboards', () => {
  213. expect(getRecentDashboardsCalled).toBeFalsy();
  214. });
  215. });
  216. describe('when skipping starred dashboards', () => {
  217. let getStarredCalled = false;
  218. beforeEach(() => {
  219. backendSrvMock.search = jest.fn();
  220. backendSrvMock.search.mockReturnValue(Promise.resolve([]));
  221. impressionSrv.getDashboardOpened = jest.fn().mockReturnValue([]);
  222. searchSrv.getStarred = () => {
  223. getStarredCalled = true;
  224. };
  225. return searchSrv.search({ skipStarred: true }).then(() => {});
  226. });
  227. it('should not fetch starred dashboards', () => {
  228. expect(getStarredCalled).toBeFalsy();
  229. });
  230. });
  231. });