169 lines
6.5 KiB
TypeScript
169 lines
6.5 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
|
|
test("garden plants happy path", async ({ page }) => {
|
|
const suffix = Date.now().toString();
|
|
const plantName = `E2E Plant ${suffix}`;
|
|
|
|
await page.goto("/garden?tab=plants");
|
|
await expect(page.getByRole("heading", { name: "Garden" })).toBeVisible();
|
|
|
|
// Add plant
|
|
await page.getByRole("link", { name: /add plant/i }).click();
|
|
await expect(page).toHaveURL(/\/garden\/plants\/new/);
|
|
|
|
await page.getByLabel("Name").fill(plantName);
|
|
await page.getByRole("button", { name: /create/i }).click();
|
|
|
|
await expect(page).toHaveURL(/\/garden\/plants\//);
|
|
await expect(page.getByRole("heading", { name: plantName })).toBeVisible();
|
|
|
|
// Edit plant
|
|
await page.getByRole("link", { name: /edit/i }).click();
|
|
await expect(page).toHaveURL(/\/garden\/plants\/.*\/edit/);
|
|
const updatedName = `${plantName} Updated`;
|
|
await page.getByLabel("Name").fill(updatedName);
|
|
await page.getByRole("button", { name: /save/i }).click();
|
|
|
|
await expect(page).toHaveURL(/\/garden\/plants\//);
|
|
await expect(page.getByRole("heading", { name: updatedName })).toBeVisible();
|
|
|
|
// Delete plant
|
|
await page.getByRole("button", { name: /delete/i }).click();
|
|
await page.getByRole("button", { name: /confirm/i }).click();
|
|
await expect(page).toHaveURL(/\/garden/);
|
|
});
|
|
|
|
test("garden care tracking happy path", async ({ page }) => {
|
|
const suffix = Date.now().toString();
|
|
const plantName = `Care Plant ${suffix}`;
|
|
|
|
// Create a plant to attach care to
|
|
await page.goto("/garden?tab=plants");
|
|
await page.getByRole("link", { name: /add plant/i }).click();
|
|
await page.getByLabel("Name").fill(plantName);
|
|
await page.getByRole("button", { name: /create/i }).click();
|
|
await expect(page).toHaveURL(/\/garden\/plants\//);
|
|
|
|
// Open the Care tab
|
|
await page.getByRole("button", { name: /care/i }).click();
|
|
|
|
// Add a care schedule
|
|
await page.getByRole("button", { name: /add schedule/i }).click();
|
|
await page.getByLabel(/care type/i).fill("watering");
|
|
await page.getByLabel(/interval/i).fill("7");
|
|
await page.getByRole("button", { name: /save|add/i }).click();
|
|
|
|
// Verify schedule appears
|
|
await expect(page.getByText("watering")).toBeVisible();
|
|
await expect(page.getByText(/7 days|every 7/i)).toBeVisible();
|
|
|
|
// Log a care event
|
|
await page.getByRole("button", { name: /log care/i }).click();
|
|
await expect(page.getByLabel(/care type/i)).toBeVisible();
|
|
await page.getByRole("button", { name: /log|save/i }).click();
|
|
|
|
// Verify history entry appears
|
|
await expect(page.getByText(/watered|watering/i)).toBeVisible();
|
|
|
|
// Cleanup: delete the plant
|
|
await page.getByRole("button", { name: /info/i }).click();
|
|
await page.getByRole("button", { name: /delete/i }).click();
|
|
await page.getByRole("button", { name: /confirm/i }).click();
|
|
await expect(page).toHaveURL(/\/garden/);
|
|
});
|
|
|
|
test("garden dashboard widget happy path", async ({ page }) => {
|
|
const suffix = Date.now().toString();
|
|
const plantName = `Widget Plant ${suffix}`;
|
|
|
|
// Create a plant
|
|
await page.goto("/garden?tab=plants");
|
|
await page.getByRole("link", { name: /add plant/i }).click();
|
|
await page.getByLabel("Name").fill(plantName);
|
|
await page.getByRole("button", { name: /create/i }).click();
|
|
await expect(page).toHaveURL(/\/garden\/plants\//);
|
|
|
|
// Add watering schedule every 7 days
|
|
await page.getByRole("button", { name: /care/i }).click();
|
|
await page.getByRole("button", { name: /add schedule/i }).click();
|
|
await page.getByLabel(/interval/i).fill("7");
|
|
await page.getByRole("button", { name: /^add$/i }).click();
|
|
|
|
// Log care (watered)
|
|
await page.getByRole("button", { name: /log care/i }).click();
|
|
await page.getByRole("button", { name: /^log care$/i }).click();
|
|
|
|
// Navigate to dashboard and add garden.care-due widget
|
|
await page.goto("/d/home?edit=1");
|
|
const addWidgetButton = page.getByRole("button", { name: /add widget/i });
|
|
if (await addWidgetButton.isVisible()) {
|
|
await addWidgetButton.click();
|
|
const careDueOption = page.getByText(/plants needing care/i);
|
|
if (await careDueOption.isVisible()) {
|
|
await careDueOption.click();
|
|
}
|
|
}
|
|
|
|
// Save layout if dirty
|
|
const saveButton = page.getByRole("button", { name: /save/i });
|
|
if (await saveButton.isVisible()) {
|
|
await saveButton.click();
|
|
}
|
|
|
|
// Navigate back to dashboard — should show the widget
|
|
await page.goto("/d/home");
|
|
await expect(page.getByText(/plants needing care|all plants are on schedule/i)).toBeVisible({
|
|
timeout: 8000,
|
|
});
|
|
|
|
// Cleanup
|
|
await page.goto("/garden?tab=plants");
|
|
await page.getByText(plantName).click();
|
|
await page.getByRole("button", { name: /delete/i }).click();
|
|
await page.getByRole("button", { name: /confirm/i }).click();
|
|
});
|
|
|
|
test("garden integrations - push overdue to task list", async ({ page }) => {
|
|
// Navigate to garden page
|
|
await page.goto("/garden");
|
|
await expect(page.getByRole("heading", { name: "Garden" })).toBeVisible();
|
|
|
|
// The "Add overdue to task list" button should be present
|
|
const pushButton = page.getByRole("button", { name: /overdue|task list/i });
|
|
await expect(pushButton).toBeVisible();
|
|
|
|
// Click it — with no overdue plants it should show "No overdue" feedback
|
|
await pushButton.click();
|
|
await expect(page.getByText(/no overdue|added \d+ task/i)).toBeVisible({ timeout: 5000 });
|
|
});
|
|
|
|
test("garden containers happy path", async ({ page }) => {
|
|
await page.goto("/garden");
|
|
await expect(page.getByRole("heading", { name: "Garden" })).toBeVisible();
|
|
|
|
// Create a container
|
|
await page.getByRole("button", { name: /new container/i }).click();
|
|
await page.getByLabel("Name").fill("Living Room Shelf");
|
|
await page.getByLabel("Type").selectOption("shelf");
|
|
await page.getByRole("button", { name: /save|create/i }).click();
|
|
|
|
// Verify it appears in the list
|
|
await expect(page.getByText("Living Room Shelf")).toBeVisible();
|
|
|
|
// Open the container detail
|
|
await page.getByText("Living Room Shelf").click();
|
|
await expect(page.getByRole("heading", { name: "Living Room Shelf" })).toBeVisible();
|
|
|
|
// Edit the container
|
|
await page.getByRole("button", { name: /edit/i }).click();
|
|
await page.getByLabel("Name").fill("Living Room Shelf (Updated)");
|
|
await page.getByRole("button", { name: /save/i }).click();
|
|
await expect(page.getByRole("heading", { name: "Living Room Shelf (Updated)" })).toBeVisible();
|
|
|
|
// Delete the container
|
|
await page.getByRole("button", { name: /delete/i }).click();
|
|
await page.getByRole("button", { name: /confirm|yes/i }).click();
|
|
await expect(page).toHaveURL(/\/garden/);
|
|
await expect(page.getByText("Living Room Shelf")).toBeHidden();
|
|
});
|