@@ -279,62 +279,123 @@ describe('Integration | errorSampleRate', () => {
279
279
// sample rate of 0.0), or an error session that has no errors. Instead we
280
280
// simply stop the session replay completely and wait for a new page load to
281
281
// resample.
282
- it ( 'stops replay if session exceeds MAX_SESSION_LIFE and does not start a new session thereafter' , async ( ) => {
283
- // Idle for 15 minutes
284
- jest . advanceTimersByTime ( MAX_SESSION_LIFE + 1 ) ;
282
+ it . each ( [
283
+ [ 'MAX_SESSION_LIFE' , MAX_SESSION_LIFE ] ,
284
+ [ 'SESSION_IDLE_DURATION' , SESSION_IDLE_DURATION ] ,
285
+ ] ) (
286
+ 'stops replay if session had an error and exceeds %s and does not start a new session thereafter' ,
287
+ async ( _label , waitTime ) => {
288
+ expect ( replay . session ?. shouldRefresh ) . toBe ( true ) ;
289
+
290
+ captureException ( new Error ( 'testing' ) ) ;
291
+
292
+ await new Promise ( process . nextTick ) ;
293
+ jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
294
+ await new Promise ( process . nextTick ) ;
295
+
296
+ // segment_id is 1 because it sends twice on error
297
+ expect ( replay ) . toHaveLastSentReplay ( {
298
+ recordingPayloadHeader : { segment_id : 1 } ,
299
+ replayEventPayload : expect . objectContaining ( {
300
+ replay_type : 'buffer' ,
301
+ } ) ,
302
+ } ) ;
303
+ expect ( replay . session ?. shouldRefresh ) . toBe ( false ) ;
304
+
305
+ // Idle for given time
306
+ jest . advanceTimersByTime ( waitTime + 1 ) ;
307
+ await new Promise ( process . nextTick ) ;
308
+
309
+ const TEST_EVENT = {
310
+ data : { name : 'lost event' } ,
311
+ timestamp : BASE_TIMESTAMP ,
312
+ type : 3 ,
313
+ } ;
314
+ mockRecord . _emitter ( TEST_EVENT ) ;
285
315
286
- const TEST_EVENT = {
287
- data : { name : 'lost event' } ,
288
- timestamp : BASE_TIMESTAMP ,
289
- type : 3 ,
290
- } ;
291
- mockRecord . _emitter ( TEST_EVENT ) ;
292
- expect ( replay ) . not . toHaveLastSentReplay ( ) ;
316
+ jest . runAllTimers ( ) ;
317
+ await new Promise ( process . nextTick ) ;
293
318
294
- jest . runAllTimers ( ) ;
295
- await new Promise ( process . nextTick ) ;
319
+ // We stop recording after 15 minutes of inactivity in error mode
296
320
297
- // We stop recording after 15 minutes of inactivity in error mode
321
+ // still no new replay sent
322
+ expect ( replay ) . toHaveLastSentReplay ( {
323
+ recordingPayloadHeader : { segment_id : 1 } ,
324
+ replayEventPayload : expect . objectContaining ( {
325
+ replay_type : 'buffer' ,
326
+ } ) ,
327
+ } ) ;
298
328
299
- expect ( replay ) . not . toHaveLastSentReplay ( ) ;
300
- expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
301
- expect ( mockRecord . takeFullSnapshot ) . not . toHaveBeenCalled ( ) ;
329
+ expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
302
330
303
- domHandler ( {
304
- name : 'click' ,
305
- } ) ;
331
+ domHandler ( {
332
+ name : 'click' ,
333
+ } ) ;
306
334
307
- // Remains disabled!
308
- expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
309
- } ) ;
335
+ // Remains disabled!
336
+ expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
337
+ } ,
338
+ ) ;
310
339
311
- // Should behave the same as above test
312
- it ( 'stops replay if user has been idle for more than SESSION_IDLE_DURATION and does not start a new session thereafter' , async ( ) => {
313
- // Idle for 15 minutes
314
- jest . advanceTimersByTime ( SESSION_IDLE_DURATION + 1 ) ;
340
+ it . each ( [
341
+ [ 'MAX_SESSION_LIFE' , MAX_SESSION_LIFE ] ,
342
+ [ 'SESSION_IDLE_DURATION' , SESSION_IDLE_DURATION ] ,
343
+ ] ) ( 'continues buffering replay if session had no error and exceeds %s' , async ( _label , waitTime ) => {
344
+ expect ( replay ) . not . toHaveLastSentReplay ( ) ;
345
+
346
+ // Idle for given time
347
+ jest . advanceTimersByTime ( waitTime + 1 ) ;
348
+ await new Promise ( process . nextTick ) ;
315
349
316
350
const TEST_EVENT = {
317
351
data : { name : 'lost event' } ,
318
352
timestamp : BASE_TIMESTAMP ,
319
353
type : 3 ,
320
354
} ;
321
355
mockRecord . _emitter ( TEST_EVENT ) ;
322
- expect ( replay ) . not . toHaveLastSentReplay ( ) ;
323
356
324
357
jest . runAllTimers ( ) ;
325
358
await new Promise ( process . nextTick ) ;
326
359
327
- // We stop recording after SESSION_IDLE_DURATION of inactivity in error mode
360
+ // still no new replay sent
328
361
expect ( replay ) . not . toHaveLastSentReplay ( ) ;
329
- expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
330
- expect ( mockRecord . takeFullSnapshot ) . not . toHaveBeenCalled ( ) ;
362
+
363
+ expect ( replay . isEnabled ( ) ) . toBe ( true ) ;
364
+ expect ( replay . isPaused ( ) ) . toBe ( false ) ;
365
+ expect ( replay . recordingMode ) . toBe ( 'buffer' ) ;
331
366
332
367
domHandler ( {
333
368
name : 'click' ,
334
369
} ) ;
335
370
336
- // Remains disabled!
337
- expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
371
+ await new Promise ( process . nextTick ) ;
372
+ jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
373
+ await new Promise ( process . nextTick ) ;
374
+
375
+ expect ( replay ) . not . toHaveLastSentReplay ( ) ;
376
+ expect ( replay . isEnabled ( ) ) . toBe ( true ) ;
377
+ expect ( replay . isPaused ( ) ) . toBe ( false ) ;
378
+ expect ( replay . recordingMode ) . toBe ( 'buffer' ) ;
379
+
380
+ // should still react to errors later on
381
+ captureException ( new Error ( 'testing' ) ) ;
382
+
383
+ await new Promise ( process . nextTick ) ;
384
+ jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
385
+ await new Promise ( process . nextTick ) ;
386
+
387
+ expect ( replay ) . toHaveLastSentReplay ( {
388
+ recordingPayloadHeader : { segment_id : 0 } ,
389
+ replayEventPayload : expect . objectContaining ( {
390
+ replay_type : 'buffer' ,
391
+ } ) ,
392
+ } ) ;
393
+
394
+ expect ( replay . isEnabled ( ) ) . toBe ( true ) ;
395
+ expect ( replay . isPaused ( ) ) . toBe ( false ) ;
396
+ expect ( replay . recordingMode ) . toBe ( 'session' ) ;
397
+ expect ( replay . session ?. sampled ) . toBe ( 'buffer' ) ;
398
+ expect ( replay . session ?. shouldRefresh ) . toBe ( false ) ;
338
399
} ) ;
339
400
340
401
it ( 'has the correct timestamps with deferred root event and last replay update' , async ( ) => {
0 commit comments