From d903728eca38517993ee983ce23c203737bf7b94 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Thu, 11 Apr 2024 13:38:04 +0200 Subject: [PATCH 01/16] test(site): add e2e tests for experiments --- site/e2e/constants.ts | 4 ++ site/e2e/tests/deployment/general.spec.ts | 37 +++++++++++++++++++ site/src/pages/DeploySettingsPage/Option.tsx | 5 ++- .../pages/DeploySettingsPage/OptionsTable.tsx | 4 +- 4 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 site/e2e/tests/deployment/general.spec.ts diff --git a/site/e2e/constants.ts b/site/e2e/constants.ts index 351af63be249c..6998968977908 100644 --- a/site/e2e/constants.ts +++ b/site/e2e/constants.ts @@ -37,3 +37,7 @@ export const requireEnterpriseTests = Boolean( process.env.CODER_E2E_REQUIRE_ENTERPRISE_TESTS, ); export const enterpriseLicense = process.env.CODER_E2E_ENTERPRISE_LICENSE ?? ""; + +// Fake experiments to verify that site presents them as enabled. +export const e2eFakeExperiment1 = "e2e-fake-experiment-1"; +export const e2eFakeExperiment2 = "e2e-fake-experiment-2"; diff --git a/site/e2e/tests/deployment/general.spec.ts b/site/e2e/tests/deployment/general.spec.ts new file mode 100644 index 0000000000000..75b73d22ed42a --- /dev/null +++ b/site/e2e/tests/deployment/general.spec.ts @@ -0,0 +1,37 @@ +import { expect, test } from "@playwright/test"; +import * as API from "api/api"; +import { setupApiCalls } from "../../api"; +import { requiresEnterpriseLicense } from "../../helpers"; + +test("experiments", async ({ page }) => { + requiresEnterpriseLicense(); + await setupApiCalls(page); + + // Load experiments from backend API + const availableExperiments = await API.getAvailableExperiments(); + const enabledExperiments = await API.getExperiments(); + + // Verify if the site lists the same experiments + await page.goto("/deployment/general", { waitUntil: "domcontentloaded" }); + + const experimentsLocator = page.locator( + "div.options-table tr.option-experiments ul.option-array", + ); + await expect(experimentsLocator).toBeVisible(); + + // Firstly, check if available experiments are listed + availableExperiments.safe.map(async (experiment) => { + const experimentLocator = experimentsLocator.locator( + `li.option-array-item-${experiment}`, + ); + await expect(experimentLocator).toBeVisible(); + }); + + // Secondly, check if all enabled experiments are listed + enabledExperiments.map(async (experiment) => { + const experimentLocator = experimentsLocator.locator( + `li.option-array-item-${experiment}.option-enabled`, + ); + await expect(experimentLocator).toBeVisible(); + }); +}); diff --git a/site/src/pages/DeploySettingsPage/Option.tsx b/site/src/pages/DeploySettingsPage/Option.tsx index de9ead5cb9233..9e5e9f7abdda7 100644 --- a/site/src/pages/DeploySettingsPage/Option.tsx +++ b/site/src/pages/DeploySettingsPage/Option.tsx @@ -51,7 +51,7 @@ export const OptionValue: FC = (props) => { if (typeof value === "object" && !Array.isArray(value)) { return ( -