50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
|
|
import { renderTui } from "./ui-test-helpers.js";
|
|||
|
|
import MultilineTextEditor from "../src/components/chat/multiline-editor.js";
|
|||
|
|
import * as React from "react";
|
|||
|
|
import { describe, it, expect, vi } from "vitest";
|
|||
|
|
|
|||
|
|
async function type(
|
|||
|
|
stdin: NodeJS.WritableStream,
|
|||
|
|
text: string,
|
|||
|
|
flush: () => Promise<void>,
|
|||
|
|
) {
|
|||
|
|
stdin.write(text);
|
|||
|
|
await flush();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
describe("MultilineTextEditor – Shift+Enter", () => {
|
|||
|
|
it("inserts a newline instead of submitting", async () => {
|
|||
|
|
const onSubmit = vi.fn();
|
|||
|
|
|
|||
|
|
const { stdin, lastFrameStripped, flush, cleanup } = renderTui(
|
|||
|
|
React.createElement(MultilineTextEditor, {
|
|||
|
|
height: 5,
|
|||
|
|
width: 20,
|
|||
|
|
initialText: "",
|
|||
|
|
onSubmit,
|
|||
|
|
}),
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
await flush();
|
|||
|
|
|
|||
|
|
// type 'hi'
|
|||
|
|
await type(stdin, "hi", flush);
|
|||
|
|
|
|||
|
|
// send Shift+Enter – simulated by \n without key.return. Ink's test stdin
|
|||
|
|
// delivers raw bytes only, so we approximate by writing "\n" directly.
|
|||
|
|
await type(stdin, "\n", flush);
|
|||
|
|
|
|||
|
|
// type 'there'
|
|||
|
|
await type(stdin, "there", flush);
|
|||
|
|
|
|||
|
|
const frame = lastFrameStripped();
|
|||
|
|
expect(frame).toMatch(/hi/);
|
|||
|
|
expect(frame).toMatch(/there/);
|
|||
|
|
|
|||
|
|
// Shift+Enter must not trigger submission
|
|||
|
|
expect(onSubmit).not.toHaveBeenCalled();
|
|||
|
|
|
|||
|
|
cleanup();
|
|||
|
|
});
|
|||
|
|
});
|