feat: restore dispatch confirmation flows

This commit is contained in:
kris
2026-03-30 17:11:07 +08:00
parent 40861c63da
commit 5eb1246f02
15 changed files with 823 additions and 9 deletions

View File

@@ -203,3 +203,38 @@ test("POST /api/v1/projects/[projectId]/dispatch-plans/[planId]/confirm confirms
);
assert.ok(notice, "expected a master-agent notice in the group chat after confirmation");
});
test("confirming a dispatch plan marks approval_required groups as approved", async () => {
const { groupProject, dispatchPlan } = await createDispatchPlanForTest();
const approvedTargetProjectId = dispatchPlan.targets[0]?.projectId;
assert.ok(approvedTargetProjectId, "expected a recommended target project");
const state = await readState();
await writeState({
...state,
projects: state.projects.map((project) =>
project.id === groupProject.id
? {
...project,
collaborationMode: "approval_required" as const,
approvalState: "pending_user" as const,
}
: project,
),
});
const response = await confirmDispatchPlanRoute(
await createAuthedRequest(
`http://127.0.0.1:3000/api/v1/projects/${groupProject.id}/dispatch-plans/${dispatchPlan.planId}/confirm`,
"POST",
{ approvedTargetProjectIds: [approvedTargetProjectId] },
),
{ params: Promise.resolve({ projectId: groupProject.id, planId: dispatchPlan.planId }) },
);
assert.equal(response.status, 200);
const nextState = await readState();
const nextGroupProject = nextState.projects.find((project) => project.id === groupProject.id);
assert.ok(nextGroupProject, "expected group project to remain present");
assert.equal(nextGroupProject?.approvalState, "approved");
});