@@ -2543,4 +2543,68 @@ describe('Clerk singleton', () => {
2543
2543
} ) ;
2544
2544
} ) ;
2545
2545
} ) ;
2546
+
2547
+ describe ( 'updateClient' , ( ) => {
2548
+ afterEach ( ( ) => {
2549
+ // cleanup global window pollution
2550
+ ( window as any ) . __unstable__onBeforeSetActive = null ;
2551
+ ( window as any ) . __unstable__onAfterSetActive = null ;
2552
+ } ) ;
2553
+
2554
+ it ( 'runs server revalidation hooks when session transitions from `active` to `pending`' , async ( ) => {
2555
+ const mockOnBeforeSetActive = jest . fn ( ) . mockReturnValue ( Promise . resolve ( ) ) ;
2556
+ const mockOnAfterSetActive = jest . fn ( ) . mockReturnValue ( Promise . resolve ( ) ) ;
2557
+ ( window as any ) . __unstable__onBeforeSetActive = mockOnBeforeSetActive ;
2558
+ ( window as any ) . __unstable__onAfterSetActive = mockOnAfterSetActive ;
2559
+
2560
+ const mockActiveSession = {
2561
+ id : 'session_1' ,
2562
+ status : 'active' ,
2563
+ user : { id : 'user_1' } ,
2564
+ lastActiveToken : { getRawString : ( ) => 'token_1' } ,
2565
+ } ;
2566
+
2567
+ const mockPendingSession = {
2568
+ id : 'session_1' ,
2569
+ status : 'pending' ,
2570
+ user : { id : 'user_1' } ,
2571
+ lastActiveToken : { getRawString : ( ) => 'token_1' } ,
2572
+ } ;
2573
+
2574
+ const mockInitialClient = {
2575
+ sessions : [ mockActiveSession ] ,
2576
+ signedInSessions : [ mockActiveSession ] ,
2577
+ lastActiveSessionId : 'session_1' ,
2578
+ } ;
2579
+
2580
+ const mockUpdatedClient = {
2581
+ sessions : [ mockPendingSession ] ,
2582
+ signedInSessions : [ mockPendingSession ] ,
2583
+ lastActiveSessionId : 'session_1' ,
2584
+ } ;
2585
+
2586
+ const sut = new Clerk ( productionPublishableKey ) ;
2587
+
2588
+ // Manually set the initial client and session state to simulate active session
2589
+ // without going through load() or setActive()
2590
+ sut . updateClient ( mockInitialClient as any ) ;
2591
+
2592
+ // Verify we start with an active session
2593
+ expect ( sut . session ?. status ) . toBe ( 'active' ) ;
2594
+
2595
+ // Call updateClient with the new client that has pending session
2596
+ sut . updateClient ( mockUpdatedClient as any ) ;
2597
+
2598
+ // Verify hooks were called
2599
+ await waitFor ( ( ) => {
2600
+ expect ( mockOnBeforeSetActive ) . toHaveBeenCalledTimes ( 1 ) ;
2601
+ expect ( mockOnAfterSetActive ) . toHaveBeenCalledTimes ( 1 ) ;
2602
+ } ) ;
2603
+
2604
+ // Verify that onAfterSetActive was called after onBeforeSetActive
2605
+ const beforeCallTime = mockOnBeforeSetActive . mock . invocationCallOrder [ 0 ] ;
2606
+ const afterCallTime = mockOnAfterSetActive . mock . invocationCallOrder [ 0 ] ;
2607
+ expect ( afterCallTime ) . toBeGreaterThan ( beforeCallTime ) ;
2608
+ } ) ;
2609
+ } ) ;
2546
2610
} ) ;
0 commit comments