| // Copyright (c) 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/services.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:mockito/mockito.dart'; |
| |
| import 'package:app_flutter/navigation_drawer.dart'; |
| |
| void main() { |
| group('NavigationDrawer', () { |
| testWidgets('lists all pages', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| const MaterialApp( |
| home: NavigationDrawer(), |
| ), |
| ); |
| |
| expect(find.text('Build'), findsOneWidget); |
| expect(find.text('Benchmarks'), findsOneWidget); |
| expect(find.text('Repository'), findsOneWidget); |
| expect(find.text('Infra Agents'), findsOneWidget); |
| expect(find.text('Source Code'), findsOneWidget); |
| }); |
| testWidgets('build navigates to build Flutter route', |
| (WidgetTester tester) async { |
| final MockNavigatorObserver navigatorObserver = MockNavigatorObserver(); |
| await tester.pumpWidget( |
| MaterialApp( |
| home: const NavigationDrawer(), |
| initialRoute: '/', |
| routes: <String, WidgetBuilder>{ |
| '/build': (BuildContext context) => const Text('i am build'), |
| }, |
| navigatorObservers: <NavigatorObserver>[navigatorObserver], |
| ), |
| ); |
| |
| verifyNever(navigatorObserver.didReplace()); |
| expect(find.text('i am build'), findsNothing); |
| |
| // Click the nav item for build |
| await tester.tap(find.text('Build')); |
| await tester.pumpAndSettle(); |
| |
| verify(navigatorObserver.didReplace( |
| newRoute: anyNamed('newRoute'), oldRoute: anyNamed('oldRoute'))) |
| .called(1); |
| expect(find.text('i am build'), findsOneWidget); |
| }); |
| |
| testWidgets('infra agents navigates to its Flutter route', |
| (WidgetTester tester) async { |
| final MockNavigatorObserver navigatorObserver = MockNavigatorObserver(); |
| await tester.pumpWidget( |
| MaterialApp( |
| home: const NavigationDrawer(), |
| initialRoute: '/', |
| routes: <String, WidgetBuilder>{ |
| '/agents': (BuildContext context) => const Text('infra agents'), |
| }, |
| navigatorObservers: <NavigatorObserver>[navigatorObserver], |
| ), |
| ); |
| |
| verifyNever(navigatorObserver.didReplace()); |
| expect(find.text('infra agents'), findsNothing); |
| |
| // Click the nav link for infra agent |
| await tester.tap(find.text('Infra Agents')); |
| await tester.pumpAndSettle(); |
| |
| verify(navigatorObserver.didReplace( |
| newRoute: anyNamed('newRoute'), oldRoute: anyNamed('oldRoute'))) |
| .called(1); |
| expect(find.text('infra agents'), findsOneWidget); |
| }); |
| |
| testWidgets('performance opens performance html url', |
| (WidgetTester tester) async { |
| const MethodChannel urlLauncherChannel = |
| MethodChannel('plugins.flutter.io/url_launcher'); |
| final List<MethodCall> log = <MethodCall>[]; |
| urlLauncherChannel.setMockMethodCallHandler( |
| (MethodCall methodCall) async => log.add(methodCall)); |
| |
| await tester.pumpWidget( |
| const MaterialApp( |
| home: NavigationDrawer(), |
| ), |
| ); |
| |
| expect(find.text('Benchmarks'), findsOneWidget); |
| await tester.tap(find.text('Benchmarks')); |
| await tester.pump(); |
| |
| expect( |
| log, |
| <Matcher>[ |
| isMethodCall('launch', arguments: <String, Object>{ |
| 'url': '/benchmarks.html', |
| 'useSafariVC': false, |
| 'useWebView': false, |
| 'enableJavaScript': false, |
| 'enableDomStorage': false, |
| 'universalLinksOnly': false, |
| 'headers': <String, String>{} |
| }) |
| ], |
| ); |
| }); |
| |
| testWidgets('repository opens repository html url', |
| (WidgetTester tester) async { |
| const MethodChannel urlLauncherChannel = |
| MethodChannel('plugins.flutter.io/url_launcher'); |
| final List<MethodCall> log = <MethodCall>[]; |
| urlLauncherChannel.setMockMethodCallHandler( |
| (MethodCall methodCall) async => log.add(methodCall)); |
| |
| await tester.pumpWidget( |
| const MaterialApp( |
| home: NavigationDrawer(), |
| ), |
| ); |
| |
| expect(find.text('Repository'), findsOneWidget); |
| await tester.tap(find.text('Repository')); |
| await tester.pump(); |
| |
| expect( |
| log, |
| <Matcher>[ |
| isMethodCall('launch', arguments: <String, Object>{ |
| 'url': '/repository.html', |
| 'useSafariVC': false, |
| 'useWebView': false, |
| 'enableJavaScript': false, |
| 'enableDomStorage': false, |
| 'universalLinksOnly': false, |
| 'headers': <String, String>{} |
| }) |
| ], |
| ); |
| }); |
| |
| testWidgets('source code opens github cocoon url', |
| (WidgetTester tester) async { |
| const MethodChannel urlLauncherChannel = |
| MethodChannel('plugins.flutter.io/url_launcher'); |
| final List<MethodCall> log = <MethodCall>[]; |
| urlLauncherChannel.setMockMethodCallHandler( |
| (MethodCall methodCall) async => log.add(methodCall)); |
| |
| await tester.pumpWidget( |
| const MaterialApp( |
| home: NavigationDrawer(), |
| ), |
| ); |
| |
| expect(find.text('Source Code'), findsOneWidget); |
| await tester.tap(find.text('Source Code')); |
| await tester.pump(); |
| |
| expect( |
| log, |
| <Matcher>[ |
| isMethodCall('launch', arguments: <String, Object>{ |
| 'url': 'https://github.com/flutter/cocoon', |
| 'useSafariVC': true, |
| 'useWebView': false, |
| 'enableJavaScript': false, |
| 'enableDomStorage': false, |
| 'universalLinksOnly': false, |
| 'headers': <String, String>{} |
| }) |
| ], |
| ); |
| }); |
| |
| testWidgets('current route shows highlighted', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| const MaterialApp( |
| home: NavigationDrawer( |
| currentRoute: '/build', |
| ), |
| ), |
| ); |
| |
| final ListTile selectedListTile = |
| tester.widget(find.byKey(const Key('nav-link-build'))); |
| final ListTile notSelectedListTile = |
| tester.widget(find.byKey(const Key('nav-link-benchmarks'))); |
| expect(selectedListTile.selected, true); |
| expect(notSelectedListTile.selected, false); |
| }); |
| }); |
| } |
| |
| /// Class for testing interactions on [NavigatorObserver]. |
| class MockNavigatorObserver extends Mock implements NavigatorObserver {} |