Skip to content

Commit

Permalink
[UI v2] feat: Adds Work Queues select component
Browse files Browse the repository at this point in the history
  • Loading branch information
devinvillarosa committed Feb 26, 2025
1 parent f5b0d19 commit 21be0e8
Show file tree
Hide file tree
Showing 5 changed files with 371 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,91 +9,89 @@ import { http, HttpResponse } from "msw";
import { beforeAll, describe, expect, it, vi } from "vitest";
import { WorkPoolSelect } from "./work-pool-select";

describe("ActionsStep", () => {
describe("WorkPoolSelect", () => {
beforeAll(mockPointerEvents);

describe("WorkPoolSelect", () => {
const mockListWorkPoolsAPI = (workPools: Array<WorkPool>) => {
server.use(
http.post(buildApiUrl("/work_pools/filter"), () => {
return HttpResponse.json(workPools);
}),
);
};

it("able to select a workpool", async () => {
const mockOnSelect = vi.fn();
mockListWorkPoolsAPI([
createFakeWorkPool({ name: "my work pool 0" }),
createFakeWorkPool({ name: "my work pool 1" }),
]);

const user = userEvent.setup();

// ------------ Setup
render(<WorkPoolSelect selected={undefined} onSelect={mockOnSelect} />, {
wrapper: createWrapper(),
});

// ------------ Act
await user.click(
screen.getByRole("combobox", { name: /select a work pool/i }),
);
await user.click(screen.getByRole("option", { name: "my work pool 0" }));

// ------------ Assert
expect(mockOnSelect).toHaveBeenLastCalledWith("my work pool 0");
const mockListWorkPoolsAPI = (workPools: Array<WorkPool>) => {
server.use(
http.post(buildApiUrl("/work_pools/filter"), () => {
return HttpResponse.json(workPools);
}),
);
};

it("able to select a workpool", async () => {
const mockOnSelect = vi.fn();
mockListWorkPoolsAPI([
createFakeWorkPool({ name: "my work pool 0" }),
createFakeWorkPool({ name: "my work pool 1" }),
]);

const user = userEvent.setup();

// ------------ Setup
render(<WorkPoolSelect selected={undefined} onSelect={mockOnSelect} />, {
wrapper: createWrapper(),
});

it("able to select a preset option", async () => {
const mockOnSelect = vi.fn();
mockListWorkPoolsAPI([
createFakeWorkPool({ name: "my work pool 0" }),
createFakeWorkPool({ name: "my work pool 1" }),
]);

const user = userEvent.setup();

// ------------ Setup
const PRESETS = [{ label: "None", value: undefined }];
render(
<WorkPoolSelect
presetOptions={PRESETS}
selected={undefined}
onSelect={mockOnSelect}
/>,
{ wrapper: createWrapper() },
);

// ------------ Act
await user.click(
screen.getByRole("combobox", { name: /select a work pool/i }),
);
await user.click(screen.getByRole("option", { name: "None" }));

// ------------ Assert
expect(mockOnSelect).toHaveBeenLastCalledWith(undefined);
});
// ------------ Act
await user.click(
screen.getByRole("combobox", { name: /select a work pool/i }),
);
await user.click(screen.getByRole("option", { name: "my work pool 0" }));

it("has the selected value displayed", () => {
mockListWorkPoolsAPI([
createFakeWorkPool({ name: "my work pool 0" }),
createFakeWorkPool({ name: "my work pool 1" }),
]);

// ------------ Setup
const PRESETS = [{ label: "None", value: undefined }];
render(
<WorkPoolSelect
presetOptions={PRESETS}
selected="my work pool 0"
onSelect={vi.fn()}
/>,
{ wrapper: createWrapper() },
);

// ------------ Assert
expect(screen.getByText("my work pool 0")).toBeVisible();
});
// ------------ Assert
expect(mockOnSelect).toHaveBeenLastCalledWith("my work pool 0");
});

it("able to select a preset option", async () => {
const mockOnSelect = vi.fn();
mockListWorkPoolsAPI([
createFakeWorkPool({ name: "my work pool 0" }),
createFakeWorkPool({ name: "my work pool 1" }),
]);

const user = userEvent.setup();

// ------------ Setup
const PRESETS = [{ label: "None", value: undefined }];
render(
<WorkPoolSelect
presetOptions={PRESETS}
selected={undefined}
onSelect={mockOnSelect}
/>,
{ wrapper: createWrapper() },
);

// ------------ Act
await user.click(
screen.getByRole("combobox", { name: /select a work pool/i }),
);
await user.click(screen.getByRole("option", { name: "None" }));

// ------------ Assert
expect(mockOnSelect).toHaveBeenLastCalledWith(undefined);
});

it("has the selected value displayed", () => {
mockListWorkPoolsAPI([
createFakeWorkPool({ name: "my work pool 0" }),
createFakeWorkPool({ name: "my work pool 1" }),
]);

// ------------ Setup
const PRESETS = [{ label: "None", value: undefined }];
render(
<WorkPoolSelect
presetOptions={PRESETS}
selected="my work pool 0"
onSelect={vi.fn()}
/>,
{ wrapper: createWrapper() },
);

// ------------ Assert
expect(screen.getByText("my work pool 0")).toBeVisible();
});
});
1 change: 1 addition & 0 deletions ui-v2/src/components/work-pools/work-queue-select/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { WorkQueueSelect } from "./work-queue-select";
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { createFakeWorkQueue } from "@/mocks";
import { reactQueryDecorator } from "@/storybook/utils";
import type { Meta, StoryObj } from "@storybook/react";
import { buildApiUrl } from "@tests/utils/handlers";
import { http, HttpResponse } from "msw";

import { useState } from "react";
import { WorkQueueSelect } from "./work-queue-select";

const MOCK_WORK_POOLS_DATA = Array.from({ length: 5 }, () =>
createFakeWorkQueue({ work_pool_name: "my-work-pool" }),
);
const PRESET_OPTIONS = [{ label: "None", value: undefined }];
const meta = {
title: "Components/WorkQueues/WorkQueueSelect",
render: () => <WorkQueueSelectStory />,
decorators: [reactQueryDecorator],
parameters: {
msw: {
handlers: [
http.post(
buildApiUrl("/work_pools/:work_pool_name/queues/filter"),
() => {
return HttpResponse.json(MOCK_WORK_POOLS_DATA);
},
),
],
},
},
} satisfies Meta;

export default meta;

export const story: StoryObj = { name: "WorkQueueSelect" };

const WorkQueueSelectStory = () => {
const [selected, setSelected] = useState<string | undefined | null>();

return (
<WorkQueueSelect
workPoolName="my-work-pool"
selected={selected}
onSelect={setSelected}
presetOptions={PRESET_OPTIONS}
/>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import type { WorkQueue } from "@/api/work-queues";
import { createFakeWorkQueue } from "@/mocks";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { buildApiUrl, createWrapper, server } from "@tests/utils";
import { mockPointerEvents } from "@tests/utils/browser";
import { http, HttpResponse } from "msw";
import { beforeAll, describe, expect, it, vi } from "vitest";
import { WorkQueueSelect } from "./work-queue-select";

describe("WorkQueueSelect", () => {
beforeAll(mockPointerEvents);

const WORK_POOL_NAME = "my-work-pool";

const mockListWorkPoolWorkQueuesAPI = (workQueues: Array<WorkQueue>) => {
server.use(
http.post(
buildApiUrl("/work_pools/:work_pool_name/queues/filter"),
() => {
return HttpResponse.json(workQueues);
},
),
);
};

it("able to select a work queue", async () => {
const mockOnSelect = vi.fn();
mockListWorkPoolWorkQueuesAPI([
createFakeWorkQueue({
work_pool_name: WORK_POOL_NAME,
name: "my work queue 0",
}),
createFakeWorkQueue({
work_pool_name: WORK_POOL_NAME,
name: "my work queue 1",
}),
]);

const user = userEvent.setup();

// ------------ Setup
render(
<WorkQueueSelect
workPoolName={WORK_POOL_NAME}
selected={undefined}
onSelect={mockOnSelect}
/>,
{ wrapper: createWrapper() },
);

// ------------ Act
await user.click(
screen.getByRole("combobox", { name: /select a work queue/i }),
);
await user.click(screen.getByRole("option", { name: "my work queue 0" }));

// ------------ Assert
expect(mockOnSelect).toHaveBeenLastCalledWith("my work queue 0");
});

it("able to select a preset option", async () => {
const mockOnSelect = vi.fn();
mockListWorkPoolWorkQueuesAPI([
createFakeWorkQueue({
work_pool_name: WORK_POOL_NAME,
name: "my work queue 0",
}),
createFakeWorkQueue({
work_pool_name: WORK_POOL_NAME,
name: "my work queue 1",
}),
]);

const user = userEvent.setup();

// ------------ Setup
const PRESETS = [{ label: "None", value: undefined }];
render(
<WorkQueueSelect
workPoolName={WORK_POOL_NAME}
presetOptions={PRESETS}
selected={undefined}
onSelect={mockOnSelect}
/>,
{ wrapper: createWrapper() },
);

// ------------ Act
await user.click(
screen.getByRole("combobox", { name: /select a work queue/i }),
);
await user.click(screen.getByRole("option", { name: "None" }));

// ------------ Assert
expect(mockOnSelect).toHaveBeenLastCalledWith(undefined);
});

it("has the selected value displayed", () => {
mockListWorkPoolWorkQueuesAPI([
createFakeWorkQueue({
work_pool_name: WORK_POOL_NAME,
name: "my work queue 0",
}),
createFakeWorkQueue({
work_pool_name: WORK_POOL_NAME,
name: "my work queue 1",
}),
]);
// ------------ Setup
const PRESETS = [{ label: "None", value: undefined }];
render(
<WorkQueueSelect
workPoolName={WORK_POOL_NAME}
presetOptions={PRESETS}
selected="my work pool 0"
onSelect={vi.fn()}
/>,
{ wrapper: createWrapper() },
);

// ------------ Assert
expect(screen.getByText("my work pool 0")).toBeVisible();
});
});
Loading

0 comments on commit 21be0e8

Please sign in to comment.