Skip to content

Commit c1c8db0

Browse files
committed
fix(telemetry): keep shared telemetry tests isolated
1 parent 98f5c7f commit c1c8db0

2 files changed

Lines changed: 20 additions & 36 deletions

File tree

src/services/telemetry/telemetry.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,14 @@ function hasConsent(): boolean {
3737
return value;
3838
}
3939

40-
export function __resetTelemetryStateForTesting(): void {
41-
if (process.env.NODE_ENV !== 'test') {
42-
return;
43-
}
40+
export function __resetTelemetryForTests(): void {
4441
client = null;
4542
isShutdown = false;
4643
consentCache = null;
4744
}
4845

46+
export const __resetTelemetryStateForTesting = __resetTelemetryForTests;
47+
4948
function getClient(): PostHog {
5049
if (!client) {
5150
client = new PostHog(getTelemetryApiKey(), {
Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { describe, it, expect, mock, beforeAll, afterAll, beforeEach, afterEach } from 'bun:test';
1+
import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from 'bun:test';
22
import { mkdtempSync, rmSync } from 'fs';
33
import { tmpdir } from 'os';
44
import { join } from 'path';
5+
import { postHogConstructorCalls, postHogCaptureCalls } from '../preload';
56

67
/**
78
* Guards the PostHog client construction options. The posthog-node SDK stamps
@@ -10,25 +11,9 @@ import { join } from 'path';
1011
* mocked so no real client (and no network) is ever created.
1112
*/
1213

13-
type ConstructorCall = { apiKey: string; options: Record<string, unknown> };
14-
const constructorCalls: ConstructorCall[] = [];
15-
const captureCalls: Array<Record<string, unknown>> = [];
16-
17-
mock.module('posthog-node', () => ({
18-
PostHog: class {
19-
constructor(apiKey: string, options: Record<string, unknown>) {
20-
constructorCalls.push({ apiKey, options });
21-
}
22-
capture(payload: Record<string, unknown>): void {
23-
captureCalls.push(payload);
24-
}
25-
async shutdown(): Promise<void> {}
26-
},
27-
}));
28-
2914
const {
3015
captureEvent,
31-
__resetTelemetryStateForTesting,
16+
__resetTelemetryForTests,
3217
} = await import('../../src/services/telemetry/telemetry');
3318

3419
let tempDir: string;
@@ -52,15 +37,15 @@ beforeAll(() => {
5237
});
5338

5439
beforeEach(() => {
55-
constructorCalls.length = 0;
56-
captureCalls.length = 0;
57-
__resetTelemetryStateForTesting();
40+
postHogConstructorCalls.length = 0;
41+
postHogCaptureCalls.length = 0;
42+
__resetTelemetryForTests();
5843
process.env.CLAUDE_MEM_TELEMETRY = '1';
5944
delete process.env.DO_NOT_TRACK;
6045
});
6146

6247
afterEach(() => {
63-
__resetTelemetryStateForTesting();
48+
__resetTelemetryForTests();
6449
});
6550

6651
afterAll(() => {
@@ -75,29 +60,29 @@ describe('PostHog client construction', () => {
7560
it('constructs the client with disableGeoip: false so ingest-side geolocation works', () => {
7661
captureEvent('test_event');
7762

78-
expect(constructorCalls.length).toBe(1);
79-
expect(constructorCalls[0].options.disableGeoip).toBe(false);
63+
expect(postHogConstructorCalls.length).toBe(1);
64+
expect(postHogConstructorCalls[0].options.disableGeoip).toBe(false);
8065
});
8166

8267
it('reuses the client and queues the capture', () => {
8368
captureEvent('test_event_2');
8469

85-
expect(constructorCalls.length).toBe(1);
86-
expect(captureCalls.length).toBe(1);
87-
expect(captureCalls[0].event).toBe('test_event_2');
70+
expect(postHogConstructorCalls.length).toBe(1);
71+
expect(postHogCaptureCalls.length).toBe(1);
72+
expect(postHogCaptureCalls[0].event).toBe('test_event_2');
8873
});
8974

9075
it('re-resolves consent when the env override flips within the cache ttl window', () => {
9176
process.env.CLAUDE_MEM_TELEMETRY = '0';
9277
captureEvent('opted_out_event');
93-
expect(constructorCalls.length).toBe(0);
94-
expect(captureCalls.length).toBe(0);
78+
expect(postHogConstructorCalls.length).toBe(0);
79+
expect(postHogCaptureCalls.length).toBe(0);
9580

9681
process.env.CLAUDE_MEM_TELEMETRY = '1';
9782
captureEvent('opted_in_event');
9883

99-
expect(constructorCalls.length).toBe(1);
100-
expect(captureCalls.length).toBe(1);
101-
expect(captureCalls[0].event).toBe('opted_in_event');
84+
expect(postHogConstructorCalls.length).toBe(1);
85+
expect(postHogCaptureCalls.length).toBe(1);
86+
expect(postHogCaptureCalls[0].event).toBe('opted_in_event');
10287
});
10388
});

0 commit comments

Comments
 (0)