React Testing Library => within nested queries
Wow, React Testing Library has a within helper to get nested searches on the dom. Check this out with this example:
const DATA = {
movies: ["The Godfather", "Pulp Fiction"],
tv: ["Friends", "Game of Thrones"],
};
const MyContainer = () => (
<>
{Object.keys(DATA).map(category => (
<MyCategory name={category} list={DATA[category]} />
))}
</>
);
const MyCategory = ({name, list}) => (
<ul data-testid={name} role="list">
{list.map(item => <li role="listitem">{item}</li>)}
</ul>
);
Then let's say if we want to assert the list of movies that this MyContainer
renders and in the same order as it's been rendered we can:
...
import { render, within } from "@testing-library/react";
import MyContainer from "../MyContainer";
describe("MyContainer", () => {
it("tests movies", () => {
const { getByTestId, getAllByRole } = render(<MyContainer />);
const moviesCategory = getByTestId("movies");
const movies = within(moviesCategory).getAllByRole("listitem");
expect(items.length).toBe(2);
expect(items[0]).toHaveTextContent("The Godfather");
expect(items[1]).toHaveTextContent("Pulp Fiction");
});
});
Real code is way more complex than this example, so this within
helper function turns to be very convenient.