diff --git a/ui-v2/src/api/work-queues/index.ts b/ui-v2/src/api/work-queues/index.ts index 82914704c9c8..a9c47a5111ea 100644 --- a/ui-v2/src/api/work-queues/index.ts +++ b/ui-v2/src/api/work-queues/index.ts @@ -2,4 +2,5 @@ export { type WorkQueue, type WorkQueuesFilter, buildFilterWorkQueuesQuery, + buildWorkQueueDetailsQuery, } from "./work-queues"; diff --git a/ui-v2/src/api/work-queues/work-queues.test.ts b/ui-v2/src/api/work-queues/work-queues.test.ts index d76dc808cafd..7fc61a00c511 100644 --- a/ui-v2/src/api/work-queues/work-queues.test.ts +++ b/ui-v2/src/api/work-queues/work-queues.test.ts @@ -4,7 +4,11 @@ import { renderHook, waitFor } from "@testing-library/react"; import { buildApiUrl, createWrapper, server } from "@tests/utils"; import { http, HttpResponse } from "msw"; import { describe, expect, it } from "vitest"; -import { type WorkQueue, buildFilterWorkQueuesQuery } from "./work-queues"; +import { + type WorkQueue, + buildFilterWorkQueuesQuery, + buildWorkQueueDetailsQuery, +} from "./work-queues"; describe("work queues api", () => { const mockFetchWorkQueuesAPI = (workPools: Array) => { @@ -30,4 +34,39 @@ describe("work queues api", () => { expect(result.current.data).toEqual([workQueue]); }); }); + + describe("buildWorkQueueDetailsQuery", () => { + const mockGetWorkQueueAPI = (workQueue: WorkQueue) => { + server.use( + http.get( + buildApiUrl("/work_pools/:work_pool_name/queues/:name"), + () => { + return HttpResponse.json(workQueue); + }, + ), + ); + }; + + it("fetches details about a work pool by name", async () => { + const MOCK_WORK_QUEUE = createFakeWorkQueue({ + work_pool_name: "my-work-pool", + name: "my-work-queue", + }); + mockGetWorkQueueAPI(MOCK_WORK_QUEUE); + + const queryClient = new QueryClient(); + const { result } = renderHook( + () => + useSuspenseQuery( + buildWorkQueueDetailsQuery( + MOCK_WORK_QUEUE.work_pool_name as string, + MOCK_WORK_QUEUE.name, + ), + ), + { wrapper: createWrapper({ queryClient }) }, + ); + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + expect(result.current.data).toEqual(MOCK_WORK_QUEUE); + }); + }); }); diff --git a/ui-v2/src/api/work-queues/work-queues.ts b/ui-v2/src/api/work-queues/work-queues.ts index 6e1d0c7f1c51..e2173e96a459 100644 --- a/ui-v2/src/api/work-queues/work-queues.ts +++ b/ui-v2/src/api/work-queues/work-queues.ts @@ -15,9 +15,11 @@ export type WorkQueuesFilter = * * ``` - * all => ['work-queues'] - * lists => ['work-queues', 'list'] - * list => ['work-queues', 'list', { ...filter }] + * all => ['work-queues'] + * lists => ['work-queues', 'list'] + * list => ['work-queues', 'list', { ...filter }] + * details => ['work-queues', 'details'] + * detail => ['work-queues', 'detail', workPoolName, workQueueName] * ``` */ export const queryKeyFactory = { @@ -25,6 +27,9 @@ export const queryKeyFactory = { lists: () => [...queryKeyFactory.all(), "list"] as const, list: (filter: WorkQueuesFilter) => [...queryKeyFactory.lists(), filter] as const, + details: () => [...queryKeyFactory.all(), "details"] as const, + detail: (workPoolName: string, workQueueName: string) => + [...queryKeyFactory.details(), workPoolName, workQueueName] as const, }; // ---------------------------- @@ -65,3 +70,21 @@ export const buildFilterWorkQueuesQuery = ( }, enabled, }); + +export const buildWorkQueueDetailsQuery = ( + work_pool_name: string, + name: string, +) => + queryOptions({ + queryKey: queryKeyFactory.detail(work_pool_name, name), + queryFn: async () => { + const res = await getQueryService().GET( + "/work_pools/{work_pool_name}/queues/{name}", + { params: { path: { work_pool_name, name } } }, + ); + if (!res.data) { + throw new Error("'data' expected"); + } + return res.data; + }, + });