feat(run): per-tool run setup fields and binary probe
This commit is contained in:
@@ -74,7 +74,10 @@ function baseProps() {
|
||||
showLaneSelector: false,
|
||||
onLaneIdChange: vi.fn(),
|
||||
onLaneCreated: vi.fn(),
|
||||
binaryStatus: { found: true, path: "/usr/local/bin/claude" },
|
||||
binaryStatus: {
|
||||
claude: { found: true, path: "/usr/local/bin/claude" },
|
||||
codex: { found: true, path: "/usr/local/bin/codex" },
|
||||
},
|
||||
cwdSuggestions: [],
|
||||
activeRuns: { items: [] },
|
||||
wsConnected: true,
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
import { MemoryRouter } from "react-router-dom";
|
||||
import { fireEvent, render, screen } from "@testing-library/react";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import i18n from "i18next";
|
||||
import { RunSetup } from "../RunSetup";
|
||||
@@ -47,6 +48,9 @@ function renderSetup(overrides: Partial<React.ComponentProps<typeof RunSetup>> =
|
||||
onStart: vi.fn(),
|
||||
onResumeSessionChange: vi.fn(),
|
||||
onResumeFromHistory: vi.fn(),
|
||||
onSandboxChange: vi.fn(),
|
||||
onApprovalChange: vi.fn(),
|
||||
onResumeLast: vi.fn(),
|
||||
};
|
||||
const utils = render(
|
||||
<MemoryRouter>
|
||||
@@ -64,6 +68,9 @@ function renderSetup(overrides: Partial<React.ComponentProps<typeof RunSetup>> =
|
||||
resumeSession={null}
|
||||
slashCommands={[]}
|
||||
runHistory={[]}
|
||||
tool="claude"
|
||||
sandbox="workspace-write"
|
||||
approval="on-request"
|
||||
{...spies}
|
||||
{...overrides}
|
||||
/>
|
||||
@@ -273,6 +280,9 @@ describe("RunSetup — resume picker scopes sessions to the selected lane", () =
|
||||
slashCommands={[]}
|
||||
runHistory={[]}
|
||||
laneCwd="/Users/tester/lane-b"
|
||||
tool="claude"
|
||||
sandbox="workspace-write"
|
||||
approval="on-request"
|
||||
onPromptChange={vi.fn()}
|
||||
onCwdChange={vi.fn()}
|
||||
onModelChange={vi.fn()}
|
||||
@@ -281,6 +291,9 @@ describe("RunSetup — resume picker scopes sessions to the selected lane", () =
|
||||
onStart={vi.fn()}
|
||||
onResumeSessionChange={vi.fn()}
|
||||
onResumeFromHistory={vi.fn()}
|
||||
onSandboxChange={vi.fn()}
|
||||
onApprovalChange={vi.fn()}
|
||||
onResumeLast={vi.fn()}
|
||||
/>
|
||||
</MemoryRouter>
|
||||
);
|
||||
@@ -291,3 +304,29 @@ describe("RunSetup — resume picker scopes sessions to the selected lane", () =
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("RunSetup — per-tool fields", () => {
|
||||
it("shows sandbox and approval instead of permission mode for a codex lane", () => {
|
||||
renderSetup({ tool: "codex" });
|
||||
expect(screen.getByText(/sandbox/i)).toBeInTheDocument();
|
||||
expect(screen.getByText(/approval/i)).toBeInTheDocument();
|
||||
expect(screen.queryByText(/permission mode/i)).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("keeps permission mode for a claude lane", () => {
|
||||
renderSetup({ tool: "claude" });
|
||||
expect(screen.getByText(/permission mode/i)).toBeInTheDocument();
|
||||
expect(screen.queryByText(/sandbox/i)).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("sends codex fields on start", async () => {
|
||||
const onStart = vi.fn();
|
||||
const user = userEvent.setup();
|
||||
renderSetup({ tool: "codex", onStart, prompt: "go" });
|
||||
await user.click(screen.getByText(i18n.t("run:actions.start")));
|
||||
expect(onStart).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ sandbox: "workspace-write", approval: "on-request" })
|
||||
);
|
||||
expect(onStart.mock.calls[0]?.[0]?.permissionMode).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user