• Vadaski's avatar
    add container manager test · c23a8f3f
    Vadaski authored
    - add ContainerManagerState test group
    - containerCounts should change based on the number of pages
    c23a8f3f
container_manager_test.dart 8.48 KB
import 'package:flutter_boost/container/container_manager.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_boost/flutter_boost.dart';
import 'package:flutter_boost/container/container_coordinator.dart';

final GlobalKey scaffoldKey = GlobalKey();

class FirstRouteWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First Route'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              child: Text('First'),
              onPressed: () {
                print("open second page!");
                FlutterBoost.singleton.open("second").then((Map value) {
                  print(
                      "call me when page is finished. did recieve second route result $value");
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}

class SecondRouteWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Route'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              child: Text('Second'),
              onPressed: () {
                print("open second page!");
                FlutterBoost.singleton.open("second").then((Map value) {
                  print(
                      "call me when page is finished. did recieve second route result $value");
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();

    FlutterBoost.singleton.registerPageBuilders({
      'first': (pageName, params, _) => FirstRouteWidget(),
      'second': (pageName, params, _) => SecondRouteWidget(),
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Boost example',
        key: scaffoldKey,
        builder: (BuildContext context, Widget child) {
          assert(child is Navigator, 'child must be Navigator, what is wrong?');

          final BoostContainerManager manager = BoostContainerManager(
            initNavigator: child,
          );

          return manager;
        },
        home: Container());
  }
}

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('test iOS edge swipe then drop back at starting point works',
      (WidgetTester tester) async {
    await tester.pumpWidget(MyApp());

    expect(find.text('First'), findsNothing);
  });

  group(
    'Try to get the ContainerManagerState in the ancestor node',
    () {
      testWidgets(
        'through the `BoostContainerManager.of(context)` method',
        (WidgetTester tester) async {
          var builderContext;

          FlutterBoost.singleton.registerPageBuilders({
            'context': (pageName, params, _) => Builder(
                  builder: (context) {
                    return FloatingActionButton(
                      onPressed: () {
                        builderContext = context;
                      },
                    );
                  },
                ),
          });

          await tester.pumpWidget(
            MaterialApp(
              builder: FlutterBoost.init(),
              home: Container(),
            ),
          );

          //open context page
          ContainerCoordinator.singleton
              .nativeContainerDidShow("context", {}, "1000000");

          await tester.pump(Duration(seconds: 1));

          expect(find.byType(FloatingActionButton), findsOneWidget);

          //get the context of the Builder
          await tester.tap(find.byType(FloatingActionButton));

          final isFind = BoostContainerManager.of(builderContext) != null;

          expect(isFind, true,
              reason: '`BoostContainerManager.of` should be able to '
                  'find `ContainerManagerState` in `FlutterBoost.init()` based on the context of the `Builder`');
        },
      );

//      testWidgets(
//        'through the `BoostContainerManager.of(context)` method',
//        (WidgetTester tester) async {
//          var builderContext;
//
//          await tester.pumpWidget(
//            MaterialApp(
//              home: Builder(
//                builder: (context) {
//                  return FloatingActionButton(
//                    onPressed: () {
//                      builderContext = context;
//                    },
//                  );
//                },
//              ),
//            ),
//          );
//
//          expect(find.byType(FloatingActionButton), findsOneWidget);
//
//          //get the context of the Builder
//          await tester.tap(find.byType(FloatingActionButton));
//
//          expect(BoostContainerManager.of(builderContext), isAssertionError);
//        },
//      );

      testWidgets(
        'through the `BoostContainerManager.tryOf(context)` method',
        (WidgetTester tester) async {
          var builderContext;

          FlutterBoost.singleton.registerPageBuilders({
            'context': (pageName, params, _) => Builder(
                  builder: (context) {
                    return FloatingActionButton(
                      onPressed: () {
                        builderContext = context;
                      },
                    );
                  },
                ),
          });

          await tester.pumpWidget(
            MaterialApp(
              builder: FlutterBoost.init(),
              home: Container(),
            ),
          );

          //open context page
          ContainerCoordinator.singleton
              .nativeContainerDidShow("context", {}, "1000000");

          await tester.pump(Duration(seconds: 1));

          expect(find.byType(FloatingActionButton), findsOneWidget);

          //get the context of the Builder
          await tester.tap(find.byType(FloatingActionButton));

          final isFind = BoostContainerManager.tryOf(builderContext) != null;

          expect(isFind, true,
              reason: '`BoostContainerManager.tryOf` should be able to '
                  'find `ContainerManagerState` in `FlutterBoost.init()` based on the context of the `Builder`');
        },
      );
    },
  );

  group('ContainerManagerState', () {
    testWidgets(
      'containerCounts should change based on the number of pages',
      (WidgetTester tester) async {
        var builderContext;

        FlutterBoost.singleton.registerPageBuilders({
          'context': (pageName, params, _) => Builder(
                builder: (context) {
                  return FloatingActionButton(
                    onPressed: () {
                      builderContext = context;
                    },
                  );
                },
              ),
        });

        await tester.pumpWidget(
          MaterialApp(
            builder: FlutterBoost.init(),
            home: Container(),
          ),
        );

        //open first context page
        ContainerCoordinator.singleton
            .nativeContainerDidShow("context", {}, "1000000");

        await tester.pump(Duration(seconds: 1));

        //get the context of the Builder
        await tester.tap(find.byType(FloatingActionButton));

        final containerManagerState = BoostContainerManager.of(builderContext);

        expect(containerManagerState.containerCounts, 1,
            reason: '1 page shown');

        //open second context page
        ContainerCoordinator.singleton
            .nativeContainerDidShow("context", {}, "2000000");

        await tester.pump(Duration(seconds: 1));

        expect(containerManagerState.containerCounts, 2,
            reason: '2 page shown');

        //pop second context page
        containerManagerState.pop();

        await tester.pump(Duration(seconds: 1));

        expect(containerManagerState.containerCounts, 1,
            reason: 'second context page closed, Only one page left');

        //pop last context page
        containerManagerState.pop();

        await tester.pump(Duration(seconds: 1));

        expect(containerManagerState.containerCounts, 0,
            reason: 'last context page closed, no page left');
      },
    );
  });
}