bb9c4b5582
* fix(tabs): clamp ListContainer chevron scrolling to the scrollable range (#6749) * chore(deps): bump react-aria dependencies (#6752) * chore(deps): bump tailwind-variants to v3.3.1 (#6760) * chore(docs): release note for 3.2.4 * test(react): behavioral testing infra (#6754) * fix(link): expose data-slot on link root * fix(react): put style export condition before default * test(react): behavioral testing infra and suites * chore(testing): own vitest-browser-react and clarify coverage gates * chore: remove pinned version * fix(autocomplete): prevent popover from clipping the last options (#6766) * chore(docs): update release note * fix(styles): prevent subpixel border overflow on badge (#6768) * chore(docs): update release note * fix(styles): allow backdrop click to dismiss modal with scroll outside (#6770) * chore(docs): update release note * fix(tooltip): restore exit animation when swapping between tooltips (#6772) * chore(docs): update release note --------- Co-authored-by: Tyler <56234978+runnerboy22@users.noreply.github.com> Co-authored-by: Tianen Pang <32772271+tianenpang@users.noreply.github.com>
134 lines
3.5 KiB
TypeScript
134 lines
3.5 KiB
TypeScript
import type {Key} from "@react-types/shared";
|
|
|
|
import {User, cleanup, render, runAllTimers, screen} from "@heroui/testing/helpers";
|
|
import {MenuTrigger, Popover} from "react-aria-components/Menu";
|
|
|
|
import {Button} from "@/components/button";
|
|
import {Header} from "@/components/header";
|
|
import {Label} from "@/components/label";
|
|
import {Menu} from "@/components/menu";
|
|
|
|
import {MenuFixture} from "./fixtures";
|
|
|
|
const renderMenu = (onAction?: (key: Key) => void) => render(<MenuFixture onAction={onAction} />);
|
|
|
|
const renderMenuWithSection = (onAction?: (key: Key) => void) => {
|
|
return render(
|
|
<MenuTrigger>
|
|
<Button aria-label="Menu">Actions</Button>
|
|
<Popover>
|
|
<Menu onAction={onAction}>
|
|
<Menu.Section>
|
|
<Header>File</Header>
|
|
<Menu.Item id="new-file" textValue="New file">
|
|
<Label>New file</Label>
|
|
</Menu.Item>
|
|
<Menu.Item id="copy-link" textValue="Copy link">
|
|
<Label>Copy link</Label>
|
|
</Menu.Item>
|
|
</Menu.Section>
|
|
</Menu>
|
|
</Popover>
|
|
</MenuTrigger>,
|
|
);
|
|
};
|
|
|
|
describe("Menu", () => {
|
|
let testUtilUser: User;
|
|
|
|
beforeEach(() => {
|
|
vi.useFakeTimers({shouldAdvanceTime: true});
|
|
testUtilUser = new User({
|
|
interactionType: "mouse",
|
|
advanceTimer: vi.advanceTimersByTime,
|
|
});
|
|
});
|
|
|
|
afterEach(() => {
|
|
cleanup();
|
|
runAllTimers();
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("exposes menu data-slot via Menu tester", async () => {
|
|
renderMenu();
|
|
|
|
const tester = testUtilUser.createTester("Menu", {
|
|
root: screen.getByRole("button", {name: "Menu"}),
|
|
});
|
|
|
|
expect(tester.getMenu()).toBeNull();
|
|
|
|
await tester.open();
|
|
runAllTimers();
|
|
|
|
const menu = tester.getMenu();
|
|
|
|
expect(menu).not.toBeNull();
|
|
expect(menu).toHaveAttribute("data-slot", "menu");
|
|
expect(menu?.className).toEqual(expect.stringContaining("menu"));
|
|
expect(document.querySelector('[data-slot="menu-item"]')).not.toBeNull();
|
|
expect(tester.getOptions()).toHaveLength(3);
|
|
});
|
|
|
|
it("calls onAction when an item is selected", async () => {
|
|
const onAction = vi.fn();
|
|
|
|
renderMenu(onAction);
|
|
|
|
const tester = testUtilUser.createTester("Menu", {
|
|
root: screen.getByRole("button", {name: "Menu"}),
|
|
});
|
|
|
|
await tester.open();
|
|
runAllTimers();
|
|
|
|
await tester.toggleOptionSelection({option: "Copy link"});
|
|
runAllTimers();
|
|
|
|
expect(onAction.mock.calls[0]?.[0]).toBe("copy-link");
|
|
expect(tester.getMenu()).toBeNull();
|
|
});
|
|
|
|
it("supports Escape dismiss without selecting", async () => {
|
|
const onAction = vi.fn();
|
|
|
|
renderMenu(onAction);
|
|
|
|
const tester = testUtilUser.createTester("Menu", {
|
|
root: screen.getByRole("button", {name: "Menu"}),
|
|
});
|
|
|
|
await tester.open();
|
|
runAllTimers();
|
|
expect(tester.getMenu()).not.toBeNull();
|
|
|
|
await tester.close();
|
|
runAllTimers();
|
|
|
|
expect(tester.getMenu()).toBeNull();
|
|
expect(onAction).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("supports Menu.Section with Header and item action", async () => {
|
|
const onAction = vi.fn();
|
|
|
|
renderMenuWithSection(onAction);
|
|
|
|
const tester = testUtilUser.createTester("Menu", {
|
|
root: screen.getByRole("button", {name: "Menu"}),
|
|
});
|
|
|
|
await tester.open();
|
|
runAllTimers();
|
|
|
|
expect(screen.getByText("File")).toBeInTheDocument();
|
|
expect(document.querySelector(".menu-section")).not.toBeNull();
|
|
|
|
await tester.toggleOptionSelection({option: "Copy link"});
|
|
runAllTimers();
|
|
|
|
expect(onAction.mock.calls[0]?.[0]).toBe("copy-link");
|
|
});
|
|
});
|