From 507ec017b130d068eaffdf5a98974dd762ff82e6 Mon Sep 17 00:00:00 2001 From: kahirokunn Date: Mon, 17 Aug 2026 19:49:32 +0900 Subject: [PATCH] refactor: drop the @ts-ignore from ValidationError Signed-off-by: kahirokunn --- src/event/validation.ts | 16 +++++-------- test/integration/utilities_test.ts | 38 +++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/event/validation.ts b/src/event/validation.ts index c5e81864..663e034d 100644 --- a/src/event/validation.ts +++ b/src/event/validation.ts @@ -30,17 +30,13 @@ export class ValidationError extends TypeError { errors?: string[] | ErrorObject[] | null; constructor(message: string, errors?: string[] | ErrorObject[] | null) { - const messageString = - errors instanceof Array - ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - errors?.reduce( - (accum: string, err: Record) => - accum.concat(` + const validationErrors: Array = errors instanceof Array ? errors : []; + const messageString = validationErrors.reduce( + (accum, err) => + accum.concat(` ${err instanceof Object ? JSON.stringify(err) : err}`), - message, - ) - : message; + message, + ); super(messageString); this.errors = errors ? errors : []; } diff --git a/test/integration/utilities_test.ts b/test/integration/utilities_test.ts index a0b8a2ec..d7fe12e8 100644 --- a/test/integration/utilities_test.ts +++ b/test/integration/utilities_test.ts @@ -5,7 +5,43 @@ import "mocha"; import { expect } from "chai"; -import { isStringOrThrow, equalsOrThrow, isBase64, asData } from "../../src/event/validation"; +import { ValidationError, isStringOrThrow, equalsOrThrow, isBase64, asData } from "../../src/event/validation"; + +describe("ValidationError", () => { + it("includes string errors in its message", () => { + const errors = ["source is required", "type is required"]; + + const error = new ValidationError("invalid payload", errors); + + expect(error.message).to.equal(`invalid payload + source is required + type is required`); + expect(error.errors).to.equal(errors); + }); + + it("includes AJV errors as JSON in its message", () => { + const errors = [ + { + instancePath: "/source", + schemaPath: "#/properties/source/minLength", + keyword: "minLength", + params: { limit: 1 }, + message: "must NOT have fewer than 1 characters", + }, + ]; + + const error = new ValidationError("invalid payload", errors); + + expect(error.message).to.equal(`invalid payload + ${JSON.stringify(errors[0])}`); + expect(error.errors).to.equal(errors); + }); + + it("keeps the original message when no errors are provided", () => { + expect(new ValidationError("invalid payload").message).to.equal("invalid payload"); + expect(new ValidationError("invalid payload", null).message).to.equal("invalid payload"); + }); +}); describe("Utilities", () => { describe("isStringOrThrow", () => {