71 lines
3.0 KiB
TypeScript
71 lines
3.0 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
import { installMockApi } from "./mockApi";
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await installMockApi(page);
|
|
});
|
|
|
|
test("validation page: issues table, distributions and reason filter", async ({ page }) => {
|
|
const issueRequests: string[] = [];
|
|
page.on("request", (req) => {
|
|
if (req.url().includes("/issues")) issueRequests.push(req.url());
|
|
});
|
|
|
|
await page.goto("/validation");
|
|
|
|
// Both rejected objects are listed
|
|
await expect(page.getByText("rsync://repo-a.example/ca1/stale.cer")).toBeVisible();
|
|
await expect(page.getByText("rsync://repo-b.example/ca2/broken.roa")).toBeVisible();
|
|
|
|
// Result distribution
|
|
await expect(page.getByText("Result distribution")).toBeVisible();
|
|
|
|
// Click a reject-reason row → URL param + filtered request
|
|
await page.getByRole("button", { name: /manifest stale/ }).click();
|
|
await expect(page).toHaveURL(/reason=manifest/);
|
|
await expect.poll(() => issueRequests.some((u) => u.includes("reason=manifest"))).toBe(true);
|
|
await expect(page.getByText("rsync://repo-b.example/ca2/broken.roa")).toBeVisible();
|
|
await expect(page.getByText("rsync://repo-a.example/ca1/stale.cer")).toBeHidden();
|
|
|
|
// Clear filters
|
|
await page.getByRole("link", { name: "Clear filters" }).click();
|
|
await expect(page.getByText("rsync://repo-a.example/ca1/stale.cer")).toBeVisible();
|
|
});
|
|
|
|
test("search page: grouped results and navigation", async ({ page }) => {
|
|
await page.goto("/search?q=repo-a.example");
|
|
await expect(page.getByText("Repositories (1)")).toBeVisible();
|
|
await expect(page.getByText("Publication points (2)")).toBeVisible();
|
|
|
|
await page.getByRole("link", { name: /repo-a.example/ }).first().click();
|
|
await expect(page).toHaveURL(/\/repositories\/repo-a1b2c3d4e5f6|\/publication-points\/node_/);
|
|
});
|
|
|
|
test("search page: exact URI finds the object", async ({ page }) => {
|
|
await page.goto("/search?q=rsync://repo-a.example/ca1/alice.roa");
|
|
await expect(page.getByText("Objects (1)")).toBeVisible();
|
|
await page.getByRole("link", { name: /alice.roa/ }).click();
|
|
await expect(page).toHaveURL(/\/objects\/obj-roa-0001/);
|
|
});
|
|
|
|
test("search page: ASN/prefix queries show the #070 capability notice", async ({ page }) => {
|
|
await page.goto("/search?q=AS65001");
|
|
await expect(page.getByRole("status").filter({ hasText: "feature #070" })).toBeVisible();
|
|
});
|
|
|
|
test("search page: empty result state", async ({ page }) => {
|
|
await page.goto("/search?q=nothing-matches-this");
|
|
await expect(page.getByText(/No results for/)).toBeVisible();
|
|
});
|
|
|
|
test("exports page: seeded job completes and offers a download", async ({ page }) => {
|
|
const mock = await installMockApi(page);
|
|
mock.seedJob({ status: "running" });
|
|
|
|
await page.goto("/exports");
|
|
await expect(page.getByText("job-0001")).toBeVisible();
|
|
// Job transitions to complete after the poll interval
|
|
await expect(page.getByRole("link", { name: "Download" })).toBeVisible({ timeout: 10_000 });
|
|
await expect(page.getByText("2.0 KiB")).toBeVisible();
|
|
});
|