manage_dashboards.jest.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  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: [
  232. { id: 2, checked: false }
  233. ],
  234. checked: false
  235. },
  236. {
  237. id: 0,
  238. items: [
  239. { id: 3, checked: false }
  240. ],
  241. checked: false
  242. }
  243. ];
  244. ctrl.selectionChanged();
  245. });
  246. it('should disable Move To button', () => {
  247. expect(ctrl.canMove).toBeFalsy();
  248. });
  249. it('should disable delete button', () => {
  250. expect(ctrl.canDelete).toBeFalsy();
  251. });
  252. describe('when select all is checked', () => {
  253. beforeEach(() => {
  254. ctrl.selectAllChecked = true;
  255. ctrl.onSelectAllChanged();
  256. });
  257. it('should select all folders and dashboards', () => {
  258. expect(ctrl.sections[0].checked).toBeTruthy();
  259. expect(ctrl.sections[0].items[0].checked).toBeTruthy();
  260. expect(ctrl.sections[1].checked).toBeTruthy();
  261. expect(ctrl.sections[1].items[0].checked).toBeTruthy();
  262. });
  263. it('should enable Move To button', () => {
  264. expect(ctrl.canMove).toBeTruthy();
  265. });
  266. it('should enable delete button', () => {
  267. expect(ctrl.canDelete).toBeTruthy();
  268. });
  269. });
  270. });
  271. describe('and all folders and dashboards are selected', () => {
  272. beforeEach(() => {
  273. ctrl.sections = [
  274. {
  275. id: 1,
  276. items: [
  277. { id: 2, checked: true }
  278. ],
  279. checked: true
  280. },
  281. {
  282. id: 0,
  283. items: [
  284. { id: 3, checked: true }
  285. ],
  286. checked: true
  287. }
  288. ];
  289. ctrl.selectionChanged();
  290. });
  291. it('should enable Move To button', () => {
  292. expect(ctrl.canMove).toBeTruthy();
  293. });
  294. it('should enable delete button', () => {
  295. expect(ctrl.canDelete).toBeTruthy();
  296. });
  297. describe('when select all is unchecked', () => {
  298. beforeEach(() => {
  299. ctrl.selectAllChecked = false;
  300. ctrl.onSelectAllChanged();
  301. });
  302. it('should uncheck all checked folders and dashboards', () => {
  303. expect(ctrl.sections[0].checked).toBeFalsy();
  304. expect(ctrl.sections[0].items[0].checked).toBeFalsy();
  305. expect(ctrl.sections[1].checked).toBeFalsy();
  306. expect(ctrl.sections[1].items[0].checked).toBeFalsy();
  307. });
  308. it('should disable Move To button', () => {
  309. expect(ctrl.canMove).toBeFalsy();
  310. });
  311. it('should disable delete button', () => {
  312. expect(ctrl.canDelete).toBeFalsy();
  313. });
  314. });
  315. });
  316. describe('and one dashboard in root is selected', () => {
  317. beforeEach(() => {
  318. ctrl.sections = [
  319. {
  320. id: 1,
  321. title: 'folder',
  322. items: [
  323. { id: 2, checked: false }
  324. ],
  325. checked: false
  326. },
  327. {
  328. id: 0,
  329. title: 'Root',
  330. items: [
  331. { id: 3, checked: true }
  332. ],
  333. checked: false
  334. }
  335. ];
  336. ctrl.selectionChanged();
  337. });
  338. it('should enable Move To button', () => {
  339. expect(ctrl.canMove).toBeTruthy();
  340. });
  341. it('should enable delete button', () => {
  342. expect(ctrl.canDelete).toBeTruthy();
  343. });
  344. });
  345. describe('and one child dashboard is selected', () => {
  346. beforeEach(() => {
  347. ctrl.sections = [
  348. {
  349. id: 1,
  350. title: 'folder',
  351. items: [
  352. { id: 2, checked: true }
  353. ],
  354. checked: false
  355. },
  356. {
  357. id: 0,
  358. title: 'Root',
  359. items: [
  360. { id: 3, checked: false }
  361. ],
  362. checked: false
  363. }
  364. ];
  365. ctrl.selectionChanged();
  366. });
  367. it('should enable Move To button', () => {
  368. expect(ctrl.canMove).toBeTruthy();
  369. });
  370. it('should enable delete button', () => {
  371. expect(ctrl.canDelete).toBeTruthy();
  372. });
  373. });
  374. describe('and one child dashboard and one dashboard is selected', () => {
  375. beforeEach(() => {
  376. ctrl.sections = [
  377. {
  378. id: 1,
  379. title: 'folder',
  380. items: [
  381. { id: 2, checked: true }
  382. ],
  383. checked: false
  384. },
  385. {
  386. id: 0,
  387. title: 'Root',
  388. items: [
  389. { id: 3, checked: true }
  390. ],
  391. checked: false
  392. }
  393. ];
  394. ctrl.selectionChanged();
  395. });
  396. it('should enable Move To button', () => {
  397. expect(ctrl.canMove).toBeTruthy();
  398. });
  399. it('should enable delete button', () => {
  400. expect(ctrl.canDelete).toBeTruthy();
  401. });
  402. });
  403. describe('and one child dashboard and one folder is selected', () => {
  404. beforeEach(() => {
  405. ctrl.sections = [
  406. {
  407. id: 1,
  408. title: 'folder',
  409. items: [
  410. { id: 2, checked: false }
  411. ],
  412. checked: true
  413. },
  414. {
  415. id: 3,
  416. title: 'folder',
  417. items: [
  418. { id: 4, checked: true }
  419. ],
  420. checked: false
  421. },
  422. {
  423. id: 0,
  424. title: 'Root',
  425. items: [
  426. { id: 3, checked: false }
  427. ],
  428. checked: false
  429. }
  430. ];
  431. ctrl.selectionChanged();
  432. });
  433. it('should enable Move To button', () => {
  434. expect(ctrl.canMove).toBeTruthy();
  435. });
  436. it('should enable delete button', () => {
  437. expect(ctrl.canDelete).toBeTruthy();
  438. });
  439. });
  440. });
  441. describe('when deleting dashboards', () => {
  442. let toBeDeleted = [];
  443. beforeEach(() => {
  444. ctrl = createCtrlWithStubs([]);
  445. ctrl.sections = [
  446. {
  447. id: 1,
  448. title: 'folder',
  449. items: [
  450. { id: 2, checked: true, slug: 'folder-dash' }
  451. ],
  452. checked: true,
  453. slug: 'folder'
  454. },
  455. {
  456. id: 3,
  457. title: 'folder-2',
  458. items: [
  459. { id: 3, checked: true, slug: 'folder-2-dash' }
  460. ],
  461. checked: false,
  462. slug: 'folder-2'
  463. },
  464. {
  465. id: 0,
  466. title: 'Root',
  467. items: [
  468. { id: 3, checked: true, slug: 'root-dash' }
  469. ],
  470. checked: true
  471. }
  472. ];
  473. toBeDeleted = ctrl.getDashboardsToDelete();
  474. });
  475. it('should return 3 items', () => {
  476. expect(toBeDeleted.length).toEqual(3);
  477. });
  478. it('should filter out children if parent is checked', () => {
  479. expect(toBeDeleted[0]).toEqual('folder');
  480. });
  481. it('should not filter out children if parent not is checked', () => {
  482. expect(toBeDeleted[1]).toEqual('folder-2-dash');
  483. });
  484. it('should not filter out children if parent is checked and root', () => {
  485. expect(toBeDeleted[2]).toEqual('root-dash');
  486. });
  487. });
  488. describe('when moving dashboards', () => {
  489. beforeEach(() => {
  490. ctrl = createCtrlWithStubs([]);
  491. ctrl.sections = [
  492. {
  493. id: 1,
  494. title: 'folder',
  495. items: [
  496. { id: 2, checked: true, slug: 'dash' }
  497. ],
  498. checked: false,
  499. slug: 'folder'
  500. },
  501. {
  502. id: 0,
  503. title: 'Root',
  504. items: [
  505. { id: 3, checked: true, slug: 'dash-2' }
  506. ],
  507. checked: false
  508. }
  509. ];
  510. });
  511. it('should get selected dashboards', () => {
  512. const toBeMove = ctrl.getDashboardsToMove();
  513. expect(toBeMove.length).toEqual(2);
  514. expect(toBeMove[0]).toEqual('dash');
  515. expect(toBeMove[1]).toEqual('dash-2');
  516. });
  517. });
  518. });
  519. function createCtrlWithStubs(searchResponse: any, tags?: any) {
  520. const searchSrvStub = {
  521. search: (options: any) => {
  522. return q.resolve(searchResponse);
  523. },
  524. getDashboardTags: () => {
  525. return q.resolve(tags || []);
  526. }
  527. };
  528. return new ManageDashboardsCtrl({}, { getNav: () => { } }, q, <SearchSrv>searchSrvStub);
  529. }