85 lines
3.0 KiB
TypeScript
85 lines
3.0 KiB
TypeScript
import { expect, test, type Page } from "@playwright/test";
|
|
import { applyDeterministicPage, useE2EUser } from "./helpers.ts";
|
|
|
|
test("tenant dashboard shows lease summary and activity", async ({ page }: { page: Page }) => {
|
|
await applyDeterministicPage(page);
|
|
await useE2EUser(page, "tenant");
|
|
|
|
await page.goto("/tenant/dashboard");
|
|
|
|
await expect(page.getByRole("heading", { name: /tenant portal/i }))
|
|
.toBeVisible();
|
|
await expect(page.getByText("456 Maple St")).toBeVisible();
|
|
await expect(page.getByRole("heading", { name: /recent payments/i }))
|
|
.toBeVisible();
|
|
await expect(page.getByRole("cell", { name: "ach" }).first()).toBeVisible();
|
|
});
|
|
|
|
test("tenant maintenance list includes active requests", async ({ page }: { page: Page }) => {
|
|
await applyDeterministicPage(page);
|
|
await useE2EUser(page, "tenant");
|
|
|
|
await page.goto("/tenant/maintenance");
|
|
|
|
await expect(page.getByRole("heading", { name: /maintenance requests/i }))
|
|
.toBeVisible();
|
|
await expect(
|
|
page.getByRole("heading", { name: /kitchen sink is leaking/i }),
|
|
).toBeVisible();
|
|
});
|
|
|
|
test("tenant can submit a maintenance request", async ({ page }: { page: Page }) => {
|
|
await applyDeterministicPage(page);
|
|
await useE2EUser(page, "tenant");
|
|
|
|
await page.goto("/tenant/maintenance/new");
|
|
|
|
await page.locator("#title").fill("HVAC filter replacement");
|
|
await page.locator("#category").selectOption("hvac");
|
|
await page.locator("#priority").selectOption("high");
|
|
await page.locator("#description").fill(
|
|
"The air filter needs to be replaced before next week.",
|
|
);
|
|
|
|
await page.getByRole("button", { name: /submit request/i }).click();
|
|
|
|
await expect(page).toHaveURL(/\/tenant\/maintenance\?success=true/);
|
|
await expect(page.getByText(/submitted successfully/i)).toBeVisible();
|
|
});
|
|
|
|
test("tenant messages list shows landlord communication", async ({ page }: { page: Page }) => {
|
|
await applyDeterministicPage(page);
|
|
await useE2EUser(page, "tenant");
|
|
|
|
await page.goto("/tenant/messages");
|
|
|
|
await expect(page.getByRole("heading", { name: /messages/i })).toBeVisible();
|
|
await expect(page.getByText(/inspection scheduled/i)).toBeVisible();
|
|
const unreadMessage = page.getByRole("listitem").filter({
|
|
hasText: /leaking kitchen faucet/i,
|
|
}).first();
|
|
await expect(unreadMessage).toBeVisible();
|
|
const markReadButton = unreadMessage.getByRole("button", {
|
|
name: /mark as read/i,
|
|
});
|
|
if (await markReadButton.count()) {
|
|
await expect(markReadButton).toBeVisible();
|
|
}
|
|
});
|
|
|
|
test("tenant rent pay flow accepts payment method", async ({ page }: { page: Page }) => {
|
|
await applyDeterministicPage(page);
|
|
await useE2EUser(page, "tenant");
|
|
|
|
await page.goto("/tenant/rent/pay");
|
|
|
|
await expect(page.getByRole("heading", { name: /pay rent/i })).toBeVisible();
|
|
await page.getByLabel(/payment method/i).selectOption("e2e-pay-method-1");
|
|
|
|
const submitButton = page.locator("button[type='submit']");
|
|
await submitButton.scrollIntoViewIfNeeded();
|
|
await submitButton.click();
|
|
await expect(page).toHaveURL(/\/tenant\/rent\/confirmation\?success=true/);
|
|
});
|
|
|