| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- import { act, screen } from "@testing-library/react";
- import { renderWithProviders } from "test-utils";
- import { vi, describe, afterEach, it, expect } from "vitest";
- import { Command, appendInput, appendOutput } from "#/state/commandSlice";
- import Terminal from "#/components/terminal/Terminal";
- global.ResizeObserver = vi.fn().mockImplementation(() => ({
- observe: vi.fn(),
- disconnect: vi.fn(),
- }));
- const mockTerminal = {
- open: vi.fn(),
- write: vi.fn(),
- writeln: vi.fn(),
- dispose: vi.fn(),
- onKey: vi.fn(),
- attachCustomKeyEventHandler: vi.fn(),
- loadAddon: vi.fn(),
- };
- vi.mock("@xterm/xterm", async (importOriginal) => ({
- ...(await importOriginal<typeof import("@xterm/xterm")>()),
- Terminal: vi.fn().mockImplementation(() => mockTerminal),
- }));
- const renderTerminal = (commands: Command[] = []) =>
- renderWithProviders(<Terminal secrets={[]} />, {
- preloadedState: {
- cmd: {
- commands,
- },
- },
- });
- describe.skip("Terminal", () => {
- afterEach(() => {
- vi.clearAllMocks();
- });
- it("should render a terminal", () => {
- renderTerminal();
- expect(screen.getByText("Terminal")).toBeInTheDocument();
- expect(mockTerminal.open).toHaveBeenCalledTimes(1);
- expect(mockTerminal.write).toHaveBeenCalledWith("$ ");
- });
- it("should load commands to the terminal", () => {
- renderTerminal([
- { type: "input", content: "INPUT" },
- { type: "output", content: "OUTPUT" },
- ]);
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(1, "INPUT");
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(2, "OUTPUT");
- });
- it("should write commands to the terminal", () => {
- const { store } = renderTerminal();
- act(() => {
- store.dispatch(appendInput("echo Hello"));
- store.dispatch(appendOutput("Hello"));
- });
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(1, "echo Hello");
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(2, "Hello");
- act(() => {
- store.dispatch(appendInput("echo World"));
- });
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(3, "echo World");
- });
- it("should load and write commands to the terminal", () => {
- const { store } = renderTerminal([
- { type: "input", content: "echo Hello" },
- { type: "output", content: "Hello" },
- ]);
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(1, "echo Hello");
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(2, "Hello");
- act(() => {
- store.dispatch(appendInput("echo Hello"));
- });
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(3, "echo Hello");
- });
- it("should end the line with a dollar sign after writing a command", () => {
- const { store } = renderTerminal();
- act(() => {
- store.dispatch(appendInput("echo Hello"));
- });
- expect(mockTerminal.writeln).toHaveBeenCalledWith("echo Hello");
- expect(mockTerminal.write).toHaveBeenCalledWith("$ ");
- });
- it("should display a custom symbol if output contains a custom symbol", () => {
- renderTerminal([
- { type: "input", content: "echo Hello" },
- {
- type: "output",
- content:
- "Hello\r\n\r\n[Python Interpreter: /openhands/poetry/openhands-5O4_aCHf-py3.12/bin/python]\nopenhands@659478cb008c:/workspace $ ",
- },
- ]);
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(1, "echo Hello");
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(2, "Hello");
- expect(mockTerminal.write).toHaveBeenCalledWith(
- "\nopenhands@659478cb008c:/workspace $ ",
- );
- });
- // This test fails because it expects `disposeMock` to have been called before the component is unmounted.
- it.skip("should dispose the terminal on unmount", () => {
- const { unmount } = renderWithProviders(<Terminal secrets={[]} />);
- expect(mockTerminal.dispose).not.toHaveBeenCalled();
- unmount();
- expect(mockTerminal.dispose).toHaveBeenCalledTimes(1);
- });
- });
|