Files
ai-wave-02/apps/api/src/orders/orders-routes.test.ts
T
2026-09-03 22:02:52 +09:00

104 lines
3.0 KiB
TypeScript

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