From 31b367e3a3a64c2bb304d00ccb6ba1df35eb50c1 Mon Sep 17 00:00:00 2001 From: derrick Date: Fri, 2 Oct 2026 16:54:39 +0900 Subject: [PATCH] add:assignment 4 tests --- .../order-status-rules-assignment-4.test.ts | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 apps/api/src/orders/order-status-rules-assignment-4.test.ts diff --git a/apps/api/src/orders/order-status-rules-assignment-4.test.ts b/apps/api/src/orders/order-status-rules-assignment-4.test.ts new file mode 100644 index 0000000..f99e365 --- /dev/null +++ b/apps/api/src/orders/order-status-rules-assignment-4.test.ts @@ -0,0 +1,108 @@ +import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import type { AppWithContext } from "../app"; +import { buildApp } from "../app"; +import { createUser } from "../users/user-repository"; + +let app: AppWithContext; +let employeeCookie = ""; + +function firstHeader(value: string | string[] | undefined) { + return Array.isArray(value) ? value[0] : value ?? ""; +} + +async function login(username: string) { + const response = await app.inject({ method: "POST", url: "/api/login", payload: { username } }); + return firstHeader(response.headers["set-cookie"]); +} + +beforeEach(async () => { + app = await buildApp(":memory:"); + + await createUser(app.dbContext, { + username: "dev-employee", + name: "Dev Employee", + email: "dev.employee@example.com", + role: "employee" + }); + + employeeCookie = await login("dev-employee"); +}); + +afterEach(async () => { + await app.close(); +}); + +describe("assignment 4 order lifecycle rules", () => { + test("keeps quantity editing blocked 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 } + }); + + expect(response.statusCode).toBe(400); + }); + + test("allows address editing for processing orders", async () => { + const response = await app.inject({ + method: "POST", + url: "/api/orders/order_2/shipping-address", + headers: { cookie: employeeCookie }, + payload: { + fullName: "Jane Doe", + line1: "50 New Street", + line2: null, + city: "Oakland", + state: "CA", + postalCode: "94607", + country: "US" + } + }); + + expect(response.statusCode).toBe(200); + expect(response.json().shippingAddress.city).toBe("Oakland"); + }); + + test("allows cancellation for processing orders", async () => { + const response = await app.inject({ + method: "POST", + url: "/api/orders/order_2/cancel", + headers: { cookie: employeeCookie }, + payload: { reason: "Customer request" } + }); + + expect(response.statusCode).toBe(200); + expect(response.json().status).toBe("cancelled"); + }); + + test("blocks address editing for shipped orders", async () => { + const response = await app.inject({ + method: "POST", + url: "/api/orders/order_3/shipping-address", + headers: { cookie: employeeCookie }, + payload: { + fullName: "John Smith", + line1: "77 Final Mile Road", + line2: null, + city: "Denver", + state: "CO", + postalCode: "80202", + country: "US" + } + }); + + expect(response.statusCode).toBe(400); + }); + + test("blocks cancellation for shipped orders", async () => { + const response = await app.inject({ + method: "POST", + url: "/api/orders/order_3/cancel", + headers: { cookie: employeeCookie }, + payload: { reason: "Late request" } + }); + + expect(response.statusCode).toBe(400); + }); +});