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 = ""; let customerCookie = ""; async function login(username: string) { const response = await app.inject({ method: "POST", url: "/api/login", payload: { username } }); return response.headers["set-cookie"] as string; } 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"); customerCookie = await login("john-smith"); }); afterEach(async () => { await app.close(); }); describe("order routes", () => { test("rejects customer access", async () => { const response = await app.inject({ method: "GET", url: "/api/orders", headers: { cookie: customerCookie } }); expect(response.statusCode).toBe(403); }); test("lists seeded orders for employee", async () => { const response = await app.inject({ method: "GET", url: "/api/orders", headers: { cookie: employeeCookie } }); expect(response.statusCode).toBe(200); expect(response.json()).toHaveLength(7); }); test("returns order detail", async () => { const response = await app.inject({ method: "GET", url: "/api/orders/order_1", headers: { cookie: employeeCookie } }); const order = response.json(); expect(response.statusCode).toBe(200); expect(order.orderNumber).toBe("ORD-1001"); expect(order.items).toHaveLength(2); }); test("updates item quantity with inventory check", async () => { const response = await app.inject({ method: "POST", url: "/api/orders/order_1/items/item_1/quantity", headers: { cookie: employeeCookie }, payload: { quantity: 5 } }); const order = response.json(); expect(response.statusCode).toBe(200); expect(order.items.find((item: { id: string }) => item.id === "item_1")?.quantity).toBe(5); }); test("updates shipping address", async () => { const response = await app.inject({ method: "POST", url: "/api/orders/order_1/shipping-address", headers: { cookie: employeeCookie }, payload: { fullName: "John Smith", line1: "50 New Street", line2: null, city: "Oakland", state: "CA", postalCode: "94607", country: "US" } }); const order = response.json(); expect(response.statusCode).toBe(200); expect(order.shippingAddress.city).toBe("Oakland"); }); test("cancels eligible order", 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"); }); });