Fix hanging finish_pending_tasks test

Nathan Sobo and Max Brunsfeld created

Co-Authored-By: Max Brunsfeld <maxbrunsfeld@gmail.com>

Change summary

gpui/src/app.rs | 29 +++++++++++++++++++++--------
1 file changed, 21 insertions(+), 8 deletions(-)

Detailed changes

gpui/src/app.rs 🔗

@@ -1159,6 +1159,8 @@ impl MutableAppContext {
 
     pub fn finish_pending_tasks(&self) -> impl Future<Output = ()> {
         let mut pending_tasks = self.future_handlers.keys().cloned().collect::<HashSet<_>>();
+        pending_tasks.extend(self.stream_handlers.keys());
+
         let task_done = self.task_done.1.clone();
 
         async move {
@@ -3267,23 +3269,34 @@ mod tests {
             let (_, view) = app.add_window(|_| View);
 
             model.update(&mut app, |_, ctx| {
-                let _ = ctx.spawn(async {}, |_, _, _| {});
-                let _ = ctx.spawn(async {}, |_, _, _| {});
-                let _ =
-                    ctx.spawn_stream(smol::stream::iter(vec![1, 2, 3]), |_, _, _| {}, |_, _| {});
+                ctx.spawn(async {}, |_, _, _| {}).detach();
+                ctx.spawn(async {}, |_, _, _| {}).detach();
             });
 
             view.update(&mut app, |_, ctx| {
-                let _ = ctx.spawn(async {}, |_, _, _| {});
-                let _ = ctx.spawn(async {}, |_, _, _| {});
-                let _ =
-                    ctx.spawn_stream(smol::stream::iter(vec![1, 2, 3]), |_, _, _| {}, |_, _| {});
+                ctx.spawn(async {}, |_, _, _| {}).detach();
+                ctx.spawn(async {}, |_, _, _| {}).detach();
             });
 
             assert!(!app.0.borrow().future_handlers.is_empty());
             app.finish_pending_tasks().await;
             assert!(app.0.borrow().future_handlers.is_empty());
             app.finish_pending_tasks().await; // Don't block if there are no tasks
+
+            model.update(&mut app, |_, ctx| {
+                ctx.spawn_stream(smol::stream::iter(vec![1, 2, 3]), |_, _, _| {}, |_, _| {})
+                    .detach();
+            });
+
+            view.update(&mut app, |_, ctx| {
+                ctx.spawn_stream(smol::stream::iter(vec![1, 2, 3]), |_, _, _| {}, |_, _| {})
+                    .detach();
+            });
+
+            assert!(!app.0.borrow().stream_handlers.is_empty());
+            app.finish_pending_tasks().await;
+            assert!(app.0.borrow().stream_handlers.is_empty());
+            app.finish_pending_tasks().await; // Don't block if there are no tasks
         });
     }
 }