search_srv.jest.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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 Boards');
  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(
  52. Promise.resolve([{ id: 2, title: 'two' }, { id: 1, title: 'one' }]),
  53. )
  54. .mockReturnValue(Promise.resolve([]));
  55. impressionSrv.getDashboardOpened = jest.fn().mockReturnValue([4, 5, 1, 2, 3]);
  56. return searchSrv.search({ query: '' }).then(res => {
  57. results = res;
  58. });
  59. });
  60. it('should return 2 dashboards', () => {
  61. expect(results[0].items.length).toBe(2);
  62. expect(results[0].items[0].id).toBe(1);
  63. expect(results[0].items[1].id).toBe(2);
  64. });
  65. });
  66. });
  67. describe('With starred dashboards', () => {
  68. let results;
  69. beforeEach(() => {
  70. backendSrvMock.search = jest
  71. .fn()
  72. .mockReturnValue(Promise.resolve([
  73. {id: 1, title: 'starred'}
  74. ]));
  75. return searchSrv.search({ query: '' }).then(res => {
  76. results = res;
  77. });
  78. });
  79. it('should include starred dashboards section', () => {
  80. expect(results[0].title).toBe('Starred Boards');
  81. expect(results[0].items.length).toBe(1);
  82. });
  83. });
  84. describe('With starred dashboards and recent', () => {
  85. let results;
  86. beforeEach(() => {
  87. backendSrvMock.search = jest
  88. .fn()
  89. .mockReturnValueOnce(Promise.resolve([
  90. {id: 1, title: 'starred and recent', isStarred: true},
  91. {id: 2, title: 'recent'}
  92. ]))
  93. .mockReturnValue(Promise.resolve([
  94. {id: 1, title: 'starred and recent'}
  95. ]));
  96. impressionSrv.getDashboardOpened = jest.fn().mockReturnValue([1,2]);
  97. return searchSrv.search({ query: '' }).then(res => {
  98. results = res;
  99. });
  100. });
  101. it('should not show starred in recent', () => {
  102. expect(results[1].title).toBe('Recent Boards');
  103. expect(results[1].items[0].title).toBe('recent');
  104. });
  105. it('should show starred', () => {
  106. expect(results[0].title).toBe('Starred Boards');
  107. expect(results[0].items[0].title).toBe('starred and recent');
  108. });
  109. });
  110. describe('with no query string and dashboards with folders returned', () => {
  111. let results;
  112. beforeEach(() => {
  113. backendSrvMock.search = jest
  114. .fn()
  115. .mockReturnValueOnce(Promise.resolve([]))
  116. .mockReturnValue(
  117. Promise.resolve([
  118. {
  119. title: 'folder1',
  120. type: 'dash-folder',
  121. id: 1,
  122. },
  123. {
  124. title: 'dash with no folder',
  125. type: 'dash-db',
  126. id: 2,
  127. },
  128. {
  129. title: 'dash in folder1 1',
  130. type: 'dash-db',
  131. id: 3,
  132. folderId: 1,
  133. },
  134. {
  135. title: 'dash in folder1 2',
  136. type: 'dash-db',
  137. id: 4,
  138. folderId: 1,
  139. },
  140. ]),
  141. );
  142. return searchSrv.search({ query: '' }).then(res => {
  143. results = res;
  144. });
  145. });
  146. it('should create sections for each folder and root', () => {
  147. expect(results).toHaveLength(2);
  148. });
  149. it('should place folders first', () => {
  150. expect(results[0].title).toBe('folder1');
  151. });
  152. });
  153. describe('with query string and dashboards with folders returned', () => {
  154. let results;
  155. beforeEach(() => {
  156. backendSrvMock.search = jest.fn();
  157. backendSrvMock.search.mockReturnValue(
  158. Promise.resolve([
  159. {
  160. id: 2,
  161. title: 'dash with no folder',
  162. type: 'dash-db',
  163. },
  164. {
  165. id: 3,
  166. title: 'dash in folder1 1',
  167. type: 'dash-db',
  168. folderId: 1,
  169. folderTitle: 'folder1',
  170. },
  171. ]),
  172. );
  173. return searchSrv.search({ query: 'search' }).then(res => {
  174. results = res;
  175. });
  176. });
  177. it('should not specify folder ids', () => {
  178. expect(backendSrvMock.search.mock.calls[0][0].folderIds).toHaveLength(0);
  179. });
  180. it('should group results by folder', () => {
  181. expect(results).toHaveLength(2);
  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. };
  212. return searchSrv.search({ skipRecent: true }).then(() => {});
  213. });
  214. it('should not fetch recent dashboards', () => {
  215. expect(getRecentDashboardsCalled).toBeFalsy();
  216. });
  217. });
  218. describe('when skipping starred dashboards', () => {
  219. let getStarredCalled = false;
  220. beforeEach(() => {
  221. backendSrvMock.search = jest.fn();
  222. backendSrvMock.search.mockReturnValue(Promise.resolve([]));
  223. impressionSrv.getDashboardOpened = jest.fn().mockReturnValue([]);
  224. searchSrv.getStarred = () => {
  225. getStarredCalled = true;
  226. };
  227. return searchSrv.search({ skipStarred: true }).then(() => {});
  228. });
  229. it('should not fetch starred dashboards', () => {
  230. expect(getStarredCalled).toBeFalsy();
  231. });
  232. });
  233. });