Introduce completeBookingCreationFlow utility and refactor booking flow tests:

- Added `completeBookingCreationFlow` utility to streamline booking creation logic in `bookingFlow.ts`.
- Refactored `userBookings.spec.ts` to replace inline booking creation steps with the new utility for improved readability and consistency.
- Applied `data-testid` attributes across booking-related components for enhanced testability and test coverage.
- Enhanced Playwright navigation error handling with `isBenignNavigationError` and `settleAuthenticatedNavigation` utilities to improve resilience and test robustness.
This commit is contained in:
Jeppe Bundgaard
2026-04-13 13:39:48 +02:00
parent 828e2fd312
commit ade565cbca
28 changed files with 726 additions and 538 deletions
+58 -39
View File
@@ -130,15 +130,27 @@ async function submitOrderSettingModal(
async function createInvoiceCollectionFromPicker(page: Page, closedAt: string) {
const popup = page.locator(".swal2-popup");
await expect(popup).toBeVisible();
await popup.locator(".tabs li").nth(1).click();
await expect(popup.locator(".tabs")).toBeVisible({ timeout: 10000 });
const createTab = popup.locator(".tabs li a").last();
await expect(createTab).toBeVisible({ timeout: 10000 });
await createTab.click();
const dateInput = popup.locator('input[type="date"]').first();
await expect(dateInput).toBeVisible();
await expect(dateInput).toBeVisible({ timeout: 10000 });
await dateInput.fill(closedAt);
const createButton = popup.locator(".button.is-primary").first();
await expect(createButton).toBeEnabled();
const createRequest = page.waitForRequest((request) => {
return request.method() === "POST" && request.url().includes("/collected-invoices");
});
const createResponse = page.waitForResponse((response) => {
return response.request().method() === "POST" && response.url().includes("/collected-invoices");
});
const createButton = popup.locator("button.button.is-primary").first();
await expect(createButton).toBeEnabled({ timeout: 10000 });
await createButton.click();
await createRequest;
await createResponse;
}
async function waitForOrderInvoiceCollectionSuccess(page: Page) {
@@ -157,6 +169,7 @@ async function changeOrderCustomer(page: Page, customerNumber: string, closedAt:
const customerResult = customerPopup.locator(".customer-drop-down-select").first();
await expect(customerResult).toBeVisible();
await customerResult.click();
await expect(customerPopup.locator("#pos_select_customer_input")).toHaveCount(0, { timeout: 10000 });
await createInvoiceCollectionFromPicker(page, closedAt);
await waitForOrderInvoiceCollectionSuccess(page);
@@ -711,51 +724,57 @@ test.describe("Admin POS Orders - desktop settings", () => {
test("persists scalar metadata edits across settings and details tabs", async ({ page }) => {
const { orderId } = await createDisposableOrder(page);
const updatedValues = {
const submittedValues = {
reference: "UPDATED-REF-2026",
reg_1: "ZZ99881",
reg_2: "TR99882",
reg_3: "TL99883",
reg_1: " zz-99 881 ",
reg_2: " tr/99-882 ",
reg_3: " tl_99 883 ",
notes: "Updated order note",
po: "PO-9001",
lane: "7",
wash_id: "WASH-77",
booking_id: "8801",
};
const expectedValues = {
...submittedValues,
reg_1: "ZZ99881",
reg_2: "TR99882",
reg_3: "TL99883",
};
await openOrderSettings(page, orderId);
await submitOrderSettingModal(page, "reference", updatedValues.reference);
await submitOrderSettingModal(page, "reg_1", updatedValues.reg_1);
await submitOrderSettingModal(page, "reg_2", updatedValues.reg_2);
await submitOrderSettingModal(page, "reg_3", updatedValues.reg_3);
await submitOrderSettingModal(page, "notes", updatedValues.notes);
await submitOrderSettingModal(page, "po", updatedValues.po);
await submitOrderSettingModal(page, "lane", updatedValues.lane);
await submitOrderSettingModal(page, "wash_id", updatedValues.wash_id);
await submitOrderSettingModal(page, "booking_id", updatedValues.booking_id);
await submitOrderSettingModal(page, "reference", submittedValues.reference);
await submitOrderSettingModal(page, "reg_1", submittedValues.reg_1);
await submitOrderSettingModal(page, "reg_2", submittedValues.reg_2);
await submitOrderSettingModal(page, "reg_3", submittedValues.reg_3);
await submitOrderSettingModal(page, "notes", submittedValues.notes);
await submitOrderSettingModal(page, "po", submittedValues.po);
await submitOrderSettingModal(page, "lane", submittedValues.lane);
await submitOrderSettingModal(page, "wash_id", submittedValues.wash_id);
await submitOrderSettingModal(page, "booking_id", submittedValues.booking_id);
await reloadOrderSettings(page, orderId);
await expect(getOrderSettingsField(page, "reference")).toContainText(updatedValues.reference);
await expect(getOrderSettingsField(page, "reg_1")).toContainText(updatedValues.reg_1);
await expect(getOrderSettingsField(page, "reg_2")).toContainText(updatedValues.reg_2);
await expect(getOrderSettingsField(page, "reg_3")).toContainText(updatedValues.reg_3);
await expect(getOrderSettingsField(page, "notes")).toContainText(updatedValues.notes);
await expect(getOrderSettingsField(page, "po")).toContainText(updatedValues.po);
await expect(getOrderSettingsField(page, "lane")).toContainText(updatedValues.lane);
await expect(getOrderSettingsField(page, "wash_id")).toContainText(updatedValues.wash_id);
await expect(getOrderSettingsField(page, "booking_id")).toContainText(updatedValues.booking_id);
await expect(getOrderSettingsField(page, "reference")).toContainText(expectedValues.reference);
await expect(getOrderSettingsField(page, "reg_1")).toContainText(expectedValues.reg_1);
await expect(getOrderSettingsField(page, "reg_2")).toContainText(expectedValues.reg_2);
await expect(getOrderSettingsField(page, "reg_3")).toContainText(expectedValues.reg_3);
await expect(getOrderSettingsField(page, "notes")).toContainText(expectedValues.notes);
await expect(getOrderSettingsField(page, "po")).toContainText(expectedValues.po);
await expect(getOrderSettingsField(page, "lane")).toContainText(expectedValues.lane);
await expect(getOrderSettingsField(page, "wash_id")).toContainText(expectedValues.wash_id);
await expect(getOrderSettingsField(page, "booking_id")).toContainText(expectedValues.booking_id);
await openOrderDetailsTab(page);
await expect(getOrderDetailInput(page, "reference")).toHaveValue(updatedValues.reference);
await expect(getOrderDetailInput(page, "reg_1")).toHaveValue(updatedValues.reg_1);
await expect(getOrderDetailInput(page, "reg_2")).toHaveValue(updatedValues.reg_2);
await expect(getOrderDetailInput(page, "reg_3")).toHaveValue(updatedValues.reg_3);
await expect(getOrderDetailInput(page, "notes")).toHaveValue(updatedValues.notes);
await expect(getOrderDetailInput(page, "po")).toHaveValue(updatedValues.po);
await expect(getOrderDetailInput(page, "lane")).toHaveValue(updatedValues.lane);
await expect(getOrderDetailInput(page, "wash_id")).toHaveValue(updatedValues.wash_id);
await expect(getOrderDetailInput(page, "booking_id")).toHaveValue(updatedValues.booking_id);
await expect(getOrderDetailInput(page, "reference")).toHaveValue(expectedValues.reference);
await expect(getOrderDetailInput(page, "reg_1")).toHaveValue(expectedValues.reg_1);
await expect(getOrderDetailInput(page, "reg_2")).toHaveValue(expectedValues.reg_2);
await expect(getOrderDetailInput(page, "reg_3")).toHaveValue(expectedValues.reg_3);
await expect(getOrderDetailInput(page, "notes")).toHaveValue(expectedValues.notes);
await expect(getOrderDetailInput(page, "po")).toHaveValue(expectedValues.po);
await expect(getOrderDetailInput(page, "lane")).toHaveValue(expectedValues.lane);
await expect(getOrderDetailInput(page, "wash_id")).toHaveValue(expectedValues.wash_id);
await expect(getOrderDetailInput(page, "booking_id")).toHaveValue(expectedValues.booking_id);
});
test("persists department, created_at, and invoice inclusion changes through per-field modals", async ({
@@ -812,21 +831,21 @@ test.describe("Admin POS Orders - desktop settings", () => {
await changeOrderCustomer(page, "999", "2026-04-30");
await expect(page).toHaveURL(initialUrl);
await expect(getOrderSettingsField(page, "customer_id")).toContainText("999");
await expect(getOrderSettingsField(page, "invoice_collection_id")).toContainText("200");
await expect(getOrderSettingsField(page, "invoice_collection_id")).toContainText("300");
await openOrderDetailsTab(page);
await expect(getOrderDetailInput(page, "customer_id")).toHaveValue("999");
await expect(getOrderDetailInput(page, "invoice_collection_id")).toHaveValue("200");
await expect(getOrderDetailInput(page, "invoice_collection_id")).toHaveValue("300");
await clickVisibleTestId(page, "pos-order-tab-settings");
await expect(page.getByTestId("pos-order-panel-settings")).toBeVisible();
await changeOrderInvoiceCollection(page, "2026-05-01");
await expect(page).toHaveURL(initialUrl);
await expect(getOrderSettingsField(page, "invoice_collection_id")).toContainText("201");
await expect(getOrderSettingsField(page, "invoice_collection_id")).toContainText("301");
await openOrderDetailsTab(page);
await expect(getOrderDetailInput(page, "invoice_collection_id")).toHaveValue("201");
await expect(getOrderDetailInput(page, "invoice_collection_id")).toHaveValue("301");
});
});