diff --git a/desktop/tests/e2e/screenshot-feature-flags.ts b/desktop/tests/e2e/screenshot-feature-flags.ts index a7119d318..5e2ac7d26 100644 --- a/desktop/tests/e2e/screenshot-feature-flags.ts +++ b/desktop/tests/e2e/screenshot-feature-flags.ts @@ -1,6 +1,7 @@ import { expect, test } from "@playwright/test"; import { installMockBridge } from "../helpers/bridge"; import { openSettings } from "../helpers/settings"; +import { PREVIEW_FEATURE_IDS } from "../helpers/features"; const WATERCOLOR_CHANNEL_ID = "a27e1ee9-76a6-5bdf-a5d5-1d85610dad11"; const FORUM_POST_ID = "mock-forum-release-thread"; @@ -155,10 +156,9 @@ test("screenshot: Settings → Experiments (all on)", async ({ page }) => { await openSettings(page); await page.getByTestId("settings-nav-experimental").click(); await expect(page.getByTestId("settings-experimental")).toBeVisible(); - await page.getByTestId("feature-toggle-workflows").click(); - await page.getByTestId("feature-toggle-projects").click(); - await page.getByTestId("feature-toggle-pulse").click(); - await page.getByTestId("feature-toggle-forum").click(); + for (const id of PREVIEW_FEATURE_IDS) { + await page.getByTestId(`feature-toggle-${id}`).click(); + } await page.waitForTimeout(500); const view = page.getByTestId("settings-view"); await view.screenshot({ diff --git a/desktop/tests/helpers/bridge.ts b/desktop/tests/helpers/bridge.ts index 3b498d000..8e334acc9 100644 --- a/desktop/tests/helpers/bridge.ts +++ b/desktop/tests/helpers/bridge.ts @@ -1,4 +1,5 @@ import type { Page } from "@playwright/test"; +import { PREVIEW_FEATURE_IDS } from "./features"; export const TEST_IDENTITIES = { tyler: { @@ -111,10 +112,6 @@ type BridgeOptions = { const ONBOARDING_COMPLETION_STORAGE_KEY_PREFIX = "sprout-onboarding-complete.v1:"; const FEATURE_OVERRIDES_STORAGE_KEY = "sprout-feature-overrides-v1"; -// Keep in sync with `tier: "preview"` entries in `/features.json`. E2E -// tests opt into all preview features by default so gated UI is reachable -// without clicking through Settings → Experiments on every spec. -const PREVIEW_FEATURE_IDS = ["workflows", "projects", "pulse", "forum"]; const DEFAULT_MOCK_PUBKEY = "deadbeef".repeat(8); const DEFAULT_RELAY_WS_URL = "ws://localhost:3000"; diff --git a/desktop/tests/helpers/features.ts b/desktop/tests/helpers/features.ts new file mode 100644 index 000000000..ade9759eb --- /dev/null +++ b/desktop/tests/helpers/features.ts @@ -0,0 +1,27 @@ +// Single source of truth for E2E tests: derive the preview-feature list from +// /features.json so we don't have to hand-maintain a parallel array. +// +// Tier transitions (preview → stable, or new preview features added) are +// picked up automatically by every test that imports from here. +import featuresManifest from "../../../features.json" with { type: "json" }; + +interface FeatureDefinition { + id: string; + name: string; + description: string; + tier: "stable" | "preview"; + platforms?: string[]; +} + +interface FeaturesManifest { + version: number; + features: FeatureDefinition[]; +} + +const manifest = featuresManifest as FeaturesManifest; + +/** IDs of every preview-tier feature on desktop. */ +export const PREVIEW_FEATURE_IDS: string[] = manifest.features + .filter((f) => f.tier === "preview") + .filter((f) => !f.platforms || f.platforms.includes("desktop")) + .map((f) => f.id);