fix(spawn): keep worker modal open on errors

This commit is contained in:
yyovil 2026-06-11 16:39:13 +05:30 committed by GitHub
parent 4d3696df28
commit f07104dacc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 64 additions and 1 deletions

View File

@ -0,0 +1,59 @@
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { describe, expect, it, vi } from "vitest";
import { SpawnWorkerModal } from "./SpawnWorkerModal";
import { TooltipProvider } from "./ui/tooltip";
import type { WorkspaceSummary } from "../types/workspace";
const workspaces: WorkspaceSummary[] = [{ id: "proj-1", name: "my-app", path: "/p", type: "main", sessions: [] }];
function renderModal(onCreateTask = vi.fn().mockResolvedValue(undefined), onOpenChange = () => undefined) {
render(
<TooltipProvider>
<SpawnWorkerModal
open
onOpenChange={onOpenChange}
workspaces={workspaces}
defaultProjectId="proj-1"
onCreateTask={onCreateTask}
/>
</TooltipProvider>,
);
return onCreateTask;
}
describe("SpawnWorkerModal", () => {
it("requires a non-empty prompt before it can spawn", () => {
const onCreateTask = renderModal();
expect(screen.getByRole("button", { name: /Spawn worker/ })).toBeDisabled();
expect(onCreateTask).not.toHaveBeenCalled();
});
it("keeps the modal open and shows the daemon error when the spawn fails", async () => {
const user = userEvent.setup();
const onOpenChange = vi.fn();
let rejectSpawn!: (reason: Error) => void;
const onCreateTask = vi.fn(
() =>
new Promise<void>((_, reject) => {
rejectSpawn = reject;
}),
);
renderModal(onCreateTask, onOpenChange);
await user.type(await screen.findByLabelText("Prompt"), "do the thing");
await user.click(screen.getByRole("button", { name: /Spawn worker/ }));
expect(screen.getByRole("button", { name: /Spawn worker/ })).toBeDisabled();
rejectSpawn(new Error("branch already checked out at ~/Projects/skills"));
expect(await screen.findByRole("alert")).toHaveTextContent("branch already checked out at ~/Projects/skills");
expect(onOpenChange).not.toHaveBeenCalled();
expect(screen.getByLabelText("Prompt")).toHaveValue("do the thing");
onCreateTask.mockResolvedValueOnce(undefined);
await user.click(screen.getByRole("button", { name: /Spawn worker/ }));
await waitFor(() => expect(onOpenChange).toHaveBeenCalledWith(false));
expect(onCreateTask).toHaveBeenCalledTimes(2);
});
});

View File

@ -202,7 +202,11 @@ export function SpawnWorkerModal({
)}
</div>
{error && <p className="text-[12px] text-error">{error}</p>}
{error && (
<p className="text-[12px] text-error" role="alert">
{error}
</p>
)}
<div className="-mx-[18px] -mb-[18px] flex justify-end border-t border-border bg-surface px-3.5 py-3">
<Button disabled={!canSubmit} type="submit" variant="primary">