user-avatar.test.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { render, screen } from "@testing-library/react";
  2. import userEvent from "@testing-library/user-event";
  3. import { afterEach, describe, expect, it, vi } from "vitest";
  4. import { UserAvatar } from "#/components/user-avatar";
  5. describe("UserAvatar", () => {
  6. const onClickMock = vi.fn();
  7. afterEach(() => {
  8. onClickMock.mockClear();
  9. });
  10. it("(default) should render the placeholder avatar when the user is logged out", () => {
  11. render(<UserAvatar onClick={onClickMock} />);
  12. expect(screen.getByTestId("user-avatar")).toBeInTheDocument();
  13. expect(
  14. screen.getByLabelText("user avatar placeholder"),
  15. ).toBeInTheDocument();
  16. });
  17. it("should call onClick when clicked", async () => {
  18. const user = userEvent.setup();
  19. render(<UserAvatar onClick={onClickMock} />);
  20. const userAvatarContainer = screen.getByTestId("user-avatar");
  21. await user.click(userAvatarContainer);
  22. expect(onClickMock).toHaveBeenCalledOnce();
  23. });
  24. it("should display the user's avatar when available", () => {
  25. render(
  26. <UserAvatar
  27. onClick={onClickMock}
  28. avatarUrl="https://example.com/avatar.png"
  29. />,
  30. );
  31. expect(screen.getByAltText("user avatar")).toBeInTheDocument();
  32. expect(
  33. screen.queryByLabelText("user avatar placeholder"),
  34. ).not.toBeInTheDocument();
  35. });
  36. it("should display a loading spinner instead of an avatar when isLoading is true", () => {
  37. const { rerender } = render(<UserAvatar onClick={onClickMock} />);
  38. expect(screen.queryByTestId("loading-spinner")).not.toBeInTheDocument();
  39. expect(
  40. screen.getByLabelText("user avatar placeholder"),
  41. ).toBeInTheDocument();
  42. rerender(<UserAvatar onClick={onClickMock} isLoading />);
  43. expect(screen.getByTestId("loading-spinner")).toBeInTheDocument();
  44. expect(
  45. screen.queryByLabelText("user avatar placeholder"),
  46. ).not.toBeInTheDocument();
  47. rerender(
  48. <UserAvatar
  49. onClick={onClickMock}
  50. avatarUrl="https://example.com/avatar.png"
  51. isLoading
  52. />,
  53. );
  54. expect(screen.getByTestId("loading-spinner")).toBeInTheDocument();
  55. expect(screen.queryByAltText("user avatar")).not.toBeInTheDocument();
  56. });
  57. });