mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
Co-authored-by: openhands <openhands@all-hands.dev> Co-authored-by: Engel Nyst <engel.nyst@gmail.com> Co-authored-by: tofarr <tofarr@gmail.com> Co-authored-by: Engel Nyst <enyst@users.noreply.github.com> Co-authored-by: Robert Brennan <accounts@rbren.io> Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
69 lines
2.4 KiB
TypeScript
69 lines
2.4 KiB
TypeScript
import { render, screen, waitFor } from "@testing-library/react";
|
|
import userEvent from "@testing-library/user-event";
|
|
import { describe, it, expect } from "vitest";
|
|
import { ChatMessage } from "#/components/features/chat/chat-message";
|
|
|
|
describe("ChatMessage", () => {
|
|
it("should render a user message", () => {
|
|
render(<ChatMessage type="user" message="Hello, World!" />);
|
|
expect(screen.getByTestId("user-message")).toBeInTheDocument();
|
|
expect(screen.getByText("Hello, World!")).toBeInTheDocument();
|
|
});
|
|
|
|
it("should support code syntax highlighting", () => {
|
|
const code = "```js\nconsole.log('Hello, World!')\n```";
|
|
render(<ChatMessage type="user" message={code} />);
|
|
|
|
// SyntaxHighlighter breaks the code blocks into "tokens"
|
|
expect(screen.getByText("console")).toBeInTheDocument();
|
|
expect(screen.getByText("log")).toBeInTheDocument();
|
|
expect(screen.getByText("'Hello, World!'")).toBeInTheDocument();
|
|
});
|
|
|
|
it("should render the copy to clipboard button when the user hovers over the message", async () => {
|
|
const user = userEvent.setup();
|
|
render(<ChatMessage type="user" message="Hello, World!" />);
|
|
const message = screen.getByText("Hello, World!");
|
|
|
|
expect(screen.getByTestId("copy-to-clipboard")).not.toBeVisible();
|
|
|
|
await user.hover(message);
|
|
|
|
expect(screen.getByTestId("copy-to-clipboard")).toBeVisible();
|
|
});
|
|
|
|
it("should copy content to clipboard", async () => {
|
|
const user = userEvent.setup();
|
|
render(<ChatMessage type="user" message="Hello, World!" />);
|
|
const copyToClipboardButton = screen.getByTestId("copy-to-clipboard");
|
|
|
|
await user.click(copyToClipboardButton);
|
|
|
|
await waitFor(() =>
|
|
expect(navigator.clipboard.readText()).resolves.toBe("Hello, World!"),
|
|
);
|
|
});
|
|
|
|
it("should render a component passed as a prop", () => {
|
|
function Component() {
|
|
return <div data-testid="custom-component">Custom Component</div>;
|
|
}
|
|
render(
|
|
<ChatMessage type="user" message="Hello, World">
|
|
<Component />
|
|
</ChatMessage>,
|
|
);
|
|
expect(screen.getByTestId("custom-component")).toBeInTheDocument();
|
|
});
|
|
|
|
it("should apply correct styles to inline code", () => {
|
|
render(
|
|
<ChatMessage type="agent" message="Here is some `inline code` text" />,
|
|
);
|
|
const codeElement = screen.getByText("inline code");
|
|
|
|
expect(codeElement.tagName.toLowerCase()).toBe("code");
|
|
expect(codeElement.closest("article")).not.toBeNull();
|
|
});
|
|
});
|