[ermine] Add pumpUntilVisible utility function to app_widget_test

This change adds pumpUntilVisibile to WidgetTester using an extension.
This allows waiting for a widget to become visible. For now, it is
used only in one test, but would find a better place in a shared
library. That is left for subsequent cls based on need of this
method.

Test: All unittests pass
Change-Id: I7c1e64cab066a2a16221409bf0dd4be350d1d4e0
Reviewed-on: https://fuchsia-review.googlesource.com/c/experiences/+/403198
Reviewed-by: Chase Latta <chaselatta@google.com>
Testability-Review: Chase Latta <chaselatta@google.com>
Commit-Queue: Sanjay Chouksey <sanjayc@google.com>
diff --git a/session_shells/ermine/shell/test/app_widget_test.dart b/session_shells/ermine/shell/test/app_widget_test.dart
index 7985de4..0ab4e60 100644
--- a/session_shells/ermine/shell/test/app_widget_test.dart
+++ b/session_shells/ermine/shell/test/app_widget_test.dart
@@ -62,8 +62,7 @@
     when(model.overviewVisibility).thenReturn(overviewNotifier);
 
     await tester.pumpWidget(app);
-    await tester.pumpAndSettle();
-    await tester.pumpAndSettle();
+    await tester.pumpUntilVisible(app.overview);
 
     expect(find.byWidget(app.recents), findsOneWidget);
     expect(find.byWidget(app.overview), findsOneWidget);
@@ -71,7 +70,7 @@
 
     // Home should be visible.
     overviewNotifier.value = false;
-    await tester.pumpAndSettle();
+    await tester.pumpUntilVisible(app.home);
 
     expect(find.byWidget(app.recents), findsOneWidget);
     expect(find.byWidget(app.overview), findsNothing);
@@ -97,3 +96,14 @@
 }
 
 class MockAppModel extends Mock implements AppModel {}
+
+extension _WidgetVisibility on WidgetTester {
+  /// Calls [pumpAndSettle] until widget finder finds a widget or the default
+  /// timeout of the surrounding test is exceeded.
+  Future<void> pumpUntilVisible(Widget widget) async {
+    var matchState = {};
+    while (findsNothing.matches(find.byWidget(widget), matchState)) {
+      await pumpAndSettle();
+    }
+  }
+}