From cb3020a73c2f6ff19c20e1c515f48494efb4d8c9 Mon Sep 17 00:00:00 2001 From: Lena Deriso Date: Tue, 29 Sep 2026 21:03:55 -0400 Subject: [PATCH] Working ticket final update --- .../order-quantity-assignment-3.test.ts | 49 +++++++++++-------- apps/api/src/orders/order-status.ts | 2 +- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/apps/api/src/orders/order-quantity-assignment-3.test.ts b/apps/api/src/orders/order-quantity-assignment-3.test.ts index 12ede31..a48e297 100644 --- a/apps/api/src/orders/order-quantity-assignment-3.test.ts +++ b/apps/api/src/orders/order-quantity-assignment-3.test.ts @@ -2,12 +2,13 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test"; import type { AppWithContext } from "../app"; import { buildApp } from "../app"; import { createUser } from "../users/user-repository"; +import { findOrderDetail, listOrderAuditEvents, updateOrderStatus } from "./order-repository"; let app: AppWithContext; let employeeCookie = ""; function firstHeader(value: string | string[] | undefined) { - return Array.isArray(value) ? value[0] : value ?? ""; + return (Array.isArray(value) ? value[0] : value) ?? ""; } async function login(username: string) { @@ -43,29 +44,35 @@ describe("assignment 3 quantity validation", () => { expect(response.statusCode).toBe(200); expect(response.json().items.find((item: { id: string }) => item.id === "item_1")?.quantity).toBe(5); + const order = await findOrderDetail(app.dbContext, "order_1"); + expect(order?.items.find((item) => item.id === "item_1")?.quantity).toBe(5); + const events = await listOrderAuditEvents(app.dbContext, "order_1"); + expect(events.filter((event) => event.type === "order.item.quantity_changed")).toEqual([ + expect.objectContaining({ actor: "dev-employee", message: "Updated item item_1 quantity to 5." }) + ]); }); - test("rejects quantity changes for processing orders", async () => { - const response = await app.inject({ - method: "POST", - url: "/api/orders/order_2/items/item_3/quantity", - headers: { cookie: employeeCookie }, - payload: { quantity: 2 } + for (const status of ["processing", "shipped", "cancelled", "refunded"] as const) { + test(`rejects quantity changes for ${status} orders without side effects`, async () => { + await updateOrderStatus(app.dbContext, "order_1", status, "2025-01-16T10:00:00.000Z"); + const beforeOrder = await findOrderDetail(app.dbContext, "order_1"); + const beforeEvents = await listOrderAuditEvents(app.dbContext, "order_1"); + + for (const payload of [{ quantity: 5 }, { quantity: 5, status: "pending" }]) { + const response = await app.inject({ + method: "POST", + url: "/api/orders/order_1/items/item_1/quantity", + headers: { cookie: employeeCookie }, + payload + }); + + expect(response.statusCode).toBe(400); + expect(response.json<{ message: string }>()).toEqual({ message: "Order items cannot be changed for this order status." }); + expect(await findOrderDetail(app.dbContext, "order_1")).toEqual(beforeOrder); + expect(await listOrderAuditEvents(app.dbContext, "order_1")).toEqual(beforeEvents); + } }); - - expect(response.statusCode).toBe(400); - }); - - test("rejects quantity changes for shipped orders", async () => { - const response = await app.inject({ - method: "POST", - url: "/api/orders/order_3/items/item_4/quantity", - headers: { cookie: employeeCookie }, - payload: { quantity: 1 } - }); - - expect(response.statusCode).toBe(400); - }); + } test("rejects quantity outside the allowed range", async () => { const response = await app.inject({ diff --git a/apps/api/src/orders/order-status.ts b/apps/api/src/orders/order-status.ts index 51ae089..2272249 100644 --- a/apps/api/src/orders/order-status.ts +++ b/apps/api/src/orders/order-status.ts @@ -1,7 +1,7 @@ import type { OrderStatus } from "@orderops/shared/order-status"; export function canEditOrderItems(status: OrderStatus) { - return status === "pending" || status === "processing"; + return status === "pending"; } export function canEditShippingAddress(status: OrderStatus) {