π§ͺDNT-2724 Accordion Testing
// # TextMatch type accenpts function: https://testing-library.com/docs/queries/about/#textmatch
import { renderWithCTX, screen, Matcher } from "src/lib/testWrappers";
import userEvent from "@testing-library/user-event";
import "@testing-library/jest-dom";
import { Accordion, themeMap } from "./index";
import { compositionFunction } from "./composition";
import data from "./data";
import { stripHTMLTags } from "src/lib/helpers";
jest.mock("src/lib/useIntersection");
describe("Accordion", () => {
const props = compositionFunction(data);
it.skip("should render the correct items", () => {
renderWithCTX(<Accordion {...props} />);
for (let i = 0; i < props.items.length - 1; i++) {
const accordionTitle = screen.getByText(
props?.items[0]?.title?.value as string
);
expect(accordionTitle).toBeTruthy();
}
});
it.skip("should render Accordion Component with image", () => {
renderWithCTX(<Accordion {...props} />);
const img = screen.getByRole("img", { name: /facebook/i });
expect(img).toBeInTheDocument();
});
it("should reveal text when user clicks", async () => {
renderWithCTX(<Accordion {...props} />);
const accordionButton = screen.getByRole("button", {
name: props.items[0].title?.value,
});
// # Full Manual Query:
// (This is actually not good - getByText won't respect eg aria- attrs like getByRole so we aren't actually testing anything)
// These are [not exposed to a11y tree](https://testing-library.com/docs/queries/about/#priority)
// π
// screen.getByText(
// /proin laoreet mauris vel urna tempor ultricies\. duis rhoncus lorem sed tellus egestas bibendum\. in aliquam mauris est, vel condimentum metus aliquet a\. nunc volutpat tincidunt nisl luctus pretium\. sagittis elit non, vestibulum metus\. mauris maximus vitae magna in mattis\. integer interdum maximus felis sed placerat\. nam lobortis tellus non felis fermentum, vitae venenatis ligula congue\. donec sit amet luctus odio\. magna commodo, sodales convallis ante scelerisque\. etiam ipsum lorem, rhoncus a sapien id, placerat consequat nunc\. curabitur in orci libero\. morbi tincidunt ante vel sem rutrum tempor\. cras ac purus quis urna maximus volutpat\./i
// );
// # We can still do a findByText,
// but we need to check ourselves whether it is accessible:
// π
const hiddenText = await screen.findByText((content, element) => {
const hasTextContent =
element?.innerHTML === props?.items[0]?.text?.value;
return hasTextContent;
});
expect(hiddenText).toBeInTheDocument();
expect(hiddenText).toHaveAttribute("aria-hidden", "true");
await userEvent.click(accordionButton);
// # Compare against textContent stripHTMLTags:
// (similar to https://polvara.me/posts/five-things-you-didnt-know-about-testing-library)
// π
// const noTag = stripHTMLTags(props?.items?.[0]?.text?.value as string);
// const [revealedText] = await screen.findAllByText(
// // @ts-ignore
// // eslint-disable-next-line
// (content, element) => element?.textContent === noTag
// // ? console.log('π₯', content) || true : false
// );
// expect(revealedText).toBeInTheDocument();
// console.log('π³', noTag);
// π³ Proin laoreet mauris vel urna tempor ultricies. Duis rhoncus lorem sed tellus egestas bibendum. In aliquam mauris est, vel condimentum metus aliquet a. Nunc volutpat tincidunt nisl luctus pretium. Duis et ligula semper, sagittis elit non, vestibulum metus. Mauris maximus vitae magna in mattis. Integer interdum maximus felis sed placerat. Nam lobortis tellus non felis fermentum, vitae venenatis ligula congue. Donec sit amet luctus odio. Nam convallis justo vitae magna commodo, sodales convallis ante scelerisque. Etiam ipsum lorem, rhoncus a sapien id, placerat consequat nunc. Curabitur in orci libero. Morbi tincidunt ante vel sem rutrum tempor. Cras ac purus quis urna maximus volutpat.
// # Find by innerHTML:
// π
const revealedText = await screen.findByText((content, element) => {
const hasTextContent =
element?.innerHTML === props?.items[0]?.text?.value;
return hasTextContent;
});
expect(revealedText).toBeInTheDocument();
expect(revealedText).toHaveAttribute("aria-hidden", "false");
});
// Overall, probably ultimately more durable / less error prone to use a testid and check aria- attrs
it.skip("renders the correct default style", () => {
const { rerender } = renderWithCTX(<Accordion {...props} />);
const button = screen.getByRole("button", {
name: /accordion trigger one/i,
});
expect(button).toHaveClass(themeMap.default.button);
const altThemeProp = { ...props, theme: "footer" } as const;
rerender(<Accordion {...altThemeProp} />);
expect(button).toHaveClass(themeMap?.footer?.button);
});
});
Last updated
Was this helpful?