ChatMessage.test.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { render, screen } from "@testing-library/react";
  2. import { describe, it, expect } from "vitest";
  3. import React from "react";
  4. import ChatMessage from "./ChatMessage";
  5. // avoid typing side-effect
  6. vi.mock("#/hooks/useTyping", () => ({
  7. useTyping: vi.fn((text: string) => text),
  8. }));
  9. describe("Message", () => {
  10. it("should render a user message", () => {
  11. render(
  12. <ChatMessage
  13. message={{ sender: "user", content: "Hello" }}
  14. isLastMessage={false}
  15. />,
  16. );
  17. expect(screen.getByTestId("message")).toBeInTheDocument();
  18. expect(screen.getByTestId("message")).toHaveClass("self-end"); // user message should be on the right side
  19. });
  20. it("should render an assistant message", () => {
  21. render(
  22. <ChatMessage
  23. message={{ sender: "assistant", content: "Hi" }}
  24. isLastMessage={false}
  25. />,
  26. );
  27. expect(screen.getByTestId("message")).toBeInTheDocument();
  28. expect(screen.getByTestId("message")).not.toHaveClass("self-end"); // assistant message should be on the left side
  29. });
  30. it("should render markdown content", () => {
  31. render(
  32. <ChatMessage
  33. message={{
  34. sender: "user",
  35. content: "```js\nconsole.log('Hello')\n```",
  36. }}
  37. isLastMessage={false}
  38. />,
  39. );
  40. // SyntaxHighlighter breaks the code blocks into "tokens"
  41. expect(screen.getByText("console")).toBeInTheDocument();
  42. expect(screen.getByText("log")).toBeInTheDocument();
  43. expect(screen.getByText("'Hello'")).toBeInTheDocument();
  44. });
  45. });