141 lines
4.2 KiB
JavaScript
141 lines
4.2 KiB
JavaScript
/* eslint-disable */
|
|
|
|
import { expect, test } from "@playwright/test";
|
|
import { acceptEulaIfPresent, login } from "./utils/login";
|
|
|
|
async function openCommissionCutHarness(page) {
|
|
await page.goto("/manage/_test?fixture=commission-cut");
|
|
await acceptEulaIfPresent(page);
|
|
await expect(page.getByRole("heading", { name: "Commission Cut Test Harness" })).toBeVisible();
|
|
}
|
|
|
|
test.describe("Commission-based cut", () => {
|
|
test.skip(!process.env.TEST_USERNAME || !process.env.TEST_PASSWORD, "Requires TEST_USERNAME and TEST_PASSWORD.");
|
|
|
|
test("renders payout previews and completes Pay All from the commission-cut harness", async ({ page }) => {
|
|
let calculateLaborCalls = 0;
|
|
let payAllCalls = 0;
|
|
|
|
await login(page, {
|
|
email: process.env.TEST_USERNAME,
|
|
password: process.env.TEST_PASSWORD
|
|
});
|
|
|
|
await page.route("**/payroll/calculatelabor", async (route) => {
|
|
calculateLaborCalls += 1;
|
|
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: "application/json",
|
|
body: JSON.stringify([
|
|
{
|
|
employeeid: "emp-1",
|
|
mod_lbr_ty: "LAA",
|
|
expectedHours: 4,
|
|
claimedHours: 1
|
|
},
|
|
{
|
|
employeeid: "emp-2",
|
|
mod_lbr_ty: "LAB",
|
|
expectedHours: 2,
|
|
claimedHours: 1
|
|
}
|
|
])
|
|
});
|
|
});
|
|
|
|
await page.route("**/payroll/payall", async (route) => {
|
|
payAllCalls += 1;
|
|
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: "application/json",
|
|
body: JSON.stringify([{ id: "tt-1" }])
|
|
});
|
|
});
|
|
|
|
await openCommissionCutHarness(page);
|
|
await expect(page.getByText("Claim Task Preview")).toBeVisible();
|
|
await expect(page.getByRole("cell", { name: "Commission" })).toBeVisible();
|
|
await expect(page.getByRole("cell", { name: "Hourly" })).toBeVisible();
|
|
await expect(
|
|
page.getByText(
|
|
"There are currently 1.25 hours of repair lines that are unassigned. These hours are not including in the above calculations and must be paid manually."
|
|
)
|
|
).toBeVisible();
|
|
|
|
await expect(page.getByRole("button", { name: "Pay All" })).toBeVisible();
|
|
await page.getByRole("button", { name: "Pay All" }).click();
|
|
|
|
await expect.poll(() => calculateLaborCalls).toBeGreaterThan(0);
|
|
await expect.poll(() => payAllCalls).toBe(1);
|
|
await expect(page.getByText("All hours paid out successfully.")).toBeVisible();
|
|
});
|
|
|
|
test("shows the backend error when Pay All is rejected", async ({ page }) => {
|
|
await login(page, {
|
|
email: process.env.TEST_USERNAME,
|
|
password: process.env.TEST_PASSWORD
|
|
});
|
|
|
|
await page.route("**/payroll/calculatelabor", async (route) => {
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: "application/json",
|
|
body: JSON.stringify([
|
|
{
|
|
employeeid: "emp-1",
|
|
mod_lbr_ty: "LAA",
|
|
expectedHours: 4,
|
|
claimedHours: 1
|
|
}
|
|
])
|
|
});
|
|
});
|
|
|
|
await page.route("**/payroll/payall", async (route) => {
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: "application/json",
|
|
body: JSON.stringify({
|
|
success: false,
|
|
error: "Not all hours have been assigned."
|
|
})
|
|
});
|
|
});
|
|
|
|
await openCommissionCutHarness(page);
|
|
await page.getByRole("button", { name: "Pay All" }).click();
|
|
|
|
await expect(page.getByText("Error flagging hours. Not all hours have been assigned.")).toBeVisible();
|
|
});
|
|
|
|
test("shows a negative labor difference when previously claimed hours exceed the current expected hours", async ({
|
|
page
|
|
}) => {
|
|
await login(page, {
|
|
email: process.env.TEST_USERNAME,
|
|
password: process.env.TEST_PASSWORD
|
|
});
|
|
|
|
await page.route("**/payroll/calculatelabor", async (route) => {
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: "application/json",
|
|
body: JSON.stringify([
|
|
{
|
|
employeeid: "emp-1",
|
|
mod_lbr_ty: "LAA",
|
|
expectedHours: 2,
|
|
claimedHours: 5
|
|
}
|
|
])
|
|
});
|
|
});
|
|
|
|
await openCommissionCutHarness(page);
|
|
|
|
await expect(page.locator("strong").filter({ hasText: "-3" }).first()).toBeVisible();
|
|
});
|
|
});
|