mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-15 20:10:42 +00:00
146 lines
4.2 KiB
TypeScript
146 lines
4.2 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import { createSubmitHarness } from "./tui-submit-test-helpers.js";
|
|
import { createSubmitBurstCoalescer, shouldEnableWindowsGitBashPasteFallback } from "./tui.js";
|
|
|
|
describe("createEditorSubmitHandler", () => {
|
|
it("routes lines starting with ! to handleBangLine", () => {
|
|
const { handleCommand, sendMessage, handleBangLine, onSubmit } = createSubmitHarness();
|
|
|
|
onSubmit("!ls");
|
|
|
|
expect(handleBangLine).toHaveBeenCalledTimes(1);
|
|
expect(handleBangLine).toHaveBeenCalledWith("!ls");
|
|
expect(sendMessage).not.toHaveBeenCalled();
|
|
expect(handleCommand).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("treats a lone ! as a normal message", () => {
|
|
const { sendMessage, handleBangLine, onSubmit } = createSubmitHarness();
|
|
|
|
onSubmit("!");
|
|
|
|
expect(handleBangLine).not.toHaveBeenCalled();
|
|
expect(sendMessage).toHaveBeenCalledTimes(1);
|
|
expect(sendMessage).toHaveBeenCalledWith("!");
|
|
});
|
|
|
|
it("does not treat leading whitespace before ! as a bang command", () => {
|
|
const { editor, sendMessage, handleBangLine, onSubmit } = createSubmitHarness();
|
|
|
|
onSubmit(" !ls");
|
|
|
|
expect(handleBangLine).not.toHaveBeenCalled();
|
|
expect(sendMessage).toHaveBeenCalledWith("!ls");
|
|
expect(editor.addToHistory).toHaveBeenCalledWith("!ls");
|
|
});
|
|
|
|
it("trims normal messages before sending and adding to history", () => {
|
|
const { editor, sendMessage, onSubmit } = createSubmitHarness();
|
|
|
|
onSubmit(" hello ");
|
|
|
|
expect(sendMessage).toHaveBeenCalledWith("hello");
|
|
expect(editor.addToHistory).toHaveBeenCalledWith("hello");
|
|
});
|
|
|
|
it("preserves internal newlines for multiline messages", () => {
|
|
const { editor, handleCommand, sendMessage, handleBangLine, onSubmit } = createSubmitHarness();
|
|
|
|
onSubmit("Line 1\nLine 2\nLine 3");
|
|
|
|
expect(sendMessage).toHaveBeenCalledWith("Line 1\nLine 2\nLine 3");
|
|
expect(editor.addToHistory).toHaveBeenCalledWith("Line 1\nLine 2\nLine 3");
|
|
expect(handleCommand).not.toHaveBeenCalled();
|
|
expect(handleBangLine).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe("createSubmitBurstCoalescer", () => {
|
|
it("coalesces rapid single-line submits into one multiline submit when enabled", () => {
|
|
vi.useFakeTimers();
|
|
const submit = vi.fn();
|
|
let now = 1_000;
|
|
const onSubmit = createSubmitBurstCoalescer({
|
|
submit,
|
|
enabled: true,
|
|
burstWindowMs: 50,
|
|
now: () => now,
|
|
});
|
|
|
|
onSubmit("Line 1");
|
|
now += 10;
|
|
onSubmit("Line 2");
|
|
now += 10;
|
|
onSubmit("Line 3");
|
|
|
|
expect(submit).not.toHaveBeenCalled();
|
|
|
|
vi.advanceTimersByTime(50);
|
|
|
|
expect(submit).toHaveBeenCalledTimes(1);
|
|
expect(submit).toHaveBeenCalledWith("Line 1\nLine 2\nLine 3");
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("passes through immediately when disabled", () => {
|
|
const submit = vi.fn();
|
|
const onSubmit = createSubmitBurstCoalescer({
|
|
submit,
|
|
enabled: false,
|
|
});
|
|
|
|
onSubmit("Line 1");
|
|
onSubmit("Line 2");
|
|
|
|
expect(submit).toHaveBeenCalledTimes(2);
|
|
expect(submit).toHaveBeenNthCalledWith(1, "Line 1");
|
|
expect(submit).toHaveBeenNthCalledWith(2, "Line 2");
|
|
});
|
|
});
|
|
|
|
describe("shouldEnableWindowsGitBashPasteFallback", () => {
|
|
it("enables fallback on Windows Git Bash env", () => {
|
|
expect(
|
|
shouldEnableWindowsGitBashPasteFallback({
|
|
platform: "win32",
|
|
env: {
|
|
MSYSTEM: "MINGW64",
|
|
} as NodeJS.ProcessEnv,
|
|
}),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("enables fallback on macOS iTerm", () => {
|
|
expect(
|
|
shouldEnableWindowsGitBashPasteFallback({
|
|
platform: "darwin",
|
|
env: {
|
|
TERM_PROGRAM: "iTerm.app",
|
|
} as NodeJS.ProcessEnv,
|
|
}),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("enables fallback on macOS Terminal.app", () => {
|
|
expect(
|
|
shouldEnableWindowsGitBashPasteFallback({
|
|
platform: "darwin",
|
|
env: {
|
|
TERM_PROGRAM: "Apple_Terminal",
|
|
} as NodeJS.ProcessEnv,
|
|
}),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("disables fallback outside Windows", () => {
|
|
expect(
|
|
shouldEnableWindowsGitBashPasteFallback({
|
|
platform: "linux",
|
|
env: {
|
|
MSYSTEM: "MINGW64",
|
|
} as NodeJS.ProcessEnv,
|
|
}),
|
|
).toBe(false);
|
|
});
|
|
});
|