From 9a08c6d0fbc93c283f712cc25c8e0e2f152dd6cf Mon Sep 17 00:00:00 2001 From: Ben Vinegar Date: Tue, 13 Oct 2026 16:19:38 -0400 Subject: [PATCH] test(website): allow published prereleases in changelog smoke --- .changeset/published-changelog-smoke.md | 2 ++ website/tests/changelog-smoke.spec.ts | 34 +++++++++++++++++++------ 2 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 .changeset/published-changelog-smoke.md diff --git a/.changeset/published-changelog-smoke.md b/.changeset/published-changelog-smoke.md new file mode 100644 index 000000000..a845151cc --- /dev/null +++ b/.changeset/published-changelog-smoke.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/website/tests/changelog-smoke.spec.ts b/website/tests/changelog-smoke.spec.ts index 25d31af8a..c90e5d072 100644 --- a/website/tests/changelog-smoke.spec.ts +++ b/website/tests/changelog-smoke.spec.ts @@ -1,12 +1,16 @@ -import { expect, test } from "@playwright/test"; import { readFileSync } from "node:fs"; +import { expect, test } from "@playwright/test"; -// Release channels change independently of this test; verify the browser preserves published labels. -const changelogIndex = readFileSync( - new URL("../src/content/docs/changelog/index.md", import.meta.url), - "utf8", -); -const prereleaseSeriesCount = changelogIndex.match(/^Prerelease ·/gm)?.length ?? 0; +/** Read the published series metadata that the browser must render, including prereleases. */ +function readTestChangelogSeries() { + const index = readFileSync( + new URL("../src/content/docs/changelog/index.md", import.meta.url), + "utf8", + ); + return [...index.matchAll(/^## \[(Hunk \d+\.\d+)\]\(([^)]+)\)\r?\n\r?\n([^\r\n]+)/gm)].map( + ([, title, href, metadata]) => ({ title: title!, href: href!, metadata: metadata! }), + ); +} test("the changelog is reachable from the main navigation", async ({ page }, testInfo) => { await page.goto("/"); @@ -118,7 +122,21 @@ test("the index lists every series newest first and links each one", async ({ pa expect(major > nextMajor || (major === nextMajor && minor > nextMinor)).toBe(true); } - await expect(page.getByText(/^Prerelease ·/)).toHaveCount(prereleaseSeriesCount); + // The generated index can contain prerelease-only series ahead of the latest stable one. + // Generator unit tests own badge policy; this smoke test checks the published rendering. + const publishedSeries = readTestChangelogSeries(); + expect(labels).toEqual(publishedSeries.map((series) => series.title)); + for (const series of publishedSeries) { + await expect( + page + .getByRole("heading", { level: 2 }) + .getByRole("link", { name: series.title, exact: true }), + ).toHaveAttribute("href", series.href); + await expect(page.getByText(series.metadata, { exact: true })).toHaveCount(1); + } + await expect(page.getByText(/^Prerelease ·/)).toHaveCount( + publishedSeries.filter((series) => series.metadata.startsWith("Prerelease ·")).length, + ); await expect(page.getByText(/^Latest ·/)).toHaveCount(1); });