Files
pleno-vue/tests/e2e/collected-invoice-move-customer.spec.ts

131 lines
4.0 KiB
TypeScript

import { expect, test } from "@playwright/test";
import { apiPathPattern, mockApi, seedAuthenticatedState } from "./support/network.js";
function json(body: unknown, status = 200) {
return {
status,
contentType: "application/json",
body: JSON.stringify(body),
};
}
test("superuser can move a collected invoice collection to another customer", async ({ page }, testInfo) => {
test.skip(!/desktop/i.test(testInfo.project.name), "Desktop only");
const token = "superuser-collected-invoice-move-token";
const invoiceCollectionId = 16501;
const sourceCustomerNumber = 6101;
const targetCustomerNumber = 6202;
let currentCustomerNumber = sourceCustomerNumber;
const movePayloads: unknown[] = [];
await seedAuthenticatedState(page, token);
await mockApi(page, {
authenticated: true,
permissions: ["superuser", "user"],
loginToken: token,
});
await page.route(apiPathPattern("/collected-invoices"), async (route) => {
if (route.request().method() !== "GET") {
await route.fallback();
return;
}
const url = new URL(route.request().url());
if (Number(url.searchParams.get("id") || 0) !== invoiceCollectionId) {
await route.fallback();
return;
}
await route.fulfill(
json({
success: true,
data: {
id: invoiceCollectionId,
customer_number: currentCustomerNumber,
name: "April collection",
notes: "",
processor: 0,
external_id: null,
booked_invoice_id: null,
po_number: "",
closed_at: null,
total_net_amount: 420,
user: {
id: 41,
customer_number: currentCustomerNumber,
display_name: currentCustomerNumber === sourceCustomerNumber ? "Source Fleet" : "Target Fleet",
},
orders: [
{
id: 9301,
customer_id: currentCustomerNumber,
customer_name: "Fleet",
department_id: 1,
invoice_collection_id: invoiceCollectionId,
created_at: "2026-04-14 10:00:00",
total_net_amount: 210,
},
{
id: 9302,
customer_id: currentCustomerNumber,
customer_name: "Fleet",
department_id: 1,
invoice_collection_id: invoiceCollectionId,
created_at: "2026-04-15 10:00:00",
total_net_amount: 210,
},
],
},
meta: [],
includes: [],
})
);
});
await page.route(apiPathPattern("/collected-invoices/move-to-customer"), async (route) => {
if (route.request().method() !== "POST") {
await route.fallback();
return;
}
const payload = route.request().postDataJSON();
movePayloads.push(payload);
currentCustomerNumber = Number(payload.customer_number);
await route.fulfill(
json({
success: true,
data: {
id: invoiceCollectionId,
customer_number: currentCustomerNumber,
},
meta: {
move: {
moved_order_count: 2,
},
},
includes: [],
})
);
});
await page.goto(`/superuser/invoices/${invoiceCollectionId}`, { waitUntil: "domcontentloaded" });
await expect(page.getByTestId("collected-invoice-move_customer-button")).toBeVisible();
await expect(page.locator("body")).toContainText(`#${sourceCustomerNumber}`);
await page.getByTestId("collected-invoice-move_customer-button").click();
await page.locator(".swal2-input").fill(String(targetCustomerNumber));
await page.getByRole("button", { name: "Fortsæt" }).click();
await page.getByRole("button", { name: "Flyt" }).click();
await expect(page.getByText("Fakturasamling flyttet")).toBeVisible();
await expect.poll(() => movePayloads.length).toBe(1);
expect(movePayloads[0]).toMatchObject({
id: invoiceCollectionId,
customer_number: targetCustomerNumber,
});
await expect(page.locator("body")).toContainText(`#${targetCustomerNumber}`);
});