import { expect, test } from "@playwright/test"; test.setTimeout(120_000); test("supports URI search and reports raw/export workflow status", async ({ page }) => { const apiRequests: string[] = []; page.on("request", (request) => { const url = new URL(request.url()); if (url.pathname.startsWith("/api/v1")) { apiRequests.push(`${request.method()} ${url.pathname}${url.search}`); } }); await page.goto("/"); await page.getByRole("button", { name: /Objects/i }).click(); await expect(page.getByRole("heading", { name: "MFT object" })).toBeVisible({ timeout: 70_000 }); await page.getByRole("button", { name: "Use selected URI" }).click(); await page.getByPlaceholder("Exact URI lookup...").press("Enter"); await expect.poll( () => apiRequests.some((request) => request.includes("/objects/by-uri")), { timeout: 30_000 } ).toBe(true); await page.getByRole("button", { name: "Download raw" }).click(); await expect(page.getByText("Raw download failed: repo-bytes db is not configured for raw download")).toBeVisible({ timeout: 30_000 }); expect(apiRequests.some((request) => request.includes("/objects/ff44545d40ad3732405b46ec/raw"))).toBe(true); await page.getByRole("button", { name: "Export object" }).click(); await expect(page.getByText("Object export failed: repo-bytes db is required for export jobs")).toBeVisible({ timeout: 30_000 }); expect(apiRequests.some((request) => request.includes("POST /api/v1/runs/run_7144/exports"))).toBe(true); await page.getByRole("button", { name: "Export selected PP" }).click(); await expect(page.getByText("PP export failed: repo-bytes db is required for export jobs")).toBeVisible({ timeout: 30_000 }); await page.screenshot({ path: "../../../../specs/develop/20260617/m6_playwright/rpki-explorer-workflows.png", fullPage: true }); });