import { expect, test } from "@playwright/test"; test.describe("Projects", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); await page.fill('input[type="email"]', "manager@nexus.dev"); await page.fill('input[type="password"]', "manager123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/resources/); await page.goto("/projects"); }); test("shows projects list", async ({ page }) => { await expect(page.locator("h1")).toContainText("Projects"); await expect(page.locator("table")).toBeVisible(); }); test("project wizard — opens and shows step 1", async ({ page }) => { await page.locator("button", { hasText: "New Project" }).click(); await expect(page.locator("text=Select Blueprint")).toBeVisible(); }); test("project wizard — completes all 5 steps", async ({ page }) => { await page.locator("button", { hasText: "New Project" }).click(); // Step 1: Blueprint selection await expect(page.locator("text=Select Blueprint")).toBeVisible(); // Select the first available blueprint const blueprintCard = page .locator("[data-blueprint-id]") .first() .or( page .locator("button") .filter({ hasText: /Blueprint|Production/ }) .first(), ); if ((await blueprintCard.count()) > 0) { await blueprintCard.click(); } else { // Click next without blueprint if none shown const nextBtn = page.locator("button", { hasText: "Next" }); await nextBtn.click(); } // Step 2: Timeline — set project dates await expect(page.locator("text=Timeline").or(page.locator("text=Project Dates"))).toBeVisible({ timeout: 5000, }); const projectNameInput = page .locator('input[placeholder*="name"]') .or(page.locator('input[name="name"]')) .first(); if ((await projectNameInput.count()) > 0) { await projectNameInput.fill(`E2E Test Project ${Date.now()}`); } await page.locator("button", { hasText: "Next" }).click(); // Step 3: Staffing demand await expect( page.locator("text=Staffing").or(page.locator("text=Demand").or(page.locator("text=Roles"))), ).toBeVisible({ timeout: 5000 }); await page.locator("button", { hasText: "Next" }).click(); // Step 4: Suggestions / Assignment await page.waitForTimeout(500); await page.locator("button", { hasText: "Next" }).click(); // Step 5: Review await page.waitForTimeout(500); const reviewOrFinish = page .locator("text=Review") .or(page.locator("button", { hasText: /Create|Finish|Submit/ })); await expect(reviewOrFinish).toBeVisible({ timeout: 5000 }); // Don't actually submit — just close const cancelBtn = page.locator("button", { hasText: /Cancel|Close/ }).first(); if ((await cancelBtn.count()) > 0) { await cancelBtn.click(); } }); });