diff --git a/artifacts/api-server/tests/executive-meetings.test.mjs b/artifacts/api-server/tests/executive-meetings.test.mjs index fc153bf8..54819262 100644 --- a/artifacts/api-server/tests/executive-meetings.test.mjs +++ b/artifacts/api-server/tests/executive-meetings.test.mjs @@ -663,6 +663,28 @@ test("Reorder: POST /reorder renumbers a full day to 1..N and inherits slot time "audit new_value.order must echo the new ordering"); }); +test("Reorder: rejects orderedIds containing duplicates with code duplicate_ids", async () => { + // Even though full-day membership would otherwise be satisfied, sending the + // same id twice must be refused so we never assign the same dailyNumber to + // two distinct rows during the two-phase renumber. + const reorderDate = "2050-04-04"; + const a = await api(adminCookie, "POST", "/api/executive-meetings", { + titleAr: "أ", titleEn: "A", meetingDate: reorderDate, + }); + const A = await a.json(); created.meetingIds.push(A.id); + const b = await api(adminCookie, "POST", "/api/executive-meetings", { + titleAr: "ب", titleEn: "B", meetingDate: reorderDate, + }); + const B = await b.json(); created.meetingIds.push(B.id); + const r = await api(adminCookie, "POST", + "/api/executive-meetings/reorder", + { meetingDate: reorderDate, orderedIds: [A.id, A.id, B.id] }); + assert.equal(r.status, 400); + const body = await r.json(); + assert.equal(body.code, "duplicate_ids", + "duplicate ids must be reported with the duplicate_ids code"); +}); + test("Reorder: rejects an incomplete-day request (orderedIds missing some)", async () => { const reorderDate = "2050-02-20"; const a = await api(adminCookie, "POST", "/api/executive-meetings", {