@@ -705,4 +705,80 @@ describe('createClerkBridge', () => {
705705 await expect ( openPromise ) . resolves . toEqual ( { callbackUrl : 'my-app://renderer/?code=123' } ) ;
706706 expect ( rendererWindow . focus ) . not . toHaveBeenCalled ( ) ;
707707 } ) ;
708+
709+ it ( 'replaces a pending OAuth flow when a new one starts' , async ( ) => {
710+ vi . mocked ( shell . openExternal ) . mockResolvedValue ( undefined ) ;
711+ createClerkBridge ( {
712+ storage,
713+ renderer : {
714+ host : 'renderer' ,
715+ scheme : 'my-app' ,
716+ } ,
717+ } ) ;
718+
719+ const openHandler = vi . mocked ( ipcMain . handle ) . mock . calls . find ( ( [ channel ] ) => {
720+ return channel === OAUTH_TRANSPORT_CHANNELS . open ;
721+ } ) ?. [ 1 ] ;
722+ const firstPromise = openHandler ?.( mainFrameEvent , 'https://accounts.example.com/oauth?attempt=1' ) ;
723+ const secondPromise = openHandler ?.( mainFrameEvent , 'https://accounts.example.com/oauth?attempt=2' ) ;
724+ const openUrlListener = getAppListener < ( event : Electron . Event , url : string ) => void > ( 'open-url' ) ;
725+
726+ await expect ( firstPromise ) . rejects . toThrow ( 'replaced by a new one' ) ;
727+ openUrlListener ?.( { preventDefault : vi . fn ( ) } as unknown as Electron . Event , 'my-app://renderer/?code=123' ) ;
728+ await expect ( secondPromise ) . resolves . toEqual ( { callbackUrl : 'my-app://renderer/?code=123' } ) ;
729+ } ) ;
730+
731+ it ( 'keeps a pending OAuth flow when a new request has an unsupported URL' , async ( ) => {
732+ vi . mocked ( shell . openExternal ) . mockResolvedValue ( undefined ) ;
733+ createClerkBridge ( {
734+ storage,
735+ renderer : {
736+ host : 'renderer' ,
737+ scheme : 'my-app' ,
738+ } ,
739+ } ) ;
740+
741+ const openHandler = vi . mocked ( ipcMain . handle ) . mock . calls . find ( ( [ channel ] ) => {
742+ return channel === OAUTH_TRANSPORT_CHANNELS . open ;
743+ } ) ?. [ 1 ] ;
744+ const pendingPromise = openHandler ?.( mainFrameEvent , 'https://accounts.example.com/oauth' ) ;
745+
746+ await expect ( openHandler ?.( mainFrameEvent , 'file:///etc/passwd' ) ) . rejects . toThrow ( 'unsupported OAuth URL protocol' ) ;
747+
748+ const openUrlListener = getAppListener < ( event : Electron . Event , url : string ) => void > ( 'open-url' ) ;
749+ openUrlListener ?.( { preventDefault : vi . fn ( ) } as unknown as Electron . Event , 'my-app://renderer/?code=123' ) ;
750+ await expect ( pendingPromise ) . resolves . toEqual ( { callbackUrl : 'my-app://renderer/?code=123' } ) ;
751+ } ) ;
752+
753+ it ( "does not let a replaced flow's launch failure reject the new flow" , async ( ) => {
754+ let rejectFirstLaunch : ( error : Error ) => void = ( ) => { } ;
755+ vi . mocked ( shell . openExternal )
756+ . mockImplementationOnce (
757+ ( ) =>
758+ new Promise < void > ( ( _resolve , reject ) => {
759+ rejectFirstLaunch = reject ;
760+ } ) ,
761+ )
762+ . mockResolvedValueOnce ( undefined ) ;
763+ createClerkBridge ( {
764+ storage,
765+ renderer : {
766+ host : 'renderer' ,
767+ scheme : 'my-app' ,
768+ } ,
769+ } ) ;
770+
771+ const openHandler = vi . mocked ( ipcMain . handle ) . mock . calls . find ( ( [ channel ] ) => {
772+ return channel === OAUTH_TRANSPORT_CHANNELS . open ;
773+ } ) ?. [ 1 ] ;
774+ const firstPromise = openHandler ?.( mainFrameEvent , 'https://accounts.example.com/oauth?attempt=1' ) ;
775+ const secondPromise = openHandler ?.( mainFrameEvent , 'https://accounts.example.com/oauth?attempt=2' ) ;
776+
777+ rejectFirstLaunch ( new Error ( 'launch failed' ) ) ;
778+ await expect ( firstPromise ) . rejects . toThrow ( 'replaced by a new one' ) ;
779+
780+ const openUrlListener = getAppListener < ( event : Electron . Event , url : string ) => void > ( 'open-url' ) ;
781+ openUrlListener ?.( { preventDefault : vi . fn ( ) } as unknown as Electron . Event , 'my-app://renderer/?code=123' ) ;
782+ await expect ( secondPromise ) . resolves . toEqual ( { callbackUrl : 'my-app://renderer/?code=123' } ) ;
783+ } ) ;
708784} ) ;
0 commit comments