fix(ui): restore the mid-dry-run submit guard and its regression tests

This commit is contained in:
Tin Chi Lo 2026-08-27 21:01:40 -07:00
parent b2f86cf1de
commit 768fcaed2e
2 changed files with 45 additions and 0 deletions

View file

@ -210,6 +210,29 @@ describe("AddAutoRouterTab", () => {
expect(handleAddAutoRouterSubmit).not.toHaveBeenCalled();
});
it("creates the router once when the form is submitted again mid dry-run", async () => {
vi.mocked(getMissingTiersError).mockReturnValue(null);
let resolveVerdict: (verdict: { valid: boolean }) => void = () => {};
validateAutoRouterConfig.mockImplementationOnce(
() =>
new Promise((resolve) => {
resolveVerdict = resolve;
}),
);
const { container } = renderWithProviders(<Harness />);
fireEvent.change(screen.getByPlaceholderText(/smart_router/i), { target: { value: "double-submit-router" } });
fireEvent.submit(container.querySelector("form")!);
await waitFor(() => expect(screen.getByRole("button", { name: /add auto router/i })).toBeDisabled());
fireEvent.submit(container.querySelector("form")!);
resolveVerdict({ valid: true });
await waitFor(() => expect(screen.getByRole("button", { name: /add auto router/i })).toBeEnabled());
expect(validateAutoRouterConfig).toHaveBeenCalledTimes(1);
expect(handleAddAutoRouterSubmit).toHaveBeenCalledTimes(1);
});
it("submits when the dry-run passes, so the gate is not simply blocking everything", async () => {
const user = userEvent.setup();
vi.mocked(getMissingTiersError).mockReturnValue(null);
@ -652,6 +675,27 @@ describe("AddAutoRouterTab", () => {
await waitFor(() => expect(toast.fromError).toHaveBeenCalledWith(expect.stringContaining("no longer available")));
expect(handleAddAutoRouterSubmit).not.toHaveBeenCalled();
});
it("carries a preset's per-tier reasoning effort through to the create payload", async () => {
const user = userEvent.setup();
mockFetchAvailableModels.mockResolvedValue(ALL_FAMILY_MODELS);
renderWithProviders(<Harness />);
await waitForPresetEnabled("Anthropic Family");
await selectTemplate("Anthropic Family");
await user.type(screen.getByPlaceholderText(/smart_router/i), "anthropic-router");
await user.click(screen.getByRole("button", { name: /add auto router/i }));
await waitFor(() => expect(handleAddAutoRouterSubmit).toHaveBeenCalled());
expect(vi.mocked(handleAddAutoRouterSubmit).mock.calls.at(-1)?.[0]).toMatchObject({
complexity_router_config: {
tier_model_configs: {
REASONING: [{ model_name: "claude-opus-5", litellm_params: { reasoning_effort: "high" } }],
},
},
});
});
});
describe("default model pin", () => {

View file

@ -425,6 +425,7 @@ const AddAutoRouterTab: React.FC<AddAutoRouterTabProps> = ({
};
const handleAutoRouterSubmit = async () => {
if (isSubmitting) return;
const name = form.getValues("auto_router_name");
if (!name) {
setShowValidationErrors(true);