104 lines
3.0 KiB
TypeScript
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");
|
|
});
|
|
});
|