manage_dashboards.jest.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. import { ManageDashboardsCtrl } from 'app/core/components/manage_dashboards/manage_dashboards';
  2. import { SearchSrv } from 'app/core/services/search_srv';
  3. import q from 'q';
  4. describe('ManageDashboards', () => {
  5. let ctrl;
  6. describe('when browsing dashboards', () => {
  7. beforeEach(() => {
  8. const response = [
  9. {
  10. id: 410,
  11. title: 'afolder',
  12. type: 'dash-folder',
  13. items: [
  14. {
  15. id: 399,
  16. title: 'Dashboard Test',
  17. url: 'dashboard/db/dashboard-test',
  18. icon: 'fa fa-folder',
  19. tags: [],
  20. isStarred: false,
  21. folderId: 410,
  22. folderTitle: 'afolder',
  23. folderSlug: 'afolder',
  24. },
  25. ],
  26. tags: [],
  27. isStarred: false,
  28. },
  29. {
  30. id: 0,
  31. title: 'Root',
  32. icon: 'fa fa-folder-open',
  33. uri: 'db/something-else',
  34. type: 'dash-db',
  35. items: [
  36. {
  37. id: 500,
  38. title: 'Dashboard Test',
  39. url: 'dashboard/db/dashboard-test',
  40. icon: 'fa fa-folder',
  41. tags: [],
  42. isStarred: false,
  43. },
  44. ],
  45. tags: [],
  46. isStarred: false,
  47. },
  48. ];
  49. ctrl = createCtrlWithStubs(response);
  50. return ctrl.getDashboards();
  51. });
  52. it('should set checked to false on all sections and children', () => {
  53. expect(ctrl.sections.length).toEqual(2);
  54. expect(ctrl.sections[0].checked).toEqual(false);
  55. expect(ctrl.sections[0].items[0].checked).toEqual(false);
  56. expect(ctrl.sections[1].checked).toEqual(false);
  57. expect(ctrl.sections[1].items[0].checked).toEqual(false);
  58. expect(ctrl.sections[0].hideHeader).toBeFalsy();
  59. });
  60. });
  61. describe('when browsing dashboards for a folder', () => {
  62. beforeEach(() => {
  63. const response = [
  64. {
  65. id: 410,
  66. title: 'afolder',
  67. type: 'dash-folder',
  68. items: [
  69. {
  70. id: 399,
  71. title: 'Dashboard Test',
  72. url: 'dashboard/db/dashboard-test',
  73. icon: 'fa fa-folder',
  74. tags: [],
  75. isStarred: false,
  76. folderId: 410,
  77. folderTitle: 'afolder',
  78. folderSlug: 'afolder',
  79. },
  80. ],
  81. tags: [],
  82. isStarred: false,
  83. },
  84. ];
  85. ctrl = createCtrlWithStubs(response);
  86. ctrl.folderId = 410;
  87. return ctrl.getDashboards();
  88. });
  89. it('should set hide header to true on section', () => {
  90. expect(ctrl.sections[0].hideHeader).toBeTruthy();
  91. });
  92. });
  93. describe('when searching dashboards', () => {
  94. beforeEach(() => {
  95. const response = [
  96. {
  97. checked: false,
  98. expanded: true,
  99. hideHeader: true,
  100. items: [
  101. {
  102. id: 399,
  103. title: 'Dashboard Test',
  104. url: 'dashboard/db/dashboard-test',
  105. icon: 'fa fa-folder',
  106. tags: [],
  107. isStarred: false,
  108. folderId: 410,
  109. folderTitle: 'afolder',
  110. folderSlug: 'afolder',
  111. },
  112. {
  113. id: 500,
  114. title: 'Dashboard Test',
  115. url: 'dashboard/db/dashboard-test',
  116. icon: 'fa fa-folder',
  117. tags: [],
  118. folderId: 499,
  119. isStarred: false,
  120. },
  121. ],
  122. },
  123. ];
  124. ctrl = createCtrlWithStubs(response);
  125. });
  126. describe('with query filter', () => {
  127. beforeEach(() => {
  128. ctrl.query.query = 'd';
  129. ctrl.canMove = true;
  130. ctrl.canDelete = true;
  131. ctrl.selectAllChecked = true;
  132. return ctrl.getDashboards();
  133. });
  134. it('should set checked to false on all sections and children', () => {
  135. expect(ctrl.sections.length).toEqual(1);
  136. expect(ctrl.sections[0].checked).toEqual(false);
  137. expect(ctrl.sections[0].items[0].checked).toEqual(false);
  138. expect(ctrl.sections[0].items[1].checked).toEqual(false);
  139. });
  140. it('should uncheck select all', () => {
  141. expect(ctrl.selectAllChecked).toBeFalsy();
  142. });
  143. it('should disable Move To button', () => {
  144. expect(ctrl.canMove).toBeFalsy();
  145. });
  146. it('should disable delete button', () => {
  147. expect(ctrl.canDelete).toBeFalsy();
  148. });
  149. it('should have active filters', () => {
  150. expect(ctrl.hasFilters).toBeTruthy();
  151. });
  152. describe('when select all is checked', () => {
  153. beforeEach(() => {
  154. ctrl.selectAllChecked = true;
  155. ctrl.onSelectAllChanged();
  156. });
  157. it('should select all dashboards', () => {
  158. expect(ctrl.sections[0].checked).toBeFalsy();
  159. expect(ctrl.sections[0].items[0].checked).toBeTruthy();
  160. expect(ctrl.sections[0].items[1].checked).toBeTruthy();
  161. });
  162. it('should enable Move To button', () => {
  163. expect(ctrl.canMove).toBeTruthy();
  164. });
  165. it('should enable delete button', () => {
  166. expect(ctrl.canDelete).toBeTruthy();
  167. });
  168. describe('when clearing filters', () => {
  169. beforeEach(() => {
  170. return ctrl.clearFilters();
  171. });
  172. it('should reset query filter', () => {
  173. expect(ctrl.query.query).toEqual('');
  174. });
  175. });
  176. });
  177. });
  178. describe('with tag filter', () => {
  179. beforeEach(() => {
  180. return ctrl.filterByTag('test');
  181. });
  182. it('should set tag filter', () => {
  183. expect(ctrl.sections.length).toEqual(1);
  184. expect(ctrl.query.tag[0]).toEqual('test');
  185. });
  186. it('should have active filters', () => {
  187. expect(ctrl.hasFilters).toBeTruthy();
  188. });
  189. describe('when clearing filters', () => {
  190. beforeEach(() => {
  191. return ctrl.clearFilters();
  192. });
  193. it('should reset tag filter', () => {
  194. expect(ctrl.query.tag.length).toEqual(0);
  195. });
  196. });
  197. });
  198. describe('with starred filter', () => {
  199. beforeEach(() => {
  200. const yesOption: any = ctrl.starredFilterOptions[1];
  201. ctrl.selectedStarredFilter = yesOption;
  202. return ctrl.onStarredFilterChange();
  203. });
  204. it('should set starred filter', () => {
  205. expect(ctrl.sections.length).toEqual(1);
  206. expect(ctrl.query.starred).toEqual(true);
  207. });
  208. it('should have active filters', () => {
  209. expect(ctrl.hasFilters).toBeTruthy();
  210. });
  211. describe('when clearing filters', () => {
  212. beforeEach(() => {
  213. return ctrl.clearFilters();
  214. });
  215. it('should reset starred filter', () => {
  216. expect(ctrl.query.starred).toEqual(false);
  217. });
  218. });
  219. });
  220. });
  221. describe('when selecting dashboards', () => {
  222. let ctrl;
  223. beforeEach(() => {
  224. ctrl = createCtrlWithStubs([]);
  225. });
  226. describe('and no dashboards are selected', () => {
  227. beforeEach(() => {
  228. ctrl.sections = [
  229. {
  230. id: 1,
  231. items: [{ id: 2, checked: false }],
  232. checked: false,
  233. },
  234. {
  235. id: 0,
  236. items: [{ id: 3, checked: false }],
  237. checked: false,
  238. },
  239. ];
  240. ctrl.selectionChanged();
  241. });
  242. it('should disable Move To button', () => {
  243. expect(ctrl.canMove).toBeFalsy();
  244. });
  245. it('should disable delete button', () => {
  246. expect(ctrl.canDelete).toBeFalsy();
  247. });
  248. describe('when select all is checked', () => {
  249. beforeEach(() => {
  250. ctrl.selectAllChecked = true;
  251. ctrl.onSelectAllChanged();
  252. });
  253. it('should select all folders and dashboards', () => {
  254. expect(ctrl.sections[0].checked).toBeTruthy();
  255. expect(ctrl.sections[0].items[0].checked).toBeTruthy();
  256. expect(ctrl.sections[1].checked).toBeTruthy();
  257. expect(ctrl.sections[1].items[0].checked).toBeTruthy();
  258. });
  259. it('should enable Move To button', () => {
  260. expect(ctrl.canMove).toBeTruthy();
  261. });
  262. it('should enable delete button', () => {
  263. expect(ctrl.canDelete).toBeTruthy();
  264. });
  265. });
  266. });
  267. describe('and all folders and dashboards are selected', () => {
  268. beforeEach(() => {
  269. ctrl.sections = [
  270. {
  271. id: 1,
  272. items: [{ id: 2, checked: true }],
  273. checked: true,
  274. },
  275. {
  276. id: 0,
  277. items: [{ id: 3, checked: true }],
  278. checked: true,
  279. },
  280. ];
  281. ctrl.selectionChanged();
  282. });
  283. it('should enable Move To button', () => {
  284. expect(ctrl.canMove).toBeTruthy();
  285. });
  286. it('should enable delete button', () => {
  287. expect(ctrl.canDelete).toBeTruthy();
  288. });
  289. describe('when select all is unchecked', () => {
  290. beforeEach(() => {
  291. ctrl.selectAllChecked = false;
  292. ctrl.onSelectAllChanged();
  293. });
  294. it('should uncheck all checked folders and dashboards', () => {
  295. expect(ctrl.sections[0].checked).toBeFalsy();
  296. expect(ctrl.sections[0].items[0].checked).toBeFalsy();
  297. expect(ctrl.sections[1].checked).toBeFalsy();
  298. expect(ctrl.sections[1].items[0].checked).toBeFalsy();
  299. });
  300. it('should disable Move To button', () => {
  301. expect(ctrl.canMove).toBeFalsy();
  302. });
  303. it('should disable delete button', () => {
  304. expect(ctrl.canDelete).toBeFalsy();
  305. });
  306. });
  307. });
  308. describe('and one dashboard in root is selected', () => {
  309. beforeEach(() => {
  310. ctrl.sections = [
  311. {
  312. id: 1,
  313. title: 'folder',
  314. items: [{ id: 2, checked: false }],
  315. checked: false,
  316. },
  317. {
  318. id: 0,
  319. title: 'Root',
  320. items: [{ id: 3, checked: true }],
  321. checked: false,
  322. },
  323. ];
  324. ctrl.selectionChanged();
  325. });
  326. it('should enable Move To button', () => {
  327. expect(ctrl.canMove).toBeTruthy();
  328. });
  329. it('should enable delete button', () => {
  330. expect(ctrl.canDelete).toBeTruthy();
  331. });
  332. });
  333. describe('and one child dashboard is selected', () => {
  334. beforeEach(() => {
  335. ctrl.sections = [
  336. {
  337. id: 1,
  338. title: 'folder',
  339. items: [{ id: 2, checked: true }],
  340. checked: false,
  341. },
  342. {
  343. id: 0,
  344. title: 'Root',
  345. items: [{ id: 3, checked: false }],
  346. checked: false,
  347. },
  348. ];
  349. ctrl.selectionChanged();
  350. });
  351. it('should enable Move To button', () => {
  352. expect(ctrl.canMove).toBeTruthy();
  353. });
  354. it('should enable delete button', () => {
  355. expect(ctrl.canDelete).toBeTruthy();
  356. });
  357. });
  358. describe('and one child dashboard and one dashboard is selected', () => {
  359. beforeEach(() => {
  360. ctrl.sections = [
  361. {
  362. id: 1,
  363. title: 'folder',
  364. items: [{ id: 2, checked: true }],
  365. checked: false,
  366. },
  367. {
  368. id: 0,
  369. title: 'Root',
  370. items: [{ id: 3, checked: true }],
  371. checked: false,
  372. },
  373. ];
  374. ctrl.selectionChanged();
  375. });
  376. it('should enable Move To button', () => {
  377. expect(ctrl.canMove).toBeTruthy();
  378. });
  379. it('should enable delete button', () => {
  380. expect(ctrl.canDelete).toBeTruthy();
  381. });
  382. });
  383. describe('and one child dashboard and one folder is selected', () => {
  384. beforeEach(() => {
  385. ctrl.sections = [
  386. {
  387. id: 1,
  388. title: 'folder',
  389. items: [{ id: 2, checked: false }],
  390. checked: true,
  391. },
  392. {
  393. id: 3,
  394. title: 'folder',
  395. items: [{ id: 4, checked: true }],
  396. checked: false,
  397. },
  398. {
  399. id: 0,
  400. title: 'Root',
  401. items: [{ id: 3, checked: false }],
  402. checked: false,
  403. },
  404. ];
  405. ctrl.selectionChanged();
  406. });
  407. it('should enable Move To button', () => {
  408. expect(ctrl.canMove).toBeTruthy();
  409. });
  410. it('should enable delete button', () => {
  411. expect(ctrl.canDelete).toBeTruthy();
  412. });
  413. });
  414. });
  415. describe('when deleting dashboards', () => {
  416. let toBeDeleted: any;
  417. beforeEach(() => {
  418. ctrl = createCtrlWithStubs([]);
  419. ctrl.sections = [
  420. {
  421. id: 1,
  422. title: 'folder',
  423. items: [{ id: 2, checked: true, slug: 'folder-dash' }],
  424. checked: true,
  425. slug: 'folder',
  426. },
  427. {
  428. id: 3,
  429. title: 'folder-2',
  430. items: [{ id: 3, checked: true, slug: 'folder-2-dash' }],
  431. checked: false,
  432. slug: 'folder-2',
  433. },
  434. {
  435. id: 0,
  436. title: 'Root',
  437. items: [{ id: 3, checked: true, slug: 'root-dash' }],
  438. checked: true,
  439. },
  440. ];
  441. toBeDeleted = ctrl.getFoldersAndDashboardsToDelete();
  442. });
  443. it('should return 1 folder', () => {
  444. expect(toBeDeleted.folders.length).toEqual(1);
  445. });
  446. it('should return 2 dashboards', () => {
  447. expect(toBeDeleted.dashboards.length).toEqual(2);
  448. });
  449. it('should filter out children if parent is checked', () => {
  450. expect(toBeDeleted.folders[0]).toEqual('folder');
  451. });
  452. it('should not filter out children if parent not is checked', () => {
  453. expect(toBeDeleted.dashboards[0]).toEqual('folder-2-dash');
  454. });
  455. it('should not filter out children if parent is checked and root', () => {
  456. expect(toBeDeleted.dashboards[1]).toEqual('root-dash');
  457. });
  458. });
  459. describe('when moving dashboards', () => {
  460. beforeEach(() => {
  461. ctrl = createCtrlWithStubs([]);
  462. ctrl.sections = [
  463. {
  464. id: 1,
  465. title: 'folder',
  466. items: [{ id: 2, checked: true, slug: 'dash' }],
  467. checked: false,
  468. slug: 'folder',
  469. },
  470. {
  471. id: 0,
  472. title: 'Root',
  473. items: [{ id: 3, checked: true, slug: 'dash-2' }],
  474. checked: false,
  475. },
  476. ];
  477. });
  478. it('should get selected dashboards', () => {
  479. const toBeMove = ctrl.getDashboardsToMove();
  480. expect(toBeMove.length).toEqual(2);
  481. expect(toBeMove[0]).toEqual('dash');
  482. expect(toBeMove[1]).toEqual('dash-2');
  483. });
  484. });
  485. });
  486. function createCtrlWithStubs(searchResponse: any, tags?: any) {
  487. const searchSrvStub = {
  488. search: (options: any) => {
  489. return q.resolve(searchResponse);
  490. },
  491. getDashboardTags: () => {
  492. return q.resolve(tags || []);
  493. },
  494. };
  495. return new ManageDashboardsCtrl({}, { getNav: () => {} }, <SearchSrv>searchSrvStub);
  496. }