Files
GearBox/e2e/collection.spec.ts
Jean-Luc Makiola 94e2094b9b test(27-00): wave 0 E2E scaffolding for Phase 27 nav restructure
- Update dashboard.spec.ts: replace old card heading tests with discovery section tests
- Add TopNav presence test (Home/Collection/Setups links in nav)
- Add mobile bottom tab bar test with 375px viewport
- Mark removed dashboard card tests as test.fixme with explanatory comments
- Update collection.spec.ts: replace setups tab test with fallback-to-gear test
- Add standalone /setups route test in new Setups page describe block
- All tests expected to fail until Plans 01-03 implement the new UI
2026-04-10 23:44:10 +02:00

100 lines
3.4 KiB
TypeScript

import { expect, test } from "@playwright/test";
test.describe("Collection page", () => {
test.beforeEach(async ({ page }) => {
await page.goto("/collection");
await page.waitForLoadState("networkidle");
});
test.describe("Gear tab", () => {
test("shows seeded items", async ({ page }) => {
await expect(page.getByText("Zpacks Duplex")).toBeVisible();
await expect(page.getByText("BRS-3000T Stove")).toBeVisible();
});
test("search filters items by name", async ({ page }) => {
const searchInput = page.getByPlaceholder("Search items...");
await searchInput.fill("Zpacks");
await expect(page.getByText("Zpacks Duplex")).toBeVisible();
// Other items should not be visible
await expect(page.getByText("BRS-3000T Stove")).not.toBeVisible();
});
test("clearing search restores all items", async ({ page }) => {
const searchInput = page.getByPlaceholder("Search items...");
await searchInput.fill("Zpacks");
await expect(page.getByText("BRS-3000T Stove")).not.toBeVisible();
// Clear the search
await searchInput.clear();
await expect(page.getByText("BRS-3000T Stove")).toBeVisible();
});
test("category filter dropdown opens and lists categories", async ({
page,
}) => {
const filterButton = page.getByRole("button", {
name: /all categories/i,
});
await filterButton.click();
// Dropdown list (ul) contains the category options
const dropdown = page.locator("ul");
await expect(
dropdown.getByRole("button", { name: "Shelter" }),
).toBeVisible();
await expect(
dropdown.getByRole("button", { name: "Cook Kit" }),
).toBeVisible();
});
test("category filter shows only items in selected category", async ({
page,
}) => {
// Open filter dropdown
const filterButton = page.getByRole("button", {
name: /all categories/i,
});
await filterButton.click();
// Select "Shelter" from the dropdown list
const dropdown = page.locator("ul");
await dropdown.getByRole("button", { name: "Shelter" }).click();
await expect(page.getByText("Zpacks Duplex")).toBeVisible();
// Items from other categories should not be visible
await expect(page.getByText("BRS-3000T Stove")).not.toBeVisible();
});
});
test.describe("Tab switching", () => {
test("navigates to planning tab", async ({ page }) => {
await page.goto("/collection?tab=planning");
await page.waitForLoadState("networkidle");
// Planning tab shows the active thread
await expect(page.getByText("New Backpack")).toBeVisible();
});
// Post-Phase-27: ?tab=setups no longer exists in Collection — falls back to gear tab
test("setups tab URL falls back to gear tab", async ({ page }) => {
await page.goto("/collection?tab=setups");
await page.waitForLoadState("networkidle");
// Setups tab no longer exists in Collection, should fall back to gear
await expect(page.getByText("Zpacks Duplex")).toBeVisible();
});
test("gear tab is default and shows items", async ({ page }) => {
// Default tab (no ?tab param) shows gear
await expect(page.getByText("Zpacks Duplex")).toBeVisible();
});
});
});
// Post-Phase-27: Setups is now a standalone top-level route
test.describe("Setups page", () => {
test("navigates to /setups and shows seeded setup", async ({ page }) => {
await page.goto("/setups");
await page.waitForLoadState("networkidle");
await expect(page.getByText("Weekend Overnighter")).toBeVisible();
});
});