From abdd39d65c31c651e7d710f9e3b8a1e26e8cf5d5 Mon Sep 17 00:00:00 2001 From: Dmytro Stanchiev Date: Wed, 29 Apr 2026 00:56:37 -0400 Subject: [PATCH] fix: complete ebay integer validation test coverage --- packages/api-server/src/routes/helpers.ts | 9 +-- packages/api-server/test/routes.test.ts | 72 +++++++++++++++++++++++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/packages/api-server/src/routes/helpers.ts b/packages/api-server/src/routes/helpers.ts index 0455bc9..4275b8f 100644 --- a/packages/api-server/src/routes/helpers.ts +++ b/packages/api-server/src/routes/helpers.ts @@ -36,14 +36,7 @@ export function parseNonNegativeIntegerParam( { status: 400 }, ); } - const value = Number(rawValue); - if (value < 0) { - return Response.json( - { message: `Invalid ${name} parameter` }, - { status: 400 }, - ); - } - return value; + return Number(rawValue); } export function emptySearchResponse(): Response { diff --git a/packages/api-server/test/routes.test.ts b/packages/api-server/test/routes.test.ts index 9be15ae..f1ae498 100644 --- a/packages/api-server/test/routes.test.ts +++ b/packages/api-server/test/routes.test.ts @@ -633,6 +633,78 @@ describe("API routes", () => { expect(body.message).toBe("Invalid maxItems parameter"); }); + test("ebayRoute returns 400 for empty minPrice", async () => { + const { ebayRoute } = await import("../src/routes/ebay"); + + const response = await ebayRoute( + new Request("http://localhost/api/ebay?q=laptop&minPrice="), + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.message).toBe("Invalid minPrice parameter"); + }); + + test("ebayRoute returns 400 for whitespace minPrice", async () => { + const { ebayRoute } = await import("../src/routes/ebay"); + + const response = await ebayRoute( + new Request("http://localhost/api/ebay?q=laptop&minPrice=%20%20"), + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.message).toBe("Invalid minPrice parameter"); + }); + + test("ebayRoute returns 400 for hex minPrice", async () => { + const { ebayRoute } = await import("../src/routes/ebay"); + + const response = await ebayRoute( + new Request("http://localhost/api/ebay?q=laptop&minPrice=0x10"), + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.message).toBe("Invalid minPrice parameter"); + }); + + test("ebayRoute returns 400 for empty maxPrice", async () => { + const { ebayRoute } = await import("../src/routes/ebay"); + + const response = await ebayRoute( + new Request("http://localhost/api/ebay?q=laptop&maxPrice="), + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.message).toBe("Invalid maxPrice parameter"); + }); + + test("ebayRoute returns 400 for whitespace maxPrice", async () => { + const { ebayRoute } = await import("../src/routes/ebay"); + + const response = await ebayRoute( + new Request("http://localhost/api/ebay?q=laptop&maxPrice=%20%20"), + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.message).toBe("Invalid maxPrice parameter"); + }); + + test("ebayRoute returns 400 for hex maxPrice", async () => { + const { ebayRoute } = await import("../src/routes/ebay"); + + const response = await ebayRoute( + new Request("http://localhost/api/ebay?q=laptop&maxPrice=0x10"), + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.message).toBe("Invalid maxPrice parameter"); + }); + test("ebayRoute returns 400 for non-integer minPrice", async () => { const { ebayRoute } = await import("../src/routes/ebay");