From f512f0cd56ff4d2f2e13a8fb0fcbf339f4009940 Mon Sep 17 00:00:00 2001 From: Tihomir Culig Date: Fri, 31 Oct 2025 15:30:59 +0100 Subject: [PATCH 1/3] chore: update telemetry test not to fail without key VSCODE-517 --- .../suite/telemetry/telemetryService.test.ts | 69 ++++++++++++++----- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/src/test/suite/telemetry/telemetryService.test.ts b/src/test/suite/telemetry/telemetryService.test.ts index 3cc74aa29..3e0dd5cab 100644 --- a/src/test/suite/telemetry/telemetryService.test.ts +++ b/src/test/suite/telemetry/telemetryService.test.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; import path from 'path'; -import { afterEach, beforeEach } from 'mocha'; +import { afterEach, beforeEach, before, after } from 'mocha'; import chai from 'chai'; import type { DataService } from 'mongodb-data-service'; import { config } from 'dotenv'; @@ -52,6 +52,32 @@ suite('Telemetry Controller Test Suite', () => { }; const sandbox = sinon.createSandbox(); + let originalRequireFunction: any; + + before(function () { + if (!process.env.SEGMENT_KEY) { + process.env.SEGMENT_KEY = 'test-segment-key'; + } + + // eslint-disable-next-line @typescript-eslint/no-var-requires + const Module = require('module'); + const originalRequire = Module.prototype.require; + Module.prototype.require = function (id: string, ...args: any[]): any { + if (id === '../../../../constants') { + return { segmentKey: process.env.SEGMENT_KEY }; + } + return originalRequire.apply(this, [id, ...args]); + }; + + // Store the original require for restoration + originalRequireFunction = originalRequire; + }); + + after(function () { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const Module = require('module'); + Module.prototype.require = originalRequireFunction; + }); beforeEach(() => { const instanceStub = sandbox.stub(); @@ -111,6 +137,14 @@ suite('Telemetry Controller Test Suite', () => { '_isTelemetryFeatureEnabled', sandbox.fake.returns(true), ); + + // Mock readSegmentKey to return a fake key for local testing + sandbox.replace( + testTelemetryService, + // @ts-expect-error This is a private method + 'readSegmentKey', + sandbox.fake.resolves('fake-segment-key-for-testing'), + ); }); afterEach(() => { @@ -118,26 +152,26 @@ suite('Telemetry Controller Test Suite', () => { sandbox.restore(); }); - test('get segment key', () => { - let segmentKey: string | undefined; - - try { - const segmentKeyFileLocation = '../../../../constants'; - // eslint-disable-next-line @typescript-eslint/no-var-requires - segmentKey = require(segmentKeyFileLocation)?.segmentKey; - } catch (error) { - expect(error).to.be.undefined; - } - - expect(segmentKey).to.be.equal(process.env.SEGMENT_KEY); - expect(testTelemetryService._segmentKey).to.be.a('string'); - }); - suite('after setup is complete', () => { beforeEach(async () => { await testTelemetryService.activateSegmentAnalytics(); }); + test('get segment key', () => { + let segmentKey: string | undefined; + + try { + const segmentKeyFileLocation = '../../../../constants'; + // eslint-disable-next-line @typescript-eslint/no-var-requires + segmentKey = require(segmentKeyFileLocation)?.segmentKey; + } catch (error) { + expect(error).to.be.undefined; + } + + expect(segmentKey).to.be.equal(process.env.SEGMENT_KEY); + expect(testTelemetryService._segmentKey).to.be.a('string'); + }); + test('track command run event', async () => { await vscode.commands.executeCommand('mdb.addConnection'); sandbox.assert.calledWith( @@ -670,6 +704,9 @@ suite('Telemetry Controller Test Suite', () => { test('trackTreeViewActivated throttles invocations', async function () { this.timeout(6000); + await testTelemetryService.activateSegmentAnalytics(); + fakeSegmentAnalyticsTrack.resetHistory(); + const verifyEvent = (call: sinon.SinonSpyCall): void => { const event = call.args[0] as SegmentProperties; expect(event.event).to.equal('Side Panel Opened'); From 26b653c994b8e68b9f521b4d2a6d35c8198566c1 Mon Sep 17 00:00:00 2001 From: Tihomir Culig Date: Thu, 6 Nov 2025 12:32:05 +0100 Subject: [PATCH 2/3] Use a lighter-handed approach --- package.json | 2 +- src/test/suite/index.ts | 4 ++ .../suite/telemetry/telemetryService.test.ts | 69 +++++-------------- 3 files changed, 21 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 8613efaf6..ac3efaa2d 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "watch": "npm run compile && npm-run-all -p watch:*", "watch:extension": "npm run compile:extension -- -watch", "watch:extension-bundles": "webpack --mode development --watch", - "pretest": "npm run compile", + "pretest": "cross-env SEGMENT_KEY=test-segment-key npm run compile", "test": "npm run test-webview && npm run test-extension", "test-extension": "cross-env NODE_OPTIONS=--no-force-async-hooks-checks xvfb-maybe node ./out/test/runTest.js", "test-webview": "mocha -r ts-node/register --grep=\"${MOCHA_GREP}\" --file ./src/test/setup-webview.ts src/test/suite/views/webview-app/**/*.test.tsx", diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index 35b007469..e3bbec7dd 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -7,6 +7,10 @@ import MDBExtensionController from '../../mdbExtensionController'; import { ExtensionContextStub } from './stubs'; import { mdbTestExtension } from './stubbableMdbExtension'; +if (!process.env.SEGMENT_KEY) { + process.env.SEGMENT_KEY = 'test-segment-key'; +} + export async function run(): Promise { const reporterOptions = { spec: '-', diff --git a/src/test/suite/telemetry/telemetryService.test.ts b/src/test/suite/telemetry/telemetryService.test.ts index 3e0dd5cab..3cc74aa29 100644 --- a/src/test/suite/telemetry/telemetryService.test.ts +++ b/src/test/suite/telemetry/telemetryService.test.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; import path from 'path'; -import { afterEach, beforeEach, before, after } from 'mocha'; +import { afterEach, beforeEach } from 'mocha'; import chai from 'chai'; import type { DataService } from 'mongodb-data-service'; import { config } from 'dotenv'; @@ -52,32 +52,6 @@ suite('Telemetry Controller Test Suite', () => { }; const sandbox = sinon.createSandbox(); - let originalRequireFunction: any; - - before(function () { - if (!process.env.SEGMENT_KEY) { - process.env.SEGMENT_KEY = 'test-segment-key'; - } - - // eslint-disable-next-line @typescript-eslint/no-var-requires - const Module = require('module'); - const originalRequire = Module.prototype.require; - Module.prototype.require = function (id: string, ...args: any[]): any { - if (id === '../../../../constants') { - return { segmentKey: process.env.SEGMENT_KEY }; - } - return originalRequire.apply(this, [id, ...args]); - }; - - // Store the original require for restoration - originalRequireFunction = originalRequire; - }); - - after(function () { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const Module = require('module'); - Module.prototype.require = originalRequireFunction; - }); beforeEach(() => { const instanceStub = sandbox.stub(); @@ -137,14 +111,6 @@ suite('Telemetry Controller Test Suite', () => { '_isTelemetryFeatureEnabled', sandbox.fake.returns(true), ); - - // Mock readSegmentKey to return a fake key for local testing - sandbox.replace( - testTelemetryService, - // @ts-expect-error This is a private method - 'readSegmentKey', - sandbox.fake.resolves('fake-segment-key-for-testing'), - ); }); afterEach(() => { @@ -152,24 +118,24 @@ suite('Telemetry Controller Test Suite', () => { sandbox.restore(); }); - suite('after setup is complete', () => { - beforeEach(async () => { - await testTelemetryService.activateSegmentAnalytics(); - }); + test('get segment key', () => { + let segmentKey: string | undefined; - test('get segment key', () => { - let segmentKey: string | undefined; + try { + const segmentKeyFileLocation = '../../../../constants'; + // eslint-disable-next-line @typescript-eslint/no-var-requires + segmentKey = require(segmentKeyFileLocation)?.segmentKey; + } catch (error) { + expect(error).to.be.undefined; + } - try { - const segmentKeyFileLocation = '../../../../constants'; - // eslint-disable-next-line @typescript-eslint/no-var-requires - segmentKey = require(segmentKeyFileLocation)?.segmentKey; - } catch (error) { - expect(error).to.be.undefined; - } + expect(segmentKey).to.be.equal(process.env.SEGMENT_KEY); + expect(testTelemetryService._segmentKey).to.be.a('string'); + }); - expect(segmentKey).to.be.equal(process.env.SEGMENT_KEY); - expect(testTelemetryService._segmentKey).to.be.a('string'); + suite('after setup is complete', () => { + beforeEach(async () => { + await testTelemetryService.activateSegmentAnalytics(); }); test('track command run event', async () => { @@ -704,9 +670,6 @@ suite('Telemetry Controller Test Suite', () => { test('trackTreeViewActivated throttles invocations', async function () { this.timeout(6000); - await testTelemetryService.activateSegmentAnalytics(); - fakeSegmentAnalyticsTrack.resetHistory(); - const verifyEvent = (call: sinon.SinonSpyCall): void => { const event = call.args[0] as SegmentProperties; expect(event.event).to.equal('Side Panel Opened'); From c225410d17de81605949929a95ac3990b9ca6803 Mon Sep 17 00:00:00 2001 From: Tihomir Culig Date: Thu, 6 Nov 2025 14:23:39 +0100 Subject: [PATCH 3/3] fix CI test fail --- package.json | 2 +- scripts/generate-constants.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ac3efaa2d..8613efaf6 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "watch": "npm run compile && npm-run-all -p watch:*", "watch:extension": "npm run compile:extension -- -watch", "watch:extension-bundles": "webpack --mode development --watch", - "pretest": "cross-env SEGMENT_KEY=test-segment-key npm run compile", + "pretest": "npm run compile", "test": "npm run test-webview && npm run test-extension", "test-extension": "cross-env NODE_OPTIONS=--no-force-async-hooks-checks xvfb-maybe node ./out/test/runTest.js", "test-webview": "mocha -r ts-node/register --grep=\"${MOCHA_GREP}\" --file ./src/test/setup-webview.ts src/test/suite/views/webview-app/**/*.test.tsx", diff --git a/scripts/generate-constants.ts b/scripts/generate-constants.ts index 6004adb6f..4da51b7dc 100644 --- a/scripts/generate-constants.ts +++ b/scripts/generate-constants.ts @@ -13,10 +13,12 @@ const ui = ora('Generate constants file').start(); config({ path: resolve(__dirname, '../.env') }); +const segmentKey = process.env.SEGMENT_KEY || 'test-segment-key'; + (async () => { await writeFile( `${ROOT_DIR}/constants.json`, - JSON.stringify({ segmentKey: process.env.SEGMENT_KEY }, null, 2), + JSON.stringify({ segmentKey }, null, 2), ); ui.succeed('The constants file has been generated'); })().catch((error) => {