|
1 | 1 | import { test, expect } from "bun:test"; |
2 | 2 | import { createTelemetryToggleHandler, type TelemetryToggleDeps } from "../../src/telemetry/toggle.js"; |
3 | | -import { createTelemetry } from "../../src/telemetry/index.js"; |
| 3 | +import { createTelemetry, getSessionId } from "../../src/telemetry/index.js"; |
4 | 4 | import type { Settings } from "../../src/config/settings.js"; |
5 | 5 | import type { Telemetry } from "../../src/telemetry/index.js"; |
6 | 6 |
|
@@ -178,3 +178,39 @@ test("toggle on re-enables after settings load/save resolve", async () => { |
178 | 178 | expect(saved?.telemetry?.enabled).toBe(true); |
179 | 179 | expect(getInstance().enabled).toBe(true); |
180 | 180 | }); |
| 181 | + |
| 182 | +test("session_id on captured payloads stays constant across an enable/disable/enable toggle cycle", async () => { |
| 183 | + const capturedBodies: { properties: Record<string, unknown> }[] = []; |
| 184 | + const fetchFn = ((_url: string, init: RequestInit) => { |
| 185 | + capturedBodies.push(JSON.parse(init.body as string)); |
| 186 | + return Promise.resolve(new Response("1", { status: 200 })); |
| 187 | + }) as unknown as typeof fetch; |
| 188 | + const { deps, getInstance } = fakeDeps({ |
| 189 | + createTelemetry: (opts) => |
| 190 | + createTelemetry({ ...opts, env: opts.env ?? {}, apiKey: opts.apiKey ?? "test-key", fetchFn }), |
| 191 | + }); |
| 192 | + const handler = createTelemetryToggleHandler("/fake/path", deps); |
| 193 | + |
| 194 | + // Re-enable once up front so the captured instance is one built through |
| 195 | + // deps.createTelemetry (and thus fetchFn) rather than fakeDeps' bootstrap |
| 196 | + // instance, which is wired to its own separate fetch counter. |
| 197 | + handler(true); |
| 198 | + await new Promise((resolve) => setTimeout(resolve, 10)); |
| 199 | + getInstance().capture("cli_start"); |
| 200 | + |
| 201 | + handler(false); |
| 202 | + await new Promise((resolve) => setTimeout(resolve, 10)); |
| 203 | + getInstance().capture("cli_start"); // disabled: no fetch, but proves the swapped instance is live |
| 204 | + |
| 205 | + handler(true); |
| 206 | + await new Promise((resolve) => setTimeout(resolve, 10)); |
| 207 | + getInstance().capture("cli_start"); |
| 208 | + |
| 209 | + await new Promise((resolve) => setTimeout(resolve, 0)); |
| 210 | + expect(capturedBodies.length).toBe(2); |
| 211 | + const sessionId = capturedBodies[0].properties.session_id; |
| 212 | + expect(typeof sessionId).toBe("string"); |
| 213 | + expect((sessionId as string).length).toBeGreaterThan(0); |
| 214 | + expect(capturedBodies[1].properties.session_id).toBe(sessionId); |
| 215 | + expect(sessionId).toBe(getSessionId()); |
| 216 | +}); |
0 commit comments