Files
edr-platform/e2e-ui/specs/portal/ua8-promo-drop.spec.ts

38 lines
1.6 KiB
TypeScript

import { test, expect } from "@playwright/test";
import { PrismaClient } from "@prisma/client";
import { bookOneAdult } from "../../fixtures/booking-flow";
import { PROMO_VALID } from "../../fixtures/data";
const prisma = new PrismaClient();
test.afterAll(async () => {
await prisma.$disconnect();
});
/**
* UA-8 ✅ — a VALID promo is applied server-side even though the browser drops it (H-13). The portal
* still sums UNDISCOUNTED per-passenger fares into reviewedTotalMinor, but the server recomputes the
* authoritative fare (promo included, via the promoCode it forwards) and books the DISCOUNTED total —
* so the customer is charged the promo price, not full price.
*/
test("UA-8: valid promo is applied server-side to the booked total (H-13)", async ({ page }) => {
const r = await bookOneAdult(page, {
nationality: "Ethiopian",
paymentMethod: "WALLET",
promoCode: PROMO_VALID,
});
const fb = r.fareBreakdown;
expect(fb).toBeTruthy();
// The breakdown recognized the promo and computed a discount…
expect(fb.discountMinor).toBeGreaterThan(0);
expect(fb.totalMinor).toBeLessThan(fb.subtotalMinor);
// The browser still sends the UNDISCOUNTED subtotal (the frontend drops the promo)…
expect(r.reviewedTotalMinor).toBe(fb.subtotalMinor);
// …but the SERVER now applies the promo: the booking is stored at the discounted total.
const booking = await prisma.booking.findUniqueOrThrow({ where: { id: r.bookingId } });
expect(booking.totalMinor).toBeLessThan(fb.subtotalMinor); // ✅ discount honored
expect(booking.totalMinor).toBe(fb.subtotalMinor - fb.discountMinor);
});