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); }); });