mirror of
https://github.com/fleetdm/fleet
synced 2026-04-21 21:47:20 +00:00
92 lines
2.7 KiB
TypeScript
92 lines
2.7 KiB
TypeScript
import React from "react";
|
|
import { screen } from "@testing-library/react";
|
|
import { renderWithSetup } from "test/test-utils";
|
|
|
|
import ActionsDropdown from "./ActionsDropdown";
|
|
|
|
const DROPDOWN_OPTIONS = [
|
|
{ disabled: false, label: "Edit", value: "edit-query" },
|
|
{ disabled: false, label: "Show query", value: "show-query" },
|
|
{ disabled: true, label: "Delete", value: "delete-query" },
|
|
];
|
|
const PLACEHOLDER = "Actions";
|
|
const ON_CHANGE = (value: string) => {
|
|
console.log(value);
|
|
};
|
|
|
|
describe("Actions dropdown", () => {
|
|
it("renders dropdown placeholder and options", async () => {
|
|
const { user } = renderWithSetup(
|
|
<ActionsDropdown
|
|
options={DROPDOWN_OPTIONS} // Test
|
|
placeholder={PLACEHOLDER}
|
|
onChange={ON_CHANGE}
|
|
/>
|
|
);
|
|
|
|
await user.click(screen.getByText("Actions"));
|
|
|
|
expect(screen.queryAllByText(/edit/i)[1]).toBeInTheDocument(); // Aria shows Edit twice since it's focused
|
|
expect(screen.queryByText(/show query/i)).toBeInTheDocument();
|
|
expect(screen.queryByText(/delete/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it("renders dropdown as disabled when disabled prop is true", () => {
|
|
renderWithSetup(
|
|
<ActionsDropdown
|
|
options={DROPDOWN_OPTIONS}
|
|
placeholder={PLACEHOLDER}
|
|
onChange={ON_CHANGE}
|
|
disabled // Test
|
|
/>
|
|
);
|
|
expect(screen.getByRole("combobox")).toBeDisabled();
|
|
});
|
|
|
|
it("calls onChange with correct value when an option is selected", async () => {
|
|
const mockOnChange = jest.fn();
|
|
const { user } = renderWithSetup(
|
|
<ActionsDropdown
|
|
options={DROPDOWN_OPTIONS}
|
|
placeholder={PLACEHOLDER}
|
|
onChange={mockOnChange}
|
|
/>
|
|
);
|
|
|
|
await user.click(screen.getByText("Actions"));
|
|
await user.click(screen.getByText("Edit"));
|
|
|
|
expect(mockOnChange).toHaveBeenCalledWith("edit-query");
|
|
});
|
|
|
|
it("renders disabled option as non-selectable", async () => {
|
|
const { user } = renderWithSetup(
|
|
<ActionsDropdown
|
|
options={DROPDOWN_OPTIONS}
|
|
placeholder={PLACEHOLDER}
|
|
onChange={ON_CHANGE}
|
|
/>
|
|
);
|
|
|
|
await user.click(screen.getByText("Actions"));
|
|
const deleteOption = screen.getByText("Delete");
|
|
|
|
expect(deleteOption).toHaveAttribute("aria-disabled", "true");
|
|
});
|
|
|
|
it("closes the dropdown when clicking outside", async () => {
|
|
const { user } = renderWithSetup(
|
|
<ActionsDropdown
|
|
options={DROPDOWN_OPTIONS}
|
|
placeholder={PLACEHOLDER}
|
|
onChange={ON_CHANGE}
|
|
/>
|
|
);
|
|
|
|
await user.click(screen.getByText("Actions"));
|
|
expect(screen.getByText("Edit")).toBeVisible();
|
|
|
|
await user.click(document.body);
|
|
expect(screen.queryByText(/edit/i)).not.toBeInTheDocument();
|
|
});
|
|
});
|