rpki/ui/rpki-explorer/tests/e2e/objects.spec.ts

56 lines
2.8 KiB
TypeScript

import { expect, test } from "@playwright/test";
import { installMockApi } from "./mockApi";
test.beforeEach(async ({ page }) => {
await installMockApi(page);
});
test("objects page lists all objects with server-side filters", async ({ page }) => {
const requests: string[] = [];
page.on("request", (req) => {
if (req.url().includes("/objects?")) requests.push(req.url());
});
await page.goto("/objects");
await expect(page.getByText("rsync://repo-a.example/ca1/alice.roa")).toBeVisible();
await expect(page.getByText("rsync://repo-b.example/ca2/bob.asa")).toBeVisible();
// Type filter is sent to the backend and narrows the rendered list
await page.getByLabel("Type").selectOption("manifest");
await expect.poll(() => requests.some((url) => url.includes("type=manifest"))).toBe(true);
await expect(page.getByText("rsync://repo-a.example/ca1/manifest.mft")).toBeVisible();
await expect(page.getByText("rsync://repo-b.example/ca2/bob.asa")).toBeHidden();
// Rejected-only checkbox
await page.getByLabel("Type").selectOption("");
await page.getByRole("checkbox", { name: "Rejected only" }).click();
await expect(page.getByRole("checkbox", { name: "Rejected only" })).toBeChecked();
await expect.poll(() => requests.some((url) => url.includes("rejected=true"))).toBe(true);
await expect(page.getByText("rsync://repo-a.example/ca1/stale.cer")).toBeVisible();
await expect(page.getByText("rsync://repo-a.example/ca1/alice.roa")).toBeHidden();
// URI substring filter
await page.getByRole("checkbox", { name: "Rejected only" }).click();
await expect(page.getByRole("checkbox", { name: "Rejected only" })).not.toBeChecked();
await page.getByLabel("URI contains").fill("repo-b");
await page.getByLabel("URI contains").press("Enter");
await expect.poll(() => requests.some((url) => url.includes("q=repo-b"))).toBe(true);
await expect(page.getByText("rsync://repo-b.example/ca2/bob.asa")).toBeVisible();
await expect(page.getByText("rsync://repo-a.example/ca1/alice.roa")).toBeHidden();
});
test("objects page deep link applies filters from the URL", async ({ page }) => {
await page.goto("/objects?type=certificate&rejected=true");
await expect(page.getByLabel("Type")).toHaveValue("certificate");
await expect(page.getByRole("checkbox", { name: "Rejected only" })).toBeChecked();
await expect(page.getByText("rsync://repo-a.example/ca1/stale.cer")).toBeVisible();
await expect(page.getByText("rsync://repo-a.example/ca1/alice.roa")).toBeHidden();
});
test("object row navigates to the object detail page", async ({ page }) => {
await page.goto("/objects");
await page.getByText("rsync://repo-a.example/ca1/alice.roa").click();
await expect(page).toHaveURL(/\/objects\/obj-roa-0001/);
await expect(page.getByText("ROA object")).toBeVisible();
});