@@ -16,6 +16,8 @@ const MockApiClient = ApiClient as jest.MockedClass<typeof ApiClient>;
16
16
jest . mock ( "../../src/telemetry/eventCache.js" ) ;
17
17
const MockEventCache = EventCache as jest . MockedClass < typeof EventCache > ;
18
18
19
+ const delay = ( ms : number ) => new Promise ( ( resolve ) => setTimeout ( resolve , ms ) ) ;
20
+
19
21
describe ( "Telemetry" , ( ) => {
20
22
const machineId = "test-machine-id" ;
21
23
const hashedMachineId = createHmac ( "sha256" , machineId . toUpperCase ( ) ) . update ( "atlascli" ) . digest ( "hex" ) ;
@@ -24,6 +26,11 @@ describe("Telemetry", () => {
24
26
let mockEventCache : jest . Mocked < EventCache > ;
25
27
let session : Session ;
26
28
let telemetry : Telemetry ;
29
+ let telemetryConfig : {
30
+ eventCache : EventCache ;
31
+ getRawMachineId : ( ) => Promise < string > ;
32
+ getContainerEnv : ( ) => Promise < boolean > ;
33
+ } ;
27
34
28
35
// Helper function to create properly typed test events
29
36
function createTestEvent ( options ?: {
@@ -55,7 +62,7 @@ describe("Telemetry", () => {
55
62
}
56
63
57
64
// Helper function to verify mock calls to reduce duplication
58
- async function verifyMockCalls ( {
65
+ function verifyMockCalls ( {
59
66
sendEventsCalls = 0 ,
60
67
clearEventsCalls = 0 ,
61
68
appendEventsCalls = 0 ,
@@ -77,13 +84,10 @@ describe("Telemetry", () => {
77
84
expect ( appendEvents . length ) . toBe ( appendEventsCalls ) ;
78
85
79
86
if ( sendEventsCalledWith ) {
80
- const commonProps = await telemetry . getCommonProperties ( ) ;
81
-
82
- expect ( sendEvents [ 0 ] ?. [ 0 ] ) . toEqual (
87
+ expect ( sendEvents [ 0 ] ?. [ 0 ] ) . toMatchObject (
83
88
sendEventsCalledWith . map ( ( event ) => ( {
84
89
...event ,
85
90
properties : {
86
- ...commonProps ,
87
91
...event . properties ,
88
92
} ,
89
93
} ) )
@@ -127,11 +131,13 @@ describe("Telemetry", () => {
127
131
setAgentRunner : jest . fn ( ) . mockResolvedValue ( undefined ) ,
128
132
} as unknown as Session ;
129
133
130
- telemetry = Telemetry . create ( session , config , {
134
+ telemetryConfig = {
131
135
eventCache : mockEventCache ,
132
136
getRawMachineId : ( ) => Promise . resolve ( machineId ) ,
133
137
getContainerEnv : ( ) => Promise . resolve ( false ) ,
134
- } ) ;
138
+ } ;
139
+
140
+ telemetry = Telemetry . create ( session , config , telemetryConfig ) ;
135
141
136
142
config . telemetry = "enabled" ;
137
143
} ) ;
@@ -143,7 +149,7 @@ describe("Telemetry", () => {
143
149
144
150
await telemetry . emitEvents ( [ testEvent ] ) ;
145
151
146
- await verifyMockCalls ( {
152
+ verifyMockCalls ( {
147
153
sendEventsCalls : 1 ,
148
154
clearEventsCalls : 1 ,
149
155
sendEventsCalledWith : [ testEvent ] ,
@@ -157,7 +163,7 @@ describe("Telemetry", () => {
157
163
158
164
await telemetry . emitEvents ( [ testEvent ] ) ;
159
165
160
- await verifyMockCalls ( {
166
+ verifyMockCalls ( {
161
167
sendEventsCalls : 1 ,
162
168
appendEventsCalls : 1 ,
163
169
appendEventsCalledWith : [ testEvent ] ,
@@ -180,7 +186,7 @@ describe("Telemetry", () => {
180
186
181
187
await telemetry . emitEvents ( [ newEvent ] ) ;
182
188
183
- await verifyMockCalls ( {
189
+ verifyMockCalls ( {
184
190
sendEventsCalls : 1 ,
185
191
clearEventsCalls : 1 ,
186
192
sendEventsCalledWith : [ cachedEvent , newEvent ] ,
@@ -198,46 +204,57 @@ describe("Telemetry", () => {
198
204
device_id : hashedMachineId ,
199
205
} ;
200
206
201
- const commonProps = await telemetry . getCommonProperties ( ) ;
207
+ const testEvent = createTestEvent ( ) ;
202
208
203
- expect ( commonProps ) . toMatchObject ( expectedProps ) ;
204
- } ) ;
209
+ await telemetry . emitEvents ( [ testEvent ] ) ;
205
210
206
- describe ( "machine ID resolution" , ( ) => {
207
- beforeEach ( ( ) => {
208
- jest . clearAllMocks ( ) ;
209
- jest . useFakeTimers ( ) ;
210
- } ) ;
211
+ const checkEvent = {
212
+ ...testEvent ,
213
+ properties : {
214
+ ...testEvent . properties ,
215
+ ...expectedProps ,
216
+ } ,
217
+ } ;
211
218
212
- afterEach ( ( ) => {
213
- jest . clearAllMocks ( ) ;
214
- jest . useRealTimers ( ) ;
219
+ verifyMockCalls ( {
220
+ sendEventsCalls : 1 ,
221
+ clearEventsCalls : 1 ,
222
+ sendEventsCalledWith : [ checkEvent ] ,
215
223
} ) ;
224
+ } ) ;
216
225
226
+ describe ( "machine ID resolution" , ( ) => {
217
227
it ( "should successfully resolve the machine ID" , async ( ) => {
218
- telemetry = Telemetry . create ( session , config , {
219
- getRawMachineId : ( ) => Promise . resolve ( machineId ) ,
220
- getContainerEnv : ( ) => Promise . resolve ( false ) ,
228
+ const testEvent = createTestEvent ( ) ;
229
+
230
+ await telemetry . emitEvents ( [ testEvent ] ) ;
231
+
232
+ const checkEvent = {
233
+ ...testEvent ,
234
+ properties : {
235
+ ...testEvent . properties ,
236
+ device_id : hashedMachineId ,
237
+ } ,
238
+ } ;
239
+
240
+ verifyMockCalls ( {
241
+ sendEventsCalls : 1 ,
242
+ clearEventsCalls : 1 ,
243
+ sendEventsCalledWith : [ checkEvent ] ,
221
244
} ) ;
222
-
223
- expect ( telemetry . hasPendingPromises ( ) ) . toBe ( true ) ;
224
- const commonProps = await telemetry . getCommonProperties ( ) ;
225
- expect ( telemetry . hasPendingPromises ( ) ) . toBe ( false ) ;
226
- expect ( commonProps . device_id ) . toBe ( hashedMachineId ) ;
227
245
} ) ;
228
246
229
247
it ( "should handle machine ID resolution failure" , async ( ) => {
230
248
const loggerSpy = jest . spyOn ( logger , "debug" ) ;
231
249
232
250
telemetry = Telemetry . create ( session , config , {
251
+ ...telemetryConfig ,
233
252
getRawMachineId : ( ) => Promise . reject ( new Error ( "Failed to get device ID" ) ) ,
234
- getContainerEnv : ( ) => Promise . resolve ( false ) ,
235
253
} ) ;
236
254
237
- expect ( telemetry . hasPendingPromises ( ) ) . toBe ( true ) ;
238
- const commonProps = await telemetry . getCommonProperties ( ) ;
239
- expect ( telemetry . hasPendingPromises ( ) ) . toBe ( false ) ;
240
- expect ( commonProps . device_id ) . toBe ( "unknown" ) ;
255
+ const testEvent = createTestEvent ( ) ;
256
+
257
+ await telemetry . emitEvents ( [ testEvent ] ) ;
241
258
242
259
expect ( loggerSpy ) . toHaveBeenCalledWith (
243
260
LogId . telemetryDeviceIdFailure ,
@@ -247,17 +264,19 @@ describe("Telemetry", () => {
247
264
} ) ;
248
265
249
266
it ( "should timeout if machine ID resolution takes too long" , async ( ) => {
250
- const DEVICE_ID_TIMEOUT = 3000 ;
251
267
const loggerSpy = jest . spyOn ( logger , "debug" ) ;
252
268
253
269
telemetry = Telemetry . create ( session , config , {
254
- getRawMachineId : ( ) => new Promise ( ( ) => { } ) ,
255
- getContainerEnv : ( ) => Promise . resolve ( false ) ,
270
+ ... telemetryConfig ,
271
+ getRawMachineId : ( ) => new Promise ( ( ) => { } ) , // Never resolves
256
272
} ) ;
257
- expect ( telemetry . hasPendingPromises ( ) ) . toBe ( true ) ;
258
- jest . advanceTimersByTime ( DEVICE_ID_TIMEOUT ) ;
259
- const commonProps = await telemetry . getCommonProperties ( ) ;
260
- expect ( commonProps . device_id ) . toBe ( "unknown" ) ;
273
+
274
+ const testEvent = createTestEvent ( ) ;
275
+
276
+ await telemetry . emitEvents ( [ testEvent ] ) ;
277
+
278
+ await delay ( 5000 ) ; // Wait for timeout
279
+
261
280
expect ( loggerSpy ) . toHaveBeenCalledWith (
262
281
LogId . telemetryDeviceIdTimeout ,
263
282
"telemetry" ,
@@ -281,7 +300,9 @@ describe("Telemetry", () => {
281
300
282
301
await telemetry . emitEvents ( [ testEvent ] ) ;
283
302
284
- await verifyMockCalls ( ) ;
303
+ verifyMockCalls ( {
304
+ sendEventsCalls : 0 ,
305
+ } ) ;
285
306
} ) ;
286
307
} ) ;
287
308
@@ -306,7 +327,9 @@ describe("Telemetry", () => {
306
327
307
328
await telemetry . emitEvents ( [ testEvent ] ) ;
308
329
309
- await verifyMockCalls ( ) ;
330
+ verifyMockCalls ( {
331
+ sendEventsCalls : 0 ,
332
+ } ) ;
310
333
} ) ;
311
334
} ) ;
312
335
} ) ;
0 commit comments