| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- import { beforeAll, describe, expect, it, vi } from "vitest";
- import { render } from "@testing-library/react";
- import { afterEach } from "node:test";
- import { useTerminal } from "#/hooks/useTerminal";
- import { Command } from "#/state/commandSlice";
- import { WsClientProvider } from "#/context/ws-client-provider";
- import { ReactNode } from "react";
- interface TestTerminalComponentProps {
- commands: Command[];
- secrets: string[];
- }
- function TestTerminalComponent({
- commands,
- secrets,
- }: TestTerminalComponentProps) {
- const ref = useTerminal(commands, secrets);
- return <div ref={ref} />;
- }
- interface WrapperProps {
- children: ReactNode;
- }
- function Wrapper({children}: WrapperProps) {
- return (
- <WsClientProvider enabled={true} token="NO_JWT" ghToken="NO_GITHUB" settings={null}>{children}</WsClientProvider>
- )
- }
- describe("useTerminal", () => {
- const mockTerminal = vi.hoisted(() => ({
- loadAddon: vi.fn(),
- open: vi.fn(),
- write: vi.fn(),
- writeln: vi.fn(),
- onKey: vi.fn(),
- attachCustomKeyEventHandler: vi.fn(),
- dispose: vi.fn(),
- }));
- beforeAll(() => {
- // mock ResizeObserver
- window.ResizeObserver = vi.fn().mockImplementation(() => ({
- observe: vi.fn(),
- unobserve: vi.fn(),
- disconnect: vi.fn(),
- }));
- // mock Terminal
- vi.mock("@xterm/xterm", async (importOriginal) => ({
- ...(await importOriginal<typeof import("@xterm/xterm")>()),
- Terminal: vi.fn().mockImplementation(() => mockTerminal),
- }));
- });
- afterEach(() => {
- vi.clearAllMocks();
- });
- it("should render", () => {
- render(<TestTerminalComponent commands={[]} secrets={[]} />, {
- wrapper: Wrapper,
- });
- });
- it("should render the commands in the terminal", () => {
- const commands: Command[] = [
- { content: "echo hello", type: "input" },
- { content: "hello", type: "output" },
- ];
- render(<TestTerminalComponent commands={commands} secrets={[]} />, {
- wrapper: Wrapper,
- });
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(1, "echo hello");
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(2, "hello");
- });
- it("should hide secrets in the terminal", () => {
- const secret = "super_secret_github_token";
- const anotherSecret = "super_secret_another_token";
- const commands: Command[] = [
- {
- content: `export GITHUB_TOKEN=${secret},${anotherSecret},${secret}`,
- type: "input",
- },
- { content: secret, type: "output" },
- ];
- render(
- <TestTerminalComponent
- commands={commands}
- secrets={[secret, anotherSecret]}
- />,
- {
- wrapper: Wrapper,
- },
- );
- // BUG: `vi.clearAllMocks()` does not clear the number of calls
- // therefore, we need to assume the order of the calls based
- // on the test order
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(
- 3,
- `export GITHUB_TOKEN=${"*".repeat(10)},${"*".repeat(10)},${"*".repeat(10)}`,
- );
- expect(mockTerminal.writeln).toHaveBeenNthCalledWith(4, "*".repeat(10));
- });
- });
|