Skip to content

Commit f5a4b17

Browse files
committed
Add test
1 parent 75aad3a commit f5a4b17

File tree

5 files changed

+159
-5
lines changed

5 files changed

+159
-5
lines changed

example/lib/pages/alert_page.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'package:adaptive_dialog/adaptive_dialog.dart';
2+
import 'package:example/result_provider.dart';
23
import 'package:example/router/router.dart';
34
import 'package:example/util/logger.dart';
45
import 'package:flutter/cupertino.dart';
56
import 'package:flutter/material.dart';
7+
import 'package:flutter_riverpod/flutter_riverpod.dart';
68
import 'package:go_router/go_router.dart';
79

810
class AlertRoute extends GoRouteData {
@@ -11,11 +13,11 @@ class AlertRoute extends GoRouteData {
1113
Widget build(BuildContext context, GoRouterState state) => const AlertPage();
1214
}
1315

14-
class AlertPage extends StatelessWidget {
16+
class AlertPage extends ConsumerWidget {
1517
const AlertPage({super.key});
1618

1719
@override
18-
Widget build(BuildContext context) {
20+
Widget build(BuildContext context, WidgetRef ref) {
1921
return Scaffold(
2022
appBar: AppBar(
2123
title: Text(pascalCaseFromRouteUri(GoRouterState.of(context).uri)),
@@ -30,7 +32,7 @@ class AlertPage extends StatelessWidget {
3032
title: 'Title',
3133
message: 'This is message.',
3234
);
33-
logger.info(result);
35+
ref.read(resultProvider.notifier).set(result);
3436
},
3537
),
3638
ListTile(
@@ -43,7 +45,7 @@ class AlertPage extends StatelessWidget {
4345
canPop: false,
4446
);
4547
assert(result == OkCancelResult.ok);
46-
logger.info(result);
48+
ref.read(resultProvider.notifier).set(result);
4749
},
4850
),
4951
ListTile(
@@ -55,7 +57,7 @@ class AlertPage extends StatelessWidget {
5557
message: 'This is message.',
5658
barrierDismissible: false,
5759
);
58-
logger.info(result);
60+
ref.read(resultProvider.notifier).set(result);
5961
},
6062
),
6163
ListTile(

example/lib/result_provider.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import 'package:example/util/util.dart';
2+
import 'package:flutter_riverpod/flutter_riverpod.dart';
3+
4+
final resultProvider =
5+
StateNotifierProvider<ResultNotifier, dynamic>((ref) => ResultNotifier());
6+
7+
class ResultNotifier extends StateNotifier<dynamic> {
8+
ResultNotifier() : super(null);
9+
// ignore: use_setters_to_change_properties
10+
void set(dynamic text) {
11+
state = text;
12+
}
13+
14+
void clear() => set('');
15+
16+
@override
17+
set state(dynamic value) {
18+
super.state = value;
19+
logger.info(state);
20+
}
21+
}

example/lib/util/logger.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ final SimpleLogger logger = SimpleLogger()
55
..setLevel(
66
Level.FINEST,
77
includeCallerInfo: true,
8+
callerInfoFrameLevelOffset: 2,
89
);
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import 'package:adaptive_dialog/adaptive_dialog.dart';
2+
import 'package:example/result_provider.dart';
3+
import 'package:flutter/material.dart';
4+
import 'package:flutter_riverpod/flutter_riverpod.dart';
5+
import 'package:flutter_test/flutter_test.dart';
6+
7+
import '../util.dart';
8+
9+
extension on WidgetTester {
10+
Future<ProviderContainer> setUpAlert() => setup('Alert');
11+
Future<void> openOkDialog() => open('OK Dialog');
12+
Future<void> openOkOnWillPopFalseDialog() =>
13+
open('OK Dialog (onWillPop: false)');
14+
Future<void> openOkBarrierDismissibleFalseDialog() =>
15+
open('OK Dialog (barrierDismissible: false)');
16+
}
17+
18+
void main() {
19+
group('OK Dialog', () {
20+
testWidgets('OK', (tester) async {
21+
final container = await tester.setUpAlert();
22+
await tester.openOkDialog();
23+
24+
expect(find.text('Title'), findsOneWidget);
25+
expect(find.text('This is message.'), findsOneWidget);
26+
await tester.tap(find.widgetWithText(TextButton, 'OK'));
27+
await tester.pumpAndSettle();
28+
29+
expect(container.read(resultProvider), OkCancelResult.ok);
30+
});
31+
testWidgets('barrier', (tester) async {
32+
final container = await tester.setUpAlert();
33+
await tester.openOkDialog();
34+
35+
await tester.tapBarrier();
36+
37+
expect(container.read(resultProvider), OkCancelResult.cancel);
38+
});
39+
40+
testWidgets('maybePop', (tester) async {
41+
final container = await tester.setUpAlert();
42+
await tester.openOkDialog();
43+
44+
final context = tester.element(find.text('Title'));
45+
await Navigator.of(context).maybePop();
46+
await tester.pumpAndSettle();
47+
48+
expect(container.read(resultProvider), OkCancelResult.cancel);
49+
});
50+
});
51+
52+
group('OK Dialog (onWillPop: false)', () {
53+
testWidgets('OK', (tester) async {
54+
final container = await tester.setUpAlert();
55+
await tester.openOkOnWillPopFalseDialog();
56+
57+
expect(find.text('Title'), findsOneWidget);
58+
expect(find.text('This is message.'), findsOneWidget);
59+
await tester.tap(find.widgetWithText(TextButton, 'OK'));
60+
await tester.pumpAndSettle();
61+
62+
expect(container.read(resultProvider), OkCancelResult.ok);
63+
});
64+
testWidgets('maybePop', (tester) async {
65+
final container = await tester.setUpAlert();
66+
await tester.openOkOnWillPopFalseDialog();
67+
68+
final context = tester.element(find.text('Title'));
69+
await Navigator.of(context).maybePop();
70+
await tester.pumpAndSettle();
71+
72+
expect(container.read(resultProvider), isNull);
73+
expect(find.text('Title'), findsOneWidget);
74+
});
75+
});
76+
77+
group('OK Dialog (barrierDismissible: false)', () {
78+
testWidgets('OK', (tester) async {
79+
final container = await tester.setUpAlert();
80+
await tester.openOkBarrierDismissibleFalseDialog();
81+
82+
expect(find.text('Title'), findsOneWidget);
83+
expect(find.text('This is message.'), findsOneWidget);
84+
await tester.tap(find.widgetWithText(TextButton, 'OK'));
85+
await tester.pumpAndSettle();
86+
87+
expect(container.read(resultProvider), OkCancelResult.ok);
88+
});
89+
testWidgets('barrier', (tester) async {
90+
final container = await tester.setUpAlert();
91+
await tester.openOkBarrierDismissibleFalseDialog();
92+
93+
await tester.tapBarrier();
94+
95+
expect(container.read(resultProvider), isNull);
96+
expect(find.text('Title'), findsOneWidget);
97+
});
98+
});
99+
}

example/test/util.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import 'package:example/app.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_riverpod/flutter_riverpod.dart';
4+
import 'package:flutter_test/flutter_test.dart';
5+
6+
extension WidgetTesterX on WidgetTester {
7+
Future<ProviderContainer> setup(String pageName) async {
8+
final container = ProviderContainer();
9+
addTearDown(container.dispose);
10+
await pumpWidget(
11+
ProviderScope(
12+
parent: container,
13+
child: const App(),
14+
),
15+
);
16+
17+
await tap(find.widgetWithText(ListTile, pageName));
18+
await pumpAndSettle();
19+
return container;
20+
}
21+
22+
Future<void> open(String label) async {
23+
await tap(find.widgetWithText(ListTile, label));
24+
await pumpAndSettle();
25+
}
26+
27+
Future<void> tapBarrier() async {
28+
await tapAt(Offset.zero);
29+
await pumpAndSettle();
30+
}
31+
}

0 commit comments

Comments
 (0)