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 3 quantity validation", () => { test("allows quantity changes for pending orders", async () => { const response = await app.inject({ method: "POST", url: "/api/orders/order_1/items/item_1/quantity", headers: { cookie: employeeCookie }, payload: { quantity: 5 } }); expect(response.statusCode).toBe(200); expect(response.json().items.find((item: { id: string }) => item.id === "item_1")?.quantity).toBe(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 } }); 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({ method: "POST", url: "/api/orders/order_1/items/item_1/quantity", headers: { cookie: employeeCookie }, payload: { quantity: 0 } }); expect(response.statusCode).toBe(400); }); test("rejects quantity above effective inventory", async () => { const response = await app.inject({ method: "POST", url: "/api/orders/order_1/items/item_1/quantity", headers: { cookie: employeeCookie }, payload: { quantity: 9 } }); expect(response.statusCode).toBe(400); }); });