mirror of
https://github.com/murashit/codex-panel.git
synced 2026-07-22 06:57:10 +00:00
71 lines
2.6 KiB
TypeScript
71 lines
2.6 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
|
|
import { ChatController } from "../../../../../src/features/chat/chat-controller";
|
|
import { createChatState, createChatStateStore } from "../../../../../src/features/chat/chat-state";
|
|
import { PendingRequestController } from "../../../../../src/features/chat/controllers/requests/pending-request-controller";
|
|
import { toPendingUserInput } from "../../../../../src/features/chat/user-input/model";
|
|
import type { ServerRequest } from "../../../../../src/generated/app-server/ServerRequest";
|
|
|
|
function expectPresent<T>(value: T | null | undefined): T {
|
|
if (value === null || value === undefined) throw new Error("Expected value to be present");
|
|
return value;
|
|
}
|
|
|
|
describe("PendingRequestController", () => {
|
|
it("resolves user input from immutable draft state and refreshes the host", () => {
|
|
const stateStore = createChatStateStore(createChatState());
|
|
const respondToServerRequest = vi.fn().mockReturnValue(true);
|
|
const refreshLiveState = vi.fn();
|
|
const render = vi.fn();
|
|
const controller = new ChatController(stateStore, {
|
|
refreshThreads: vi.fn(),
|
|
refreshSkills: vi.fn(),
|
|
publishAppServerMetadata: vi.fn(),
|
|
maybeNameThread: vi.fn(),
|
|
notifyThreadArchived: vi.fn(),
|
|
notifyThreadRenamed: vi.fn(),
|
|
recordMcpStartupStatus: vi.fn(),
|
|
respondToServerRequest,
|
|
rejectServerRequest: vi.fn(),
|
|
});
|
|
const pendingRequests = new PendingRequestController({
|
|
stateStore,
|
|
controller,
|
|
composerHasFocus: () => false,
|
|
refreshLiveState,
|
|
render,
|
|
});
|
|
const input = expectPresent(toPendingUserInput(userInputRequest()));
|
|
stateStore.dispatch({ type: "request/user-input-queued", input });
|
|
stateStore.dispatch({ type: "request/user-input-draft-set", key: "7:direction", value: "Left" });
|
|
|
|
pendingRequests.resolveUserInput(input);
|
|
|
|
expect(respondToServerRequest).toHaveBeenCalledWith(7, { answers: { direction: { answers: ["Left"] } } });
|
|
expect(stateStore.getState().pendingUserInputs).toEqual([]);
|
|
expect(refreshLiveState).toHaveBeenCalledOnce();
|
|
expect(render).toHaveBeenCalledOnce();
|
|
});
|
|
});
|
|
|
|
function userInputRequest(): ServerRequest {
|
|
return {
|
|
id: 7,
|
|
method: "item/tool/requestUserInput",
|
|
params: {
|
|
threadId: "thread",
|
|
turnId: "turn",
|
|
itemId: "item",
|
|
questions: [
|
|
{
|
|
id: "direction",
|
|
header: "Direction",
|
|
question: "Which way?",
|
|
isOther: true,
|
|
isSecret: false,
|
|
options: [{ label: "Recommended", description: "Use the default path" }],
|
|
},
|
|
],
|
|
},
|
|
};
|
|
}
|