dashboard_list_ctrl.jest.ts 14 KB

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