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>
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import type {Key} from "react-aria-components";
|
|
|
|
import {render, screen, setupUser} from "@heroui/testing/helpers";
|
|
import {useMemo, useState} from "react";
|
|
|
|
import {ErrorMessage} from "@/components/error-message";
|
|
import {Label} from "@/components/label";
|
|
import {Tag} from "@/components/tag";
|
|
import {TagGroup} from "@/components/tag-group";
|
|
|
|
describe("ErrorMessage", () => {
|
|
let user: ReturnType<typeof setupUser>;
|
|
|
|
beforeAll(() => {
|
|
user = setupUser();
|
|
});
|
|
|
|
it("exposes data-slot and BEM block standalone", () => {
|
|
render(<ErrorMessage>Something went wrong</ErrorMessage>);
|
|
|
|
const message = document.querySelector('[data-slot="error-message"]');
|
|
|
|
expect(message).not.toBeNull();
|
|
expect(message?.className).toEqual(expect.stringContaining("error-message"));
|
|
expect(screen.getByText("Something went wrong")).toBeInTheDocument();
|
|
});
|
|
|
|
it("renders when TagGroup exposes the errorMessage slot", () => {
|
|
render(
|
|
<TagGroup selectionMode="multiple">
|
|
<Label>Amenities</Label>
|
|
<TagGroup.List>
|
|
<Tag id="laundry">Laundry</Tag>
|
|
</TagGroup.List>
|
|
<ErrorMessage>Please select at least one category</ErrorMessage>
|
|
</TagGroup>,
|
|
);
|
|
|
|
expect(document.querySelector('[data-slot="error-message"]')).not.toBeNull();
|
|
expect(screen.getByText("Please select at least one category")).toBeInTheDocument();
|
|
});
|
|
|
|
it("supports gating by selection state inside TagGroup", async () => {
|
|
const Example = () => {
|
|
const [selected, setSelected] = useState<Iterable<Key>>(new Set());
|
|
const isInvalid = useMemo(() => Array.from(selected).length === 0, [selected]);
|
|
|
|
return (
|
|
<TagGroup selectedKeys={selected} selectionMode="multiple" onSelectionChange={setSelected}>
|
|
<Label>Amenities</Label>
|
|
<TagGroup.List>
|
|
<Tag id="laundry">Laundry</Tag>
|
|
</TagGroup.List>
|
|
{!!isInvalid && <ErrorMessage>Please select at least one category</ErrorMessage>}
|
|
</TagGroup>
|
|
);
|
|
};
|
|
|
|
render(<Example />);
|
|
|
|
expect(screen.getByText("Please select at least one category")).toBeInTheDocument();
|
|
|
|
await user.click(screen.getByRole("row", {name: "Laundry"}));
|
|
|
|
expect(screen.queryByText("Please select at least one category")).toBeNull();
|
|
});
|
|
});
|