From 9f71d1c3ace1a4bebb7027c08c5e64a893825d96 Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Thu, 7 Mar 2024 08:36:06 +0100 Subject: [PATCH] test: stop mocking env vars in jest.utils (#53985) --- api/jest.utils.ts | 17 ----------------- api/src/server.test.ts | 8 -------- api/src/utils/env.ts | 26 +++++++++++++++++++++++--- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/api/jest.utils.ts b/api/jest.utils.ts index 6f8dd4282bd..77b66a1c935 100644 --- a/api/jest.utils.ts +++ b/api/jest.utils.ts @@ -7,23 +7,6 @@ import { createUserInput } from './src/utils/create-user'; import { examJson } from './__mocks__/exam'; import { MONGOHQ_URL } from './src/utils/env'; -jest.mock('./src/utils/env', () => { - const createTestConnectionURL = (url: string, dbId: string) => - url.replace(/(.*)(\?.*)/, `$1${dbId}$2`); - // There are other properties, and this type is too narrow, but we're only - // interested in MONGOHQ_URL here. - const actual: { - MONGOHQ_URL: string; - } = jest.requireActual('./src/utils/env'); - return { - ...actual, - MONGOHQ_URL: createTestConnectionURL( - actual.MONGOHQ_URL, - process.env.JEST_WORKER_ID! - ) - }; -}); - type FastifyTestInstance = Awaited>; declare global { diff --git a/api/src/server.test.ts b/api/src/server.test.ts index cbee4ffd4ee..4f977a9cd4c 100644 --- a/api/src/server.test.ts +++ b/api/src/server.test.ts @@ -1,14 +1,6 @@ import { setupServer, superRequest } from '../jest.utils'; import { HOME_LOCATION, COOKIE_DOMAIN } from './utils/env'; -jest.mock('./utils/env', () => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return { - ...jest.requireActual('./utils/env'), - COOKIE_DOMAIN: '.freecodecamp.org' - }; -}); - describe('server', () => { setupServer(); diff --git a/api/src/utils/env.ts b/api/src/utils/env.ts index b971a182c43..58a85429b8e 100644 --- a/api/src/utils/env.ts +++ b/api/src/utils/env.ts @@ -26,6 +26,20 @@ function isAllowedProvider(provider: string): provider is 'ses' | 'nodemailer' { return ['ses', 'nodemailer'].includes(provider); } +function createTestConnectionURL(url: string, dbId?: string) { + assert.notEqual( + process.env.FREECODECAMP_NODE_ENV, + 'production', + "The database URL can't be modified in production." + ); + assert.ok( + dbId, + `dbId is required for test connection URL. Is this running in a test environment? +If so, ensure that the environment variable JEST_WORKER_ID is set.` + ); + return url.replace(/(.*)(\?.*)/, `$1${dbId}$2`); +} + assert.ok(process.env.HOME_LOCATION); assert.ok(process.env.FREECODECAMP_NODE_ENV); assert.ok(isAllowedEnv(process.env.FREECODECAMP_NODE_ENV)); @@ -40,6 +54,7 @@ assert.ok(process.env.FCC_ENABLE_DEV_LOGIN_MODE); assert.ok(process.env.JWT_SECRET); assert.ok(process.env.STRIPE_SECRET_KEY); assert.ok(process.env.SHOW_UPCOMING_CHANGES); +assert.ok(process.env.MONGOHQ_URL); if (process.env.FREECODECAMP_NODE_ENV !== 'development') { assert.ok(process.env.SES_ID); @@ -52,7 +67,6 @@ if (process.env.FREECODECAMP_NODE_ENV !== 'development') { assert.ok(process.env.SES_REGION); assert.ok(process.env.COOKIE_DOMAIN); assert.ok(process.env.PORT); - assert.ok(process.env.MONGOHQ_URL); assert.ok(process.env.SENTRY_DSN); // The following values can exist in development, but production-like // environments need to override the defaults. @@ -84,12 +98,18 @@ if (process.env.FREECODECAMP_NODE_ENV !== 'development') { 'sk_from_stripe_dashboard', 'The Stripe secret should be changed from the default value.' ); + assert.notEqual(process.env.NODE_ENV, 'test'); } export const HOME_LOCATION = process.env.HOME_LOCATION; export const MONGOHQ_URL = - process.env.MONGOHQ_URL ?? - 'mongodb://localhost:27017/freecodecamp?directConnection=true'; + process.env.NODE_ENV === 'test' + ? createTestConnectionURL( + process.env.MONGOHQ_URL, + process.env.JEST_WORKER_ID + ) + : process.env.MONGOHQ_URL; + export const FREECODECAMP_NODE_ENV = process.env.FREECODECAMP_NODE_ENV; export const AUTH0_DOMAIN = process.env.AUTH0_DOMAIN; export const AUTH0_AUDIENCE = process.env.AUTH0_AUDIENCE;