chat-message.test.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { render, screen } from "@testing-library/react";
  2. import userEvent from "@testing-library/user-event";
  3. import { describe, it, expect, test } from "vitest";
  4. import { ChatMessage } from "#/components/features/chat/chat-message";
  5. describe("ChatMessage", () => {
  6. it("should render a user message", () => {
  7. render(<ChatMessage type="user" message="Hello, World!" />);
  8. expect(screen.getByTestId("user-message")).toBeInTheDocument();
  9. expect(screen.getByText("Hello, World!")).toBeInTheDocument();
  10. });
  11. it("should render an assistant message", () => {
  12. render(<ChatMessage type="assistant" message="Hello, World!" />);
  13. expect(screen.getByTestId("assistant-message")).toBeInTheDocument();
  14. expect(screen.getByText("Hello, World!")).toBeInTheDocument();
  15. });
  16. it.skip("should support code syntax highlighting", () => {
  17. const code = "```js\nconsole.log('Hello, World!')\n```";
  18. render(<ChatMessage type="user" message={code} />);
  19. // SyntaxHighlighter breaks the code blocks into "tokens"
  20. expect(screen.getByText("console")).toBeInTheDocument();
  21. expect(screen.getByText("log")).toBeInTheDocument();
  22. expect(screen.getByText("'Hello, World!'")).toBeInTheDocument();
  23. });
  24. it("should render the copy to clipboard button when the user hovers over the message", async () => {
  25. const user = userEvent.setup();
  26. render(<ChatMessage type="user" message="Hello, World!" />);
  27. const message = screen.getByText("Hello, World!");
  28. expect(screen.getByTestId("copy-to-clipboard")).not.toBeVisible();
  29. await user.hover(message);
  30. expect(screen.getByTestId("copy-to-clipboard")).toBeVisible();
  31. });
  32. it("should copy content to clipboard", async () => {
  33. const user = userEvent.setup();
  34. render(<ChatMessage type="user" message="Hello, World!" />);
  35. const copyToClipboardButton = screen.getByTestId("copy-to-clipboard");
  36. await user.click(copyToClipboardButton);
  37. expect(navigator.clipboard.readText()).resolves.toBe("Hello, World!");
  38. });
  39. it("should display an error toast if copying content to clipboard fails", async () => {});
  40. it("should render a component passed as a prop", () => {
  41. function Component() {
  42. return <div data-testid="custom-component">Custom Component</div>;
  43. }
  44. render(
  45. <ChatMessage type="user" message="Hello, World">
  46. <Component />
  47. </ChatMessage>,
  48. );
  49. expect(screen.getByTestId("custom-component")).toBeInTheDocument();
  50. });
  51. it("should apply correct styles to inline code", () => {
  52. render(
  53. <ChatMessage
  54. type="assistant"
  55. message="Here is some `inline code` text"
  56. />,
  57. );
  58. const codeElement = screen.getByText("inline code");
  59. expect(codeElement.tagName.toLowerCase()).toBe("code");
  60. expect(codeElement.closest("article")).not.toBeNull();
  61. });
  62. });