search_srv.jest.ts 7.6 KB

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