From f4f7f9620ff2e5317e9439e63cdb1d5871225de6 Mon Sep 17 00:00:00 2001 From: Lena Deriso Date: Fri, 11 Sep 2026 16:20:08 -0400 Subject: [PATCH] Fix case-insensitive order search --- apps/api/src/orders/order-repository.ts | 6 +- .../orders/order-search-assignment-1.test.ts | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/apps/api/src/orders/order-repository.ts b/apps/api/src/orders/order-repository.ts index 5a904e1..a641d83 100644 --- a/apps/api/src/orders/order-repository.ts +++ b/apps/api/src/orders/order-repository.ts @@ -39,9 +39,9 @@ export async function listOrderSummaries(context: DatabaseContext, query?: strin const filters = search ? or( - sql`instr(${orders.orderNumber}, ${search}) > 0`, - sql`instr(${users.name}, ${search}) > 0`, - sql`instr(${users.email}, ${search}) > 0` + sql`instr(LOWER(${orders.orderNumber}), LOWER(${search})) > 0`, + sql`instr(LOWER(${users.name}), LOWER(${search})) > 0`, + sql`instr(LOWER(${users.email}), LOWER(${search})) > 0` ) : undefined; diff --git a/apps/api/src/orders/order-search-assignment-1.test.ts b/apps/api/src/orders/order-search-assignment-1.test.ts index b3724f5..2ec0d08 100644 --- a/apps/api/src/orders/order-search-assignment-1.test.ts +++ b/apps/api/src/orders/order-search-assignment-1.test.ts @@ -47,4 +47,64 @@ describe("assignment 1 search behavior", () => { expect(orderNumbers).toContain("ORD-1001"); expect(orderNumbers).toContain("ORD-1003"); }); + + test("searches orders by mixed-case customer name without matching email", async () => { + const response = await app.inject({ + method: "GET", + url: "/api/orders?query=JoHn%20SmItH", + headers: { cookie: employeeCookie } + }); + + const orders = response.json(); + const orderNumbers = orders.map((order: { orderNumber: string }) => order.orderNumber); + + expect(response.statusCode).toBe(200); + expect(orderNumbers).toHaveLength(2); + expect(orderNumbers).toContain("ORD-1001"); + expect(orderNumbers).toContain("ORD-1003"); + }); + + test("searches orders by uppercase customer email", async () => { + const response = await app.inject({ + method: "GET", + url: "/api/orders?query=JOHN.SMITH%40EXAMPLE.COM", + headers: { cookie: employeeCookie } + }); + + const orders = response.json(); + const orderNumbers = orders.map((order: { orderNumber: string }) => order.orderNumber); + + expect(response.statusCode).toBe(200); + expect(orderNumbers).toHaveLength(2); + expect(orderNumbers).toContain("ORD-1001"); + expect(orderNumbers).toContain("ORD-1003"); + }); + + test("searches orders by lowercase order number", async () => { + const response = await app.inject({ + method: "GET", + url: "/api/orders?query=ord-1001", + headers: { cookie: employeeCookie } + }); + + const orders = response.json(); + const orderNumbers = orders.map((order: { orderNumber: string }) => order.orderNumber); + + expect(response.statusCode).toBe(200); + expect(orderNumbers).toHaveLength(1); + expect(orderNumbers).toContain("ORD-1001"); + }); + + test("returns no orders when the search term does not match", async () => { + const response = await app.inject({ + method: "GET", + url: "/api/orders?query=no-matching-order", + headers: { cookie: employeeCookie } + }); + + const orders = response.json(); + + expect(response.statusCode).toBe(200); + expect(orders).toEqual([]); + }); });