131 lines
4.0 KiB
TypeScript
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}`);
|
|
});
|