Files
heroui-inc--heroui/packages/react/tests/components/error-message/error-message.test.tsx
T
WK bb9c4b5582 V3.2.4 (#6758)
* 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>
2026-08-07 06:19:12 -07:00

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();
});
});