search_srv.test.ts 8.0 KB

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