@@ -76,3 +76,37 @@ it('ignores a request that completes after unmount', async () => {
7676 } )
7777 expect ( mocks . refresh ) . not . toHaveBeenCalled ( )
7878} )
79+
80+ it ( 'refreshes a run that starts and finishes between idle polls' , async ( ) => {
81+ mocks . poll . mockResolvedValueOnce ( null ) . mockResolvedValue ( run ( 'succeeded' ) )
82+ render ( React . createElement ( GlobalRunBar ) )
83+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
84+ expect ( mocks . refresh ) . not . toHaveBeenCalled ( )
85+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 15000 ) )
86+ expect ( mocks . refresh ) . toHaveBeenCalledTimes ( 1 )
87+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 30000 ) )
88+ expect ( mocks . refresh ) . toHaveBeenCalledTimes ( 1 )
89+ } )
90+
91+ it ( 'refreshes a different completed run without requiring an active observation' , async ( ) => {
92+ mocks . poll . mockResolvedValueOnce ( run ( 'succeeded' ) ) . mockResolvedValue ( {
93+ ...run ( 'succeeded' ) ,
94+ runId : 'next-run' ,
95+ } )
96+ render ( React . createElement ( GlobalRunBar ) )
97+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
98+ mocks . refresh . mockClear ( )
99+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 15000 ) )
100+ expect ( mocks . refresh ) . toHaveBeenCalledTimes ( 1 )
101+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 15000 ) )
102+ expect ( mocks . refresh ) . toHaveBeenCalledTimes ( 1 )
103+ } )
104+
105+ it ( 'refreshes once when a run completed before the first poll' , async ( ) => {
106+ mocks . poll . mockResolvedValue ( run ( 'succeeded' ) )
107+ render ( React . createElement ( GlobalRunBar ) )
108+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 0 ) )
109+ expect ( mocks . refresh ) . toHaveBeenCalledTimes ( 1 )
110+ await act ( ( ) => vi . advanceTimersByTimeAsync ( 30000 ) )
111+ expect ( mocks . refresh ) . toHaveBeenCalledTimes ( 1 )
112+ } )
0 commit comments