@@ -432,6 +432,9 @@ describe('Integration | errorSampleRate', () => {
432432 [ 'MAX_SESSION_LIFE' , MAX_SESSION_LIFE ] ,
433433 [ 'SESSION_IDLE_EXPIRE_DURATION' , SESSION_IDLE_EXPIRE_DURATION ] ,
434434 ] ) ( '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+
435438 expect ( replay ) . not . toHaveLastSentReplay ( ) ;
436439
437440 // Idle for given time
@@ -475,13 +478,24 @@ describe('Integration | errorSampleRate', () => {
475478 jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
476479 await new Promise ( process . nextTick ) ;
477480
478- expect ( replay ) . toHaveLastSentReplay ( {
481+ expect ( replay . session ?. id ) . toBe ( oldSessionId ) ;
482+
483+ // Flush of buffered events
484+ expect ( replay ) . toHaveSentReplay ( {
479485 recordingPayloadHeader : { segment_id : 0 } ,
480486 replayEventPayload : expect . objectContaining ( {
481487 replay_type : 'buffer' ,
482488 } ) ,
483489 } ) ;
484490
491+ // Checkout from `startRecording`
492+ expect ( replay ) . toHaveLastSentReplay ( {
493+ recordingPayloadHeader : { segment_id : 1 } ,
494+ replayEventPayload : expect . objectContaining ( {
495+ replay_type : 'buffer' ,
496+ } ) ,
497+ } ) ;
498+
485499 expect ( replay . isEnabled ( ) ) . toBe ( true ) ;
486500 expect ( replay . isPaused ( ) ) . toBe ( false ) ;
487501 expect ( replay . recordingMode ) . toBe ( 'session' ) ;
@@ -491,6 +505,9 @@ describe('Integration | errorSampleRate', () => {
491505
492506 // Should behave the same as above test
493507 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+
494511 // Idle for 15 minutes
495512 jest . advanceTimersByTime ( SESSION_IDLE_EXPIRE_DURATION + 1 ) ;
496513
@@ -517,14 +534,24 @@ describe('Integration | errorSampleRate', () => {
517534 await new Promise ( process . nextTick ) ;
518535 jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
519536 await new Promise ( process . nextTick ) ;
537+ expect ( replay . session ?. id ) . toBe ( oldSessionId ) ;
520538
521- expect ( replay ) . toHaveLastSentReplay ( {
539+ // buffered events
540+ expect ( replay ) . toHaveSentReplay ( {
522541 recordingPayloadHeader : { segment_id : 0 } ,
523542 replayEventPayload : expect . objectContaining ( {
524543 replay_type : 'buffer' ,
525544 } ) ,
526545 } ) ;
527546
547+ // `startRecording` full checkout
548+ expect ( replay ) . toHaveLastSentReplay ( {
549+ recordingPayloadHeader : { segment_id : 1 } ,
550+ replayEventPayload : expect . objectContaining ( {
551+ replay_type : 'buffer' ,
552+ } ) ,
553+ } ) ;
554+
528555 expect ( replay . isEnabled ( ) ) . toBe ( true ) ;
529556 expect ( replay . isPaused ( ) ) . toBe ( false ) ;
530557 expect ( replay . recordingMode ) . toBe ( 'session' ) ;
@@ -605,7 +632,7 @@ describe('Integration | errorSampleRate', () => {
605632 jest . advanceTimersByTime ( 20 ) ;
606633 await new Promise ( process . nextTick ) ;
607634
608- expect ( replay . session ?. started ) . toBe ( BASE_TIMESTAMP + ELAPSED + 20 ) ;
635+ expect ( replay . session ?. started ) . toBe ( BASE_TIMESTAMP + ELAPSED + 100 ) ;
609636
610637 // Does not capture mouse click
611638 expect ( replay ) . toHaveSentReplay ( {
@@ -667,7 +694,8 @@ describe('Integration | errorSampleRate', () => {
667694 expect ( replay . isEnabled ( ) ) . toBe ( false ) ;
668695 } ) ;
669696
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 ;
671699 jest . setSystemTime ( BASE_TIMESTAMP ) ;
672700
673701 const TEST_EVENT = { data : { } , timestamp : BASE_TIMESTAMP , type : 3 } ;
@@ -679,37 +707,40 @@ describe('Integration | errorSampleRate', () => {
679707 jest . runAllTimers ( ) ;
680708 await new Promise ( process . nextTick ) ;
681709
710+ jest . advanceTimersByTime ( 2 * MAX_SESSION_LIFE ) ;
711+
682712 captureException ( new Error ( 'testing' ) ) ;
683713
684- jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
714+ // Flush due to exception
685715 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 ) ;
690717 await new Promise ( process . nextTick ) ;
691-
692- mockRecord . _emitter ( TEST_EVENT ) ;
693- replay . triggerUserActivity ( ) ;
694-
718+ expect ( replay . session ?. id ) . toBe ( sessionId ) ;
695719 expect ( replay ) . toHaveLastSentReplay ( ) ;
696720
697- // Now wait after session expires - should stop recording
721+ // Now wait after session expires - should re-start into buffering mode
698722 mockRecord . takeFullSnapshot . mockClear ( ) ;
699723 ( getCurrentHub ( ) . getClient ( ) ! . getTransport ( ) ! . send as unknown as jest . SpyInstance < any > ) . mockClear ( ) ;
700724
701- jest . advanceTimersByTime ( 10_000 ) ;
725+ jest . advanceTimersByTime ( MAX_SESSION_LIFE ) ;
702726 await new Promise ( process . nextTick ) ;
703727
704728 mockRecord . _emitter ( TEST_EVENT ) ;
705- replay . triggerUserActivity ( ) ;
706-
707- jest . advanceTimersByTime ( DEFAULT_FLUSH_MIN_DELAY ) ;
729+ jest . runAllTimers ( ) ;
708730 await new Promise ( process . nextTick ) ;
709731
710732 expect ( replay ) . not . toHaveLastSentReplay ( ) ;
711733 expect ( mockRecord . takeFullSnapshot ) . toHaveBeenCalledTimes ( 0 ) ;
712734 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 ( ) ;
713744 } ) ;
714745} ) ;
715746
0 commit comments