feat(FN-4578): complete Step 4 — support milestone acceptance criteria patch

Fusion-Task-Id: FN-4578
Fusion-Task-Lineage: 1be0fa08-4d83-4988-a218-326225dfe4b5
This commit is contained in:
Fusion
2026-05-15 02:44:19 -07:00
committed by gsxdsm
parent 6f6850668c
commit b82341739b
2 changed files with 24 additions and 1 deletions

View File

@@ -1430,6 +1430,26 @@ describe("Mission API", () => {
expect(updateDependencies.status).toBe(200);
expect(updateDependencies.body.dependencies).toEqual(["MS-DEP-1"]);
const updateAcceptanceCriteria = await request(
app,
"PATCH",
`/api/missions/milestones/${milestone.id}`,
JSON.stringify({ acceptanceCriteria: "Acceptance ready" }),
{ "content-type": "application/json" },
);
expect(updateAcceptanceCriteria.status).toBe(200);
expect(updateAcceptanceCriteria.body.acceptanceCriteria).toBe("Acceptance ready");
const malformedAcceptanceCriteria = await request(
app,
"PATCH",
`/api/missions/milestones/${milestone.id}`,
JSON.stringify({ acceptanceCriteria: 42 }),
{ "content-type": "application/json" },
);
expect(malformedAcceptanceCriteria.status).toBe(500);
expect(malformedAcceptanceCriteria.body.error).toContain("Description must be a string");
const noFields = await request(
app,
"PATCH",

View File

@@ -1239,7 +1239,7 @@ export function createMissionRouter(
"/milestones/:milestoneId",
catchTypedHandler(async (req, res) => {
const { milestoneId } = req.params;
const { title, description, status, dependencies } = req.body;
const { title, description, status, dependencies, acceptanceCriteria } = req.body;
if (!validateMilestoneId(milestoneId)) {
throw badRequest("Invalid milestone ID format");
@@ -1259,6 +1259,9 @@ export function createMissionRouter(
if (dependencies !== undefined) {
updates.dependencies = validateStringArray(dependencies, "dependencies");
}
if (acceptanceCriteria !== undefined) {
updates.acceptanceCriteria = validateDescription(acceptanceCriteria);
}
if (Object.keys(updates).length === 0) {
throw badRequest("No valid fields to update");