import { expect, test } from "@playwright/test" import { ApiClient } from "../api-client" import { SEED } from "../seed-constants" const apiClient = new ApiClient() test.describe("Info Board Page @full", () => { test.beforeEach(async () => { await apiClient.login(SEED.admin.email, SEED.admin.password) await apiClient.resetDb() }) test("lists seed posts with pinned post first", async ({ page }) => { await page.goto("/info-board") // Should have at least 2 posts visible const posts = page.locator("[data-testid*='info-post']").or( page.locator("article, [role='article']") ) // Wait for content to load await page.waitForTimeout(1000) await expect(page.locator("body")).toBeVisible() // Verify posts are listed (look for post content or structure) const postElements = page .locator("[data-testid*='post']") .or(page.locator("article")) const count = await postElements.count() expect(count).toBeGreaterThanOrEqual(1) }) test("category filter dropdown works", async ({ page }) => { await page.goto("/info-board") // Look for category filter const filterSelect = page .locator('[data-testid="info-board-category-filter"]') .or(page.getByRole("combobox")) .or(page.locator("select")) if (await filterSelect.first().isVisible()) { await filterSelect.first().click() await page.waitForTimeout(300) // Options should appear await expect(page.locator("body")).toBeVisible() } }) test("new post dialog opens and form submits", async ({ page }) => { await page.goto("/info-board") const newBtn = page .getByRole("button", { name: /neuer beitrag|new post|erstellen/i }) .or(page.locator('[data-testid="info-board-new-post"]')) await expect(newBtn).toBeVisible() await newBtn.click() // Dialog should open with form await expect( page.getByRole("dialog").or(page.locator("[role='dialog']")) ).toBeVisible() // Fill form fields const titleInput = page .getByLabel(/titel|title/i) .or(page.locator("input[name*='title']")) if (await titleInput.isVisible()) { await titleInput.fill("E2E Test Beitrag") } const contentInput = page .getByLabel(/inhalt|content|text/i) .or(page.locator("textarea")) if (await contentInput.isVisible()) { await contentInput.fill("Test-Inhalt für Integration Test.") } // Submit const submitBtn = page.getByRole("button", { name: /erstellen|speichern|submit|posten/i, }) if (await submitBtn.isVisible()) { await submitBtn.click() // Should succeed (toast or new post visible) await page.waitForTimeout(1000) await expect(page.locator("body")).toBeVisible() } }) test("pin indicator visible on pinned post", async ({ page }) => { await page.goto("/info-board") // Look for pin icon/badge on the first (pinned) post await expect( page .locator("[data-testid*='pinned']") .first() .or(page.locator("[aria-label*='pin']").first()) .or(page.getByText(/📌|angepinnt|pinned/i).first()) ).toBeVisible() }) test("archive and delete buttons visible", async ({ page }) => { await page.goto("/info-board") // Admin should see archive/delete actions const archiveBtn = page .getByRole("button", { name: /archiv/i }) .first() .or(page.locator("[data-testid*='archive']").first()) const deleteBtn = page .getByRole("button", { name: /löschen|delete/i }) .first() .or(page.locator("[data-testid*='delete']").first()) const archiveVisible = await archiveBtn.isVisible() const deleteVisible = await deleteBtn.isVisible() expect(archiveVisible || deleteVisible).toBeTruthy() }) })