blob: 4ffdb2b467878b922fe2943436767929e69490d5 [file] [log] [blame]
// Copyright 2021 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.
// ignore_for_file: implementation_imports
import 'dart:async';
import 'package:ermine/src/states/app_state.dart';
import 'package:ermine/src/states/view_state.dart';
import 'package:ermine/src/widgets/app.dart';
import 'package:ermine/src/widgets/app_view.dart';
import 'package:ermine/src/widgets/overlays.dart';
import 'package:ermine/src/widgets/dialogs/dialogs.dart';
import 'package:ermine_utils/ermine_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fuchsia_logger/logger.dart';
import 'package:intl/intl.dart';
import 'package:mobx/mobx.dart' hide when;
import 'package:mockito/mockito.dart';
void main() async {
setupLogger(name: 'next_unittests');
late App app;
late MockAppState state;
setUp(() {
state = MockAppState();
app = App(state);
when(state.theme).thenAnswer((_) => AppTheme.darkTheme);
WidgetFactory.mockFactory = (type) => Container(key: ValueKey(type));
});
tearDown(() async {
WidgetFactory.mockFactory = null;
});
testWidgets('Test locale change', (tester) async {
final controller = StreamController<Locale>();
final stream = controller.stream.asObservable();
when(state.locale).thenAnswer((_) => stream.value);
when(state.views).thenAnswer((_) => <ViewState>[]);
when(state.overlaysVisible).thenAnswer((_) => false);
when(state.dialogsVisible).thenAnswer((_) => false);
await tester.pumpWidget(app);
// app should be OffStage until locale is pushed.
expect(find.byType(MaterialApp), findsNothing);
// Set default locale.
final defaultLocale = Locale('en', 'US');
controller.add(defaultLocale);
await tester.pumpAndSettle();
expect(find.byType(MaterialApp), findsOneWidget);
expect(Intl.defaultLocale, defaultLocale.toString());
// Switch locale to swiss french.
final swissFrench = Locale('fr', 'CH');
controller.add(swissFrench);
await tester.pumpAndSettle();
expect(find.byType(MaterialApp), findsOneWidget);
expect(Intl.defaultLocale, swissFrench.toString());
await controller.close();
});
testWidgets('AppView with Overlays is visible', (tester) async {
final controller = StreamController<Locale>();
final stream =
controller.stream.asObservable(initialValue: Locale('en', 'US'));
when(state.locale).thenAnswer((_) => stream.value);
// Create one view.
when(state.views).thenAnswer((_) => [MockViewState()]);
// Show overlays.
when(state.overlaysVisible).thenAnswer((_) => true);
when(state.dialogsVisible).thenAnswer((_) => false);
await tester.pumpWidget(app);
await tester.pumpAndSettle();
expect(find.byKey(ValueKey(AppView)), findsOneWidget);
expect(find.byKey(ValueKey(Overlays)), findsOneWidget);
await controller.close();
});
testWidgets('Dialogs are visible', (tester) async {
final controller = StreamController<Locale>();
final stream =
controller.stream.asObservable(initialValue: Locale('en', 'US'));
when(state.locale).thenAnswer((_) => stream.value);
when(state.views).thenAnswer((_) => []);
// Show dialogs.
final dialogsVisible = true.asObservable();
when(state.overlaysVisible).thenAnswer((_) => false);
when(state.dialogsVisible).thenAnswer((_) => dialogsVisible.value);
await tester.pumpWidget(app);
await tester.pumpAndSettle();
expect(find.byKey(ValueKey(Dialogs)), findsOneWidget);
runInAction(() => dialogsVisible.value = false);
await tester.pumpAndSettle();
expect(find.byKey(ValueKey(Dialogs)), findsNothing);
await controller.close();
});
}
class MockAppState extends Mock implements AppState {}
class MockViewState extends Mock implements ViewState {}