@@ -640,6 +640,38 @@ describe('initUpdater state machine', () => {
640640 expect ( autoUpdaterMock . downloadUpdate ) . not . toHaveBeenCalled ( )
641641 } )
642642
643+ it ( 'resumes refreshing after a replacement download is cancelled without an error event' , async ( ) => {
644+ const { handle } = await createUpdater ( )
645+ await stageUpdate ( handle , '2.0.0' )
646+ await vi . advanceTimersByTimeAsync ( 10_000 )
647+ autoUpdaterMock . downloadUpdate . mockImplementationOnce ( ( ) =>
648+ Promise . reject ( new Error ( 'cancelled' ) )
649+ )
650+ emit ( 'update-available' , { version : '2.1.0' } )
651+ await vi . advanceTimersByTimeAsync ( 0 )
652+
653+ await vi . advanceTimersByTimeAsync ( 30 * 60 * 1000 - 10_000 )
654+ expect ( autoUpdaterMock . checkForUpdates ) . toHaveBeenCalledTimes ( 3 )
655+ emit ( 'update-available' , { version : '2.1.0' } )
656+ expect ( autoUpdaterMock . downloadUpdate ) . toHaveBeenCalledTimes ( 3 )
657+ expect ( handle . getState ( ) ) . toEqual ( { status : 'ready' , version : '2.0.0' } )
658+ } )
659+
660+ it ( 'follows the feed when a re-check rolls an offered release back' , async ( ) => {
661+ const { handle } = await createUpdater ( { autoDownload : false } )
662+ handle . check ( )
663+ await vi . advanceTimersByTimeAsync ( 0 )
664+ emit ( 'update-available' , { version : '2.2.0' } )
665+
666+ await vi . advanceTimersByTimeAsync ( 10_000 )
667+ emit ( 'update-available' , { version : '2.1.0' } )
668+ expect ( handle . getState ( ) ) . toEqual ( { status : 'available' , version : '2.1.0' } )
669+
670+ handle . check ( )
671+ emit ( 'update-downloaded' , { version : '2.1.0' } )
672+ expect ( handle . getState ( ) ) . toEqual ( { status : 'ready' , version : '2.1.0' } )
673+ } )
674+
643675 it ( 'withdraws an offered update once a re-check stores a blocked candidate' , async ( ) => {
644676 const { handle } = await createUpdater ( { autoDownload : false } )
645677 handle . check ( )
0 commit comments