diff --git a/server/src/validation/maintenanceWindowValidation.ts b/server/src/validation/maintenanceWindowValidation.ts index c53e39b20..837db28e8 100644 --- a/server/src/validation/maintenanceWindowValidation.ts +++ b/server/src/validation/maintenanceWindowValidation.ts @@ -72,7 +72,7 @@ export const editMaintenanceByIdWindowBodyValidation = z start: dateToString.optional(), end: dateToString.optional(), expiry: dateToString.optional(), - monitors: z.array(z.string()).optional(), + monitors: z.array(z.string()).min(1, "At least one monitor is required").optional(), duration: z.number().optional(), durationUnit: z.enum(DurationUnits).optional(), }) diff --git a/server/test/unit/validation/maintenanceWindowValidation.test.ts b/server/test/unit/validation/maintenanceWindowValidation.test.ts index dfede3670..a209ba64f 100644 --- a/server/test/unit/validation/maintenanceWindowValidation.test.ts +++ b/server/test/unit/validation/maintenanceWindowValidation.test.ts @@ -168,4 +168,24 @@ describe("editMaintenanceByIdWindowBodyValidation", () => { }); expect(result.success).toBe(true); }); + + it("accepts a body without a monitors field (monitors is optional on edit)", () => { + const result = editMaintenanceByIdWindowBodyValidation.safeParse({ name: "Updated Name" }); + expect(result.success).toBe(true); + }); + + it("accepts a body with one or more monitors", () => { + const result = editMaintenanceByIdWindowBodyValidation.safeParse({ monitors: ["mon-1"] }); + expect(result.success).toBe(true); + }); + + it("rejects an empty monitors array", () => { + const result = editMaintenanceByIdWindowBodyValidation.safeParse({ monitors: [] }); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error.issues).toEqual( + expect.arrayContaining([expect.objectContaining({ message: "At least one monitor is required", path: ["monitors"] })]) + ); + } + }); });