use-click-outside-element.test.tsx 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import { render, screen } from "@testing-library/react";
  2. import userEvent from "@testing-library/user-event";
  3. import { expect, test, vi } from "vitest";
  4. import { useClickOutsideElement } from "#/hooks/useClickOutsideElement";
  5. interface ClickOutsideTestComponentProps {
  6. callback: () => void;
  7. }
  8. function ClickOutsideTestComponent({
  9. callback,
  10. }: ClickOutsideTestComponentProps) {
  11. const ref = useClickOutsideElement<HTMLDivElement>(callback);
  12. return (
  13. <div>
  14. <div data-testid="inside-element" ref={ref} />
  15. <div data-testid="outside-element" />
  16. </div>
  17. );
  18. }
  19. test("call the callback when the element is clicked outside", async () => {
  20. const user = userEvent.setup();
  21. const callback = vi.fn();
  22. render(<ClickOutsideTestComponent callback={callback} />);
  23. const insideElement = screen.getByTestId("inside-element");
  24. const outsideElement = screen.getByTestId("outside-element");
  25. await user.click(insideElement);
  26. expect(callback).not.toHaveBeenCalled();
  27. await user.click(outsideElement);
  28. expect(callback).toHaveBeenCalled();
  29. });