blob: 56da0dd16879e3261e5dd0fa090882908eaa1d3c [file] [log] [blame]
// 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 {}