blob: 7f32caed2f522d36ccbd2c556d834c35c28a06a2 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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_test/flutter_test.dart';
import 'package:fuchsia_logger/logger.dart';
import 'package:mockito/mockito.dart';
// ignore_for_file: implementation_imports
import 'package:simple_browser/src/blocs/webpage_bloc.dart';
import 'package:simple_browser/src/services/simple_browser_navigation_event_listener.dart';
import 'package:simple_browser/src/services/simple_browser_web_service.dart';
import 'package:simple_browser/src/widgets/navigation_field.dart';
void main() {
setupLogger(name: 'navigation_field_test');
late SimpleBrowserWebService mockWebService;
late SimpleBrowserNavigationEventListener mockEventListener;
late WebPageBloc webPageBloc;
setUpAll(() {
mockWebService = MockSimpleBrowserWebService();
mockEventListener = MockSimpleBrowserNavigationEventListener();
webPageBloc = WebPageBloc(webService: mockWebService);
});
group('Default textfield (without URL)', () {
ValueNotifier urlNotifier = ValueNotifier<String>('');
setUp(() {
when(mockEventListener.urlNotifier).thenAnswer((_) => urlNotifier);
when(mockEventListener.url).thenAnswer((_) => urlNotifier.value);
when(mockWebService.navigationEventListener)
.thenAnswer((_) => mockEventListener);
});
const whenSuffix = 'when created it empty.';
testWidgets('Should focus on the textfield $whenSuffix',
(WidgetTester tester) async {
await _setUpNavigationField(tester, webPageBloc);
final textField = _findTextField();
expect(tester.widget<TextField>(textField).autofocus, true,
reason:
'Expected the TextField to be focused by default $whenSuffix');
});
testWidgets('Should call the callback when a valid url is entered.',
(WidgetTester tester) async {
await _setUpNavigationField(tester, webPageBloc);
String testUrl = 'https://www.google.com';
final textField = _findTextField();
// Enters the testUrl to the text field and submit it.
await tester.enterText(textField, testUrl);
await tester.testTextInput.receiveAction(TextInputAction.go);
await tester.pump();
// Sees if the corresponding callback is called.
verify(webPageBloc.webService.loadUrl(testUrl)).called(1);
});
});
group('Textfield with a URL', () {
ValueNotifier urlNotifier = ValueNotifier<String>('');
setUp(() {
when(mockEventListener.urlNotifier).thenAnswer((_) => urlNotifier);
when(mockEventListener.url).thenAnswer((_) => urlNotifier.value);
when(mockWebService.navigationEventListener)
.thenAnswer((_) => mockEventListener);
});
const whenSuffix = 'when created it with a url.';
testWidgets('Should not focus on the TextField $whenSuffix',
(WidgetTester tester) async {
urlNotifier.value = 'https://www.google.com';
await _setUpNavigationField(tester, webPageBloc);
final textField = _findTextField();
expect(tester.widget<TextField>(textField).autofocus, false,
reason: 'Expected the textfield not focused by default $whenSuffix');
});
});
}
Future<void> _setUpNavigationField(
WidgetTester tester, WebPageBloc bloc) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: NavigationField(
bloc: bloc,
focus: FocusNode(),
),
),
),
);
}
Finder _findTextField() {
final textField = find.byType(TextField);
expect(textField, findsOneWidget,
reason: 'Expected a TextField on the NavigationField widget.');
return textField;
}
class MockSimpleBrowserNavigationEventListener extends Mock
implements SimpleBrowserNavigationEventListener {}
class MockSimpleBrowserWebService extends Mock
implements SimpleBrowserWebService {}