mirror of
https://github.com/earendil-works/pi.git
synced 2026-06-18 15:54:04 +08:00
73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import { InteractiveMode } from "../src/modes/interactive/interactive-mode.ts";
|
|
|
|
type SubmitContext = {
|
|
defaultEditor: { onSubmit?: (text: string) => void };
|
|
editor: {
|
|
addToHistory?: (text: string) => void;
|
|
setText: (text: string) => void;
|
|
};
|
|
session: {
|
|
isCompacting: boolean;
|
|
isStreaming: boolean;
|
|
isBashRunning: boolean;
|
|
prompt: (text: string, options?: unknown) => Promise<void>;
|
|
};
|
|
flushPendingBashComponents: () => void;
|
|
onInputCallback?: (text: string) => void;
|
|
pendingUserInputs: string[];
|
|
};
|
|
|
|
type InputContext = {
|
|
onInputCallback?: (text: string) => void;
|
|
pendingUserInputs: string[];
|
|
};
|
|
|
|
type InteractiveModePrivate = {
|
|
setupEditorSubmitHandler(this: SubmitContext): void;
|
|
getUserInput(this: InputContext): Promise<string>;
|
|
};
|
|
|
|
const interactiveModePrototype = InteractiveMode.prototype as unknown as InteractiveModePrivate;
|
|
|
|
function createSubmitContext(): SubmitContext {
|
|
return {
|
|
defaultEditor: {},
|
|
editor: {
|
|
addToHistory: vi.fn(),
|
|
setText: vi.fn(),
|
|
},
|
|
session: {
|
|
isCompacting: false,
|
|
isStreaming: false,
|
|
isBashRunning: false,
|
|
prompt: vi.fn(async () => {}),
|
|
},
|
|
flushPendingBashComponents: vi.fn(),
|
|
pendingUserInputs: [],
|
|
};
|
|
}
|
|
|
|
describe("InteractiveMode startup input", () => {
|
|
it("queues a normal prompt submitted before the input callback is installed", async () => {
|
|
const context = createSubmitContext();
|
|
interactiveModePrototype.setupEditorSubmitHandler.call(context);
|
|
|
|
await context.defaultEditor.onSubmit?.(" early prompt ");
|
|
|
|
expect(context.pendingUserInputs).toEqual(["early prompt"]);
|
|
expect(context.flushPendingBashComponents).toHaveBeenCalledTimes(1);
|
|
expect(context.editor.addToHistory).toHaveBeenCalledWith("early prompt");
|
|
});
|
|
|
|
it("returns queued startup input before installing a new input callback", async () => {
|
|
const context: InputContext = {
|
|
pendingUserInputs: ["queued prompt"],
|
|
};
|
|
|
|
await expect(interactiveModePrototype.getUserInput.call(context)).resolves.toBe("queued prompt");
|
|
expect(context.onInputCallback).toBeUndefined();
|
|
expect(context.pendingUserInputs).toEqual([]);
|
|
});
|
|
});
|