@@ -456,6 +456,48 @@ describe('ClerkProvider native client sync', () => {
456456 expect ( mocks . configure ) . toHaveBeenCalledTimes ( 2 ) ;
457457 } ) ;
458458
459+ test ( 'does not wait for an active native refresh after switching publishable keys' , async ( ) => {
460+ const obsoleteRefresh = rejectableDeferred ( ) ;
461+ const obsoleteRefreshError = new Error ( 'obsolete native refresh failed' ) ;
462+
463+ const { rerender } = render (
464+ < ClerkProvider
465+ publishableKey = 'pk_test_123'
466+ tokenCache = { mocks . tokenCache }
467+ /> ,
468+ ) ;
469+
470+ await waitFor ( ( ) => expect ( mocks . configure ) . toHaveBeenCalledWith ( 'pk_test_123' , null ) ) ;
471+ await waitForPendingJsToNativeSync ( ) ;
472+
473+ mocks . syncClientStateFromJs . mockReturnValueOnce ( obsoleteRefresh . promise ) ;
474+ await act ( async ( ) => {
475+ await mocks . clerkOptions ?. tokenCache ?. saveToken ( CLERK_CLIENT_JWT_KEY , 'obsolete-client-token' ) ;
476+ } ) ;
477+ await waitFor ( ( ) => {
478+ expect ( mocks . syncClientStateFromJs ) . toHaveBeenCalledWith (
479+ 'obsolete-client-token' ,
480+ expect . any ( String ) ,
481+ false ,
482+ true ,
483+ ) ;
484+ } ) ;
485+
486+ rerender (
487+ < ClerkProvider
488+ publishableKey = 'pk_test_456'
489+ tokenCache = { mocks . tokenCache }
490+ /> ,
491+ ) ;
492+
493+ await waitFor ( ( ) => expect ( mocks . configure ) . toHaveBeenCalledWith ( 'pk_test_456' , null ) ) ;
494+ await expect ( waitForPendingJsToNativeSync ( ) ) . resolves . toBeUndefined ( ) ;
495+
496+ obsoleteRefresh . reject ( obsoleteRefreshError ) ;
497+ await Promise . resolve ( ) ;
498+ await expect ( waitForPendingJsToNativeSync ( ) ) . resolves . toBeUndefined ( ) ;
499+ } ) ;
500+
459501 test ( 'retries a transient native configure failure' , async ( ) => {
460502 const consoleError = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => undefined ) ;
461503 const configureError = new Error ( 'transient native refresh failure' ) ;
0 commit comments