From 0def227558b5f1909f82e3422e1cca7ba3eeccd9 Mon Sep 17 00:00:00 2001 From: mono Date: Fri, 23 Dec 2022 17:37:55 +0900 Subject: [PATCH] Add test --- example/lib/pages/alert_page.dart | 12 +-- example/lib/result_provider.dart | 21 ++++++ example/lib/util/logger.dart | 1 + example/test/pages/alert_page_test.dart | 99 +++++++++++++++++++++++++ example/test/util.dart | 31 ++++++++ 5 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 example/lib/result_provider.dart create mode 100644 example/test/pages/alert_page_test.dart create mode 100644 example/test/util.dart diff --git a/example/lib/pages/alert_page.dart b/example/lib/pages/alert_page.dart index ccbe76c..261e31d 100644 --- a/example/lib/pages/alert_page.dart +++ b/example/lib/pages/alert_page.dart @@ -1,7 +1,9 @@ import 'package:adaptive_dialog/adaptive_dialog.dart'; +import 'package:example/result_provider.dart'; import 'package:example/router/router.dart'; import 'package:example/util/logger.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; class AlertRoute extends GoRouteData { @@ -10,11 +12,11 @@ class AlertRoute extends GoRouteData { Widget build(BuildContext context, GoRouterState state) => const AlertPage(); } -class AlertPage extends StatelessWidget { +class AlertPage extends ConsumerWidget { const AlertPage({super.key}); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { return Scaffold( appBar: AppBar( title: Text(pascalCaseFromRouteName(GoRouter.of(context).location)), @@ -29,7 +31,7 @@ class AlertPage extends StatelessWidget { title: 'Title', message: 'This is message.', ); - logger.info(result); + ref.read(resultProvider.notifier).set(result); }, ), ListTile( @@ -42,7 +44,7 @@ class AlertPage extends StatelessWidget { onWillPop: () => Future.value(false), ); assert(result == OkCancelResult.ok); - logger.info(result); + ref.read(resultProvider.notifier).set(result); }, ), ListTile( @@ -54,7 +56,7 @@ class AlertPage extends StatelessWidget { message: 'This is message.', barrierDismissible: false, ); - logger.info(result); + ref.read(resultProvider.notifier).set(result); }, ), ListTile( diff --git a/example/lib/result_provider.dart b/example/lib/result_provider.dart new file mode 100644 index 0000000..c60120f --- /dev/null +++ b/example/lib/result_provider.dart @@ -0,0 +1,21 @@ +import 'package:example/util/util.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +final resultProvider = + StateNotifierProvider((ref) => ResultNotifier()); + +class ResultNotifier extends StateNotifier { + ResultNotifier() : super(null); + // ignore: use_setters_to_change_properties + void set(dynamic text) { + state = text; + } + + void clear() => set(''); + + @override + set state(dynamic value) { + super.state = value; + logger.info(state); + } +} diff --git a/example/lib/util/logger.dart b/example/lib/util/logger.dart index dea0936..9f16daf 100644 --- a/example/lib/util/logger.dart +++ b/example/lib/util/logger.dart @@ -5,4 +5,5 @@ final SimpleLogger logger = SimpleLogger() ..setLevel( Level.FINEST, includeCallerInfo: true, + callerInfoFrameLevelOffset: 2, ); diff --git a/example/test/pages/alert_page_test.dart b/example/test/pages/alert_page_test.dart new file mode 100644 index 0000000..2ea9d21 --- /dev/null +++ b/example/test/pages/alert_page_test.dart @@ -0,0 +1,99 @@ +import 'package:adaptive_dialog/adaptive_dialog.dart'; +import 'package:example/result_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../util.dart'; + +extension on WidgetTester { + Future setUpAlert() => setup('Alert'); + Future openOkDialog() => open('OK Dialog'); + Future openOkOnWillPopFalseDialog() => + open('OK Dialog (onWillPop: false)'); + Future openOkBarrierDismissibleFalseDialog() => + open('OK Dialog (barrierDismissible: false)'); +} + +void main() { + group('OK Dialog', () { + testWidgets('OK', (tester) async { + final container = await tester.setUpAlert(); + await tester.openOkDialog(); + + expect(find.text('Title'), findsOneWidget); + expect(find.text('This is message.'), findsOneWidget); + await tester.tap(find.widgetWithText(TextButton, 'OK')); + await tester.pumpAndSettle(); + + expect(container.read(resultProvider), OkCancelResult.ok); + }); + testWidgets('barrier', (tester) async { + final container = await tester.setUpAlert(); + await tester.openOkDialog(); + + await tester.tapBarrier(); + + expect(container.read(resultProvider), OkCancelResult.cancel); + }); + + testWidgets('maybePop', (tester) async { + final container = await tester.setUpAlert(); + await tester.openOkDialog(); + + final context = tester.element(find.text('Title')); + await Navigator.of(context).maybePop(); + await tester.pumpAndSettle(); + + expect(container.read(resultProvider), OkCancelResult.cancel); + }); + }); + + group('OK Dialog (onWillPop: false)', () { + testWidgets('OK', (tester) async { + final container = await tester.setUpAlert(); + await tester.openOkOnWillPopFalseDialog(); + + expect(find.text('Title'), findsOneWidget); + expect(find.text('This is message.'), findsOneWidget); + await tester.tap(find.widgetWithText(TextButton, 'OK')); + await tester.pumpAndSettle(); + + expect(container.read(resultProvider), OkCancelResult.ok); + }); + testWidgets('maybePop', (tester) async { + final container = await tester.setUpAlert(); + await tester.openOkOnWillPopFalseDialog(); + + final context = tester.element(find.text('Title')); + await Navigator.of(context).maybePop(); + await tester.pumpAndSettle(); + + expect(container.read(resultProvider), isNull); + expect(find.text('Title'), findsOneWidget); + }); + }); + + group('OK Dialog (barrierDismissible: false)', () { + testWidgets('OK', (tester) async { + final container = await tester.setUpAlert(); + await tester.openOkBarrierDismissibleFalseDialog(); + + expect(find.text('Title'), findsOneWidget); + expect(find.text('This is message.'), findsOneWidget); + await tester.tap(find.widgetWithText(TextButton, 'OK')); + await tester.pumpAndSettle(); + + expect(container.read(resultProvider), OkCancelResult.ok); + }); + testWidgets('barrier', (tester) async { + final container = await tester.setUpAlert(); + await tester.openOkBarrierDismissibleFalseDialog(); + + await tester.tapBarrier(); + + expect(container.read(resultProvider), isNull); + expect(find.text('Title'), findsOneWidget); + }); + }); +} diff --git a/example/test/util.dart b/example/test/util.dart new file mode 100644 index 0000000..80e6f4a --- /dev/null +++ b/example/test/util.dart @@ -0,0 +1,31 @@ +import 'package:example/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; + +extension WidgetTesterX on WidgetTester { + Future setup(String pageName) async { + final container = ProviderContainer(); + addTearDown(container.dispose); + await pumpWidget( + ProviderScope( + parent: container, + child: const App(), + ), + ); + + await tap(find.widgetWithText(ListTile, pageName)); + await pumpAndSettle(); + return container; + } + + Future open(String label) async { + await tap(find.widgetWithText(ListTile, label)); + await pumpAndSettle(); + } + + Future tapBarrier() async { + await tapAt(Offset.zero); + await pumpAndSettle(); + } +}