diff --git a/.env b/.env index 62268534e78..309549b8f59 100755 --- a/.env +++ b/.env @@ -106,7 +106,7 @@ ADMINS= MONTHLY_CRON_ENABLED= # Functional tests -E2E_TEST_ENV=local +E2E_TEST_ENV="not running e2e tests" E2E_TEST_SECRET=test-secret E2E_TEST_ACCOUNT_BASE_EMAIL=test-account E2E_TEST_ACCOUNT_BASE_PASSWORD=test-password diff --git a/src/app/functions/server/getExperiments.test.ts b/src/app/functions/server/getExperiments.test.ts index ab4afd8eeb6..566a45f9841 100644 --- a/src/app/functions/server/getExperiments.test.ts +++ b/src/app/functions/server/getExperiments.test.ts @@ -99,6 +99,7 @@ describe("getExperiments", () => { }); it("calls Cirrus V2 when feature flag is enabled with preview param", async () => { + process.env.NEXT_RUNTIME = "test"; process.env.NIMBUS_SIDECAR_URL = "https://cirrus.example"; getEnabledFeatureFlagsMock.mockReturnValue([ "CirrusV2", @@ -150,6 +151,8 @@ describe("getExperiments", () => { previewMode: true, }), ); + + delete process.env.NEXT_RUNTIME; }); it("calls Cirrus V1 when featurn flag is disabled", async () => { @@ -188,7 +191,8 @@ describe("getExperiments", () => { ); }); - it("fallsback to defaultExperimentData when not experiment data is returned by Cirrus", async () => { + it("fallsback to defaultExperimentData when no experiment data is returned by Cirrus", async () => { + process.env.NEXT_RUNTIME = "test"; process.env.NIMBUS_SIDECAR_URL = "https://cirrus.example"; getEnabledFeatureFlagsMock.mockReturnValue([ "CirrusV2", @@ -235,6 +239,7 @@ describe("getExperiments", () => { previewMode: true, }), ); + delete process.env.NEXT_RUNTIME; }); it("logs error, captures exception, and returns defaultExperimentData on error response", async () => { diff --git a/src/app/functions/server/getExperiments.ts b/src/app/functions/server/getExperiments.ts index 98d896c5b91..06833ce9427 100644 --- a/src/app/functions/server/getExperiments.ts +++ b/src/app/functions/server/getExperiments.ts @@ -59,7 +59,13 @@ export async function getExperiments(params: { serverUrl.pathname += "v1/features"; } - const nextHeaders = await loadNextHeaders(); + const nextHeaders = + // We also check for experiments in cron jobs, where there are + // no HTTP requests. Skip the headers there; we don't need to + // force-enable experiments in cronjobs. + typeof process.env.NEXT_RUNTIME === "string" + ? await loadNextHeaders() + : null; let previewMode = false; if (nextHeaders) { const headersList = await nextHeaders.headers(); diff --git a/src/db/tables/featureFlags.ts b/src/db/tables/featureFlags.ts index 7ff07b5ba72..4ea1f64079d 100644 --- a/src/db/tables/featureFlags.ts +++ b/src/db/tables/featureFlags.ts @@ -92,7 +92,16 @@ export async function getEnabledFeatureFlags( options: { isSignedOut?: false; email: string } | { isSignedOut: true }, ): Promise { // Force feature flags for E2E tests via URL query params - if (process.env.E2E_TEST_ENV === "local") { + if ( + // Check that we're running under Next.js; in cronjobs + // there's no request to inspect. We're not force-enabling + // feature flags in that environment anyway. + typeof process.env.NEXT_RUNTIME === "string" && + // When running end-to-end tests locally or in a PR, + // we can force-enable feature flags that haven't been enabled + // yet on stage or on prod: + process.env.E2E_TEST_ENV === "local" + ) { const { headers } = await import("next/headers"); const forcedFeatureFlags = (await headers()).get("x-forced-feature-flags");