@@ -432,6 +432,9 @@ describe('Integration | errorSampleRate', () => {
432
432
[ 'MAX_SESSION_LIFE' , MAX_SESSION_LIFE ] ,
433
433
[ 'SESSION_IDLE_EXPIRE_DURATION' , SESSION_IDLE_EXPIRE_DURATION ] ,
434
434
] ) ( 'continues buffering replay if session had no error and exceeds %s' , async ( _label , waitTime ) => {
435
+ const oldSessionId = replay . session ?. id ;
436
+ expect ( oldSessionId ) . toBeDefined ( ) ;
437
+
435
438
expect ( replay ) . not . toHaveLastSentReplay ( ) ;
436
439
437
440
// Idle for given time
@@ -475,13 +478,24 @@ describe('Integration | errorSampleRate', () => {
475
478
jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
476
479
await new Promise ( process . nextTick ) ;
477
480
478
- expect ( replay ) . toHaveLastSentReplay ( {
481
+ expect ( replay . session ?. id ) . toBe ( oldSessionId )
482
+
483
+ // Flush of buffered events
484
+ expect ( replay ) . toHaveSentReplay ( {
479
485
recordingPayloadHeader : { segment_id : 0 } ,
480
486
replayEventPayload : expect . objectContaining ( {
481
487
replay_type : 'buffer' ,
482
488
} ) ,
483
489
} ) ;
484
490
491
+ // Checkout from `startRecording`
492
+ expect ( replay ) . toHaveLastSentReplay ( {
493
+ recordingPayloadHeader : { segment_id : 1 } ,
494
+ replayEventPayload : expect . objectContaining ( {
495
+ replay_type : 'buffer' ,
496
+ } ) ,
497
+ } ) ;
498
+
485
499
expect ( replay . isEnabled ( ) ) . toBe ( true ) ;
486
500
expect ( replay . isPaused ( ) ) . toBe ( false ) ;
487
501
expect ( replay . recordingMode ) . toBe ( 'session' ) ;
@@ -491,6 +505,9 @@ describe('Integration | errorSampleRate', () => {
491
505
492
506
// Should behave the same as above test
493
507
it ( 'stops replay if user has been idle for more than SESSION_IDLE_EXPIRE_DURATION and does not start a new session thereafter' , async ( ) => {
508
+ const oldSessionId = replay . session ?. id ;
509
+ expect ( oldSessionId ) . toBeDefined ( ) ;
510
+
494
511
// Idle for 15 minutes
495
512
jest . advanceTimersByTime ( SESSION_IDLE_EXPIRE_DURATION + 1 ) ;
496
513
@@ -517,14 +534,24 @@ describe('Integration | errorSampleRate', () => {
517
534
await new Promise ( process . nextTick ) ;
518
535
jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
519
536
await new Promise ( process . nextTick ) ;
537
+ expect ( replay . session ?. id ) . toBe ( oldSessionId ) ;
520
538
521
- expect ( replay ) . toHaveLastSentReplay ( {
539
+ // buffered events
540
+ expect ( replay ) . toHaveSentReplay ( {
522
541
recordingPayloadHeader : { segment_id : 0 } ,
523
542
replayEventPayload : expect . objectContaining ( {
524
543
replay_type : 'buffer' ,
525
544
} ) ,
526
545
} ) ;
527
546
547
+ // `startRecording` full checkout
548
+ expect ( replay ) . toHaveLastSentReplay ( {
549
+ recordingPayloadHeader : { segment_id : 1 } ,
550
+ replayEventPayload : expect . objectContaining ( {
551
+ replay_type : 'buffer' ,
552
+ } ) ,
553
+ } ) ;
554
+
528
555
expect ( replay . isEnabled ( ) ) . toBe ( true ) ;
529
556
expect ( replay . isPaused ( ) ) . toBe ( false ) ;
530
557
expect ( replay . recordingMode ) . toBe ( 'session' ) ;
@@ -605,7 +632,7 @@ describe('Integration | errorSampleRate', () => {
605
632
jest . advanceTimersByTime ( 20 ) ;
606
633
await new Promise ( process . nextTick ) ;
607
634
608
- expect ( replay . session ?. started ) . toBe ( BASE_TIMESTAMP + ELAPSED + 20 ) ;
635
+ expect ( replay . session ?. started ) . toBe ( BASE_TIMESTAMP + ELAPSED + 100 ) ;
609
636
610
637
// Does not capture mouse click
611
638
expect ( replay ) . toHaveSentReplay ( {
@@ -667,7 +694,8 @@ describe('Integration | errorSampleRate', () => {
667
694
expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
668
695
} ) ;
669
696
670
- it ( 'stops replay when session exceeds max length' , async ( ) => {
697
+ it ( 'stops replay when session exceeds max length after latest captured error' , async ( ) => {
698
+ const sessionId = replay . session ?. id ;
671
699
jest . setSystemTime ( BASE_TIMESTAMP ) ;
672
700
673
701
const TEST_EVENT = { data : { } , timestamp : BASE_TIMESTAMP , type : 3 } ;
@@ -679,37 +707,40 @@ describe('Integration | errorSampleRate', () => {
679
707
jest . runAllTimers ( ) ;
680
708
await new Promise ( process . nextTick ) ;
681
709
710
+ jest . advanceTimersByTime ( 2 * MAX_SESSION_LIFE ) ;
711
+
682
712
captureException ( new Error ( 'testing' ) ) ;
683
713
684
- jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
714
+ // Flush due to exception
685
715
await new Promise ( process . nextTick ) ;
686
- expect ( replay ) . not . toHaveLastSentReplay ( ) ;
687
-
688
- // Wait a bit, shortly before session expires
689
- jest . advanceTimersByTime ( MAX_SESSION_LIFE - 1000 ) ;
716
+ jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
690
717
await new Promise ( process . nextTick ) ;
691
-
692
- mockRecord . _emitter ( TEST_EVENT ) ;
693
- replay . triggerUserActivity ( ) ;
694
-
718
+ expect ( replay . session ?. id ) . toBe ( sessionId ) ;
695
719
expect ( replay ) . toHaveLastSentReplay ( ) ;
696
720
697
- // Now wait after session expires - should stop recording
721
+ // Now wait after session expires - should re-start into buffering mode
698
722
mockRecord . takeFullSnapshot . mockClear ( ) ;
699
723
( getCurrentHub ( ) . getClient ( ) ! . getTransport ( ) ! . send as unknown as jest . SpyInstance < any > ) . mockClear ( ) ;
700
724
701
- jest . advanceTimersByTime ( 10_000 ) ;
725
+ jest . advanceTimersByTime ( MAX_SESSION_LIFE ) ;
702
726
await new Promise ( process . nextTick ) ;
703
727
704
728
mockRecord . _emitter ( TEST_EVENT ) ;
705
- replay . triggerUserActivity ( ) ;
706
-
707
- jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
729
+ jest . runAllTimers ( ) ;
708
730
await new Promise ( process . nextTick ) ;
709
731
710
732
expect ( replay ) . not . toHaveLastSentReplay ( ) ;
711
733
expect ( mockRecord . takeFullSnapshot ) . toHaveBeenCalledTimes ( 0 ) ;
712
734
expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
735
+
736
+ // Once the session is stopped after capturing a replay already
737
+ // (buffer-mode), another error should trigger a new replay
738
+ captureException ( new Error ( 'testing' ) ) ;
739
+
740
+ await new Promise ( process . nextTick ) ;
741
+ jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
742
+ await new Promise ( process . nextTick ) ;
743
+ expect ( replay ) . not . toHaveLastSentReplay ( ) ;
713
744
} ) ;
714
745
} ) ;
715
746
0 commit comments