Folders: Refactor hooks to (eventually) consume app platform /counts endpoint (#110894)

This commit is contained in:
Tom Ratcliffe
2025-09-17 12:46:59 +01:00
committed by GitHub
parent 4f43761630
commit 3ea093b596
12 changed files with 329 additions and 104 deletions
@@ -3,7 +3,7 @@ import { HttpResponse, http } from 'msw';
import { treeViewersCanEdit, wellFormedTree } from '../../../fixtures/folders';
const [mockTree] = wellFormedTree();
const [mockTree, { folderB }] = wellFormedTree();
const [mockTreeThatViewersCanEdit] = treeViewersCanEdit();
const collator = new Intl.Collator();
@@ -122,6 +122,38 @@ const saveFolderHandler = () =>
return HttpResponse.json({ ...folder.item, title: body.title });
});
const handlers = [listFoldersHandler(), getFolderHandler(), createFolderHandler(), saveFolderHandler()];
const getMockFolderCounts = (folder: number, dashboard: number, librarypanel: number, alertrule: number) => {
return {
folder,
dashboard,
librarypanel,
alertrule,
};
};
const folderCountsHandler = () =>
http.get<{ uid: string }, { title: string; version: number }>('/api/folders/:uid/counts', async ({ params }) => {
const { uid } = params;
const folder = mockTree.find((v) => v.item.uid === uid);
if (!folder) {
// The legacy API returns 0's for a folder that doesn't exist 🤷‍♂️
return HttpResponse.json(getMockFolderCounts(0, 0, 0, 0));
}
if (uid === folderB.item.uid) {
return HttpResponse.json({}, { status: 500 });
}
return HttpResponse.json(getMockFolderCounts(1, 1, 1, 1));
});
const handlers = [
listFoldersHandler(),
getFolderHandler(),
createFolderHandler(),
saveFolderHandler(),
folderCountsHandler(),
];
export default handlers;
@@ -4,7 +4,7 @@ import { HttpResponse, http } from 'msw';
import { wellFormedTree } from '../../../../fixtures/folders';
import { getErrorResponse } from '../../../helpers';
const [mockTree] = wellFormedTree();
const [mockTree, { folderB }] = wellFormedTree();
const baseResponse = {
kind: 'Folder',
@@ -164,4 +164,67 @@ const replaceFolderHandler = () =>
return HttpResponse.json(appPlatformFolder);
}
);
export default [getFolderHandler(), getFolderParentsHandler(), createFolderHandler(), replaceFolderHandler()];
const getMockFolderCounts = (folders: number, dashboards: number, library_elements: number, alertrules: number) => {
return {
kind: 'DescendantCounts',
apiVersion: 'folder.grafana.app/v1beta1',
counts: [
{
group: 'dashboard.grafana.app',
resource: 'dashboards',
count: dashboards,
},
{
group: 'sql-fallback',
resource: 'alertrules',
count: alertrules,
},
{
group: 'sql-fallback',
resource: 'dashboards',
count: dashboards,
},
{
group: 'sql-fallback',
resource: 'folders',
count: folders,
},
{
group: 'sql-fallback',
resource: 'library_elements',
count: library_elements,
},
],
};
};
const folderCountsHandler = () =>
http.get<{ folderUid: string; namespace: string }, PartialFolderPayload>(
'/apis/folder.grafana.app/v1beta1/namespaces/:namespace/folders/:folderUid/counts',
async ({ params }) => {
const { folderUid } = params;
const matchedFolder = mockTree.find(({ item }) => {
return item.uid === folderUid;
});
if (!matchedFolder) {
// The API returns 0's for a folder that doesn't exist 🤷‍♂️
return HttpResponse.json(getMockFolderCounts(0, 0, 0, 0));
}
if (folderUid === folderB.item.uid) {
return HttpResponse.json({}, { status: 500 });
}
return HttpResponse.json(getMockFolderCounts(1, 1, 1, 1));
}
);
export default [
getFolderHandler(),
getFolderParentsHandler(),
createFolderHandler(),
replaceFolderHandler(),
folderCountsHandler(),
];