import { expect, test } from "@playwright/test"; test.describe("Staffing", () => { test.beforeEach(async ({ page }) => { await page.goto("/auth/signin"); await page.fill('input[type="email"]', "admin@capakraken.dev"); await page.fill('input[type="password"]', "admin123"); await page.click('button[type="submit"]'); await expect(page).toHaveURL(/\/(dashboard|resources)/); await page.goto("/staffing"); }); test("staffing page loads with search form", async ({ page }) => { await page.waitForLoadState("networkidle"); await expect(page.locator("h1", { hasText: /Staffing Suggestions/i })).toBeVisible({ timeout: 10000 }); // Search form should have skill input, date fields, and a search button await expect(page.locator("text=How scoring works")).toBeVisible({ timeout: 10000 }); }); test("search form has default skill tags", async ({ page }) => { await page.waitForLoadState("networkidle"); // The StaffingPanel pre-populates with TypeScript and React skill tags await expect( page.locator("text=TypeScript").or(page.locator("text=React")), ).toBeVisible({ timeout: 10000 }); }); test("submitting search returns suggestions or empty state", async ({ page }) => { await page.waitForLoadState("networkidle"); // Click the search/submit button const searchBtn = page.locator("button", { hasText: /Search|Find|Suggest/i }).first(); await expect(searchBtn).toBeVisible({ timeout: 10000 }); await searchBtn.click(); await page.waitForTimeout(1000); // After search, should show either suggestion cards or a "no suggestions" message await expect( page.locator("text=/Score|Availability|No suggestions|No matching/i").first() .or(page.locator("[data-suggestion]").first()) .or(page.locator("table").first()), ).toBeVisible({ timeout: 15000 }); }); });