166 lines
4.8 KiB
JavaScript
166 lines
4.8 KiB
JavaScript
const mongoose = require("mongoose");
|
|
const request = require("supertest");
|
|
const { app } = require("../../app");
|
|
const Order = require("../../src/models/orderModel");
|
|
const Meja = require("../../src/models/mejaModel");
|
|
const Menu = require("../../src/models/menuModel");
|
|
const connectDB = require("../../src/config/database");
|
|
|
|
describe("Module 4 - Order API", () => {
|
|
let testMenuId1, testMenuId2;
|
|
|
|
beforeAll(async () => {
|
|
await connectDB();
|
|
|
|
const menu1 = await Menu.create({
|
|
name: "Nasi Goreng Spesial",
|
|
description: "Nasi goreng dengan telur, ayam, dan sayuran segar",
|
|
price: 25000,
|
|
category: "main",
|
|
isAvailable: true,
|
|
});
|
|
|
|
const menu2 = await Menu.create({
|
|
name: "Sate Ayam",
|
|
description: "Sate ayam dengan bumbu kacang khas Indonesia",
|
|
price: 20000,
|
|
category: "appetizer",
|
|
isAvailable: true,
|
|
});
|
|
|
|
testMenuId1 = menu1._id;
|
|
testMenuId2 = menu2._id;
|
|
});
|
|
|
|
beforeEach(async () => {
|
|
await Order.deleteMany({});
|
|
await Meja.deleteMany({});
|
|
});
|
|
|
|
afterAll(async () => {
|
|
await Menu.deleteMany({});
|
|
await Order.deleteMany({});
|
|
await Meja.deleteMany({});
|
|
await mongoose.connection.close();
|
|
});
|
|
|
|
describe("POST /createOrders", () => {
|
|
test("harus berhasil membuat pesanan baru", async () => {
|
|
const table = await Meja.create({
|
|
tableNumber: 3,
|
|
capacity: 4,
|
|
status: "available",
|
|
});
|
|
|
|
const orderData = {
|
|
tableNumber: 3,
|
|
items: [
|
|
{ menuId: testMenuId1, quantity: 1 },
|
|
{ menuId: testMenuId2, quantity: 2 },
|
|
],
|
|
};
|
|
|
|
const response = await request(app).post("/createOrders").send(orderData);
|
|
|
|
expect(response.status).toBe(201);
|
|
expect(response.body).toHaveProperty("success", true);
|
|
expect(response.body.data).toHaveProperty("tableNumber", 3);
|
|
expect(response.body.data).toHaveProperty("total", 65000);
|
|
expect(response.body.data).toHaveProperty("status", "pending");
|
|
|
|
const updatedTable = await Meja.findOne({ tableNumber: 3 });
|
|
expect(updatedTable.status).toBe("reserved");
|
|
});
|
|
|
|
test("harus mengembalikan error ketika meja tidak tersedia", async () => {
|
|
const table = await Meja.create({
|
|
tableNumber: 4,
|
|
capacity: 4,
|
|
status: "reserved",
|
|
});
|
|
|
|
const orderData = {
|
|
tableNumber: 4,
|
|
items: [{ menuId: testMenuId1, quantity: 1 }],
|
|
};
|
|
|
|
const response = await request(app).post("/createOrders").send(orderData);
|
|
|
|
expect(response.status).toBe(400);
|
|
expect(response.body).toHaveProperty("success", false);
|
|
expect(response.body).toHaveProperty(
|
|
"error",
|
|
"Meja tidak tersedia atau sedang dipesan",
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("GET /orders", () => {
|
|
test("harus mengembalikan daftar pesanan", async () => {
|
|
await Meja.create({
|
|
tableNumber: 2,
|
|
capacity: 4,
|
|
status: "available",
|
|
});
|
|
|
|
const orderData = {
|
|
tableNumber: 2,
|
|
items: [
|
|
{ menuId: testMenuId1, quantity: 1 },
|
|
{ menuId: testMenuId2, quantity: 2 },
|
|
],
|
|
};
|
|
|
|
await request(app).post("/createOrders").send(orderData);
|
|
|
|
const response = await request(app).get("/orders");
|
|
|
|
expect(response.status).toBe(200);
|
|
expect(response.body).toHaveProperty("success", true);
|
|
expect(Array.isArray(response.body.data)).toBe(true);
|
|
expect(response.body.data.length).toBeGreaterThan(0);
|
|
expect(response.body.data[0]).toHaveProperty("tableNumber", 2);
|
|
});
|
|
});
|
|
|
|
describe("PUT /orders/:orderId/status", () => {
|
|
test("harus mengubah status pesanan", async () => {
|
|
const table = await Meja.create({
|
|
tableNumber: 5,
|
|
capacity: 4,
|
|
status: "reserved",
|
|
});
|
|
|
|
const order = await Order.create({
|
|
tableNumber: 5,
|
|
items: [
|
|
{ menuId: testMenuId1, quantity: 1 },
|
|
{ menuId: testMenuId2, quantity: 2 },
|
|
],
|
|
total: 65000,
|
|
status: "pending",
|
|
});
|
|
|
|
const response = await request(app)
|
|
.put(`/orders/${order._id}/status`)
|
|
.send({ status: "completed" });
|
|
|
|
expect(response.status).toBe(200);
|
|
expect(response.body).toHaveProperty("success", true);
|
|
expect(response.body.data).toHaveProperty("status", "completed");
|
|
});
|
|
|
|
test("harus mengembalikan status 404 jika pesanan tidak ditemukan", async () => {
|
|
const nonExistentOrderId = new mongoose.Types.ObjectId();
|
|
|
|
const response = await request(app)
|
|
.put(`/orders/${nonExistentOrderId}/status`)
|
|
.send({ status: "completed" });
|
|
|
|
expect(response.status).toBe(404);
|
|
expect(response.body).toHaveProperty("success", false);
|
|
expect(response.body).toHaveProperty("error", "Pesanan tidak ditemukan");
|
|
});
|
|
});
|
|
});
|