manage_dashboards.test.ts 16 KB

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