Skip to content

Commit a5a11be

Browse files
committed
Add test
1 parent 75aad3a commit a5a11be

File tree

6 files changed

+164
-5
lines changed

6 files changed

+164
-5
lines changed

Diff for: example/lib/pages/alert_page.dart

+7-5
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(

Diff for: example/lib/result_provider.dart

+21
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+
}

Diff for: example/lib/util/logger.dart

+1
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
);

Diff for: example/macos/Podfile.lock

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
PODS:
2+
- appkit_ui_element_colors (1.0.0):
3+
- FlutterMacOS
24
- dynamic_color (0.0.2):
35
- FlutterMacOS
46
- file_selector_macos (0.0.1):
@@ -12,6 +14,7 @@ PODS:
1214
- FlutterMacOS
1315

1416
DEPENDENCIES:
17+
- appkit_ui_element_colors (from `Flutter/ephemeral/.symlinks/plugins/appkit_ui_element_colors/macos`)
1518
- dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`)
1619
- file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`)
1720
- FlutterMacOS (from `Flutter/ephemeral`)
@@ -20,6 +23,8 @@ DEPENDENCIES:
2023
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
2124

2225
EXTERNAL SOURCES:
26+
appkit_ui_element_colors:
27+
:path: Flutter/ephemeral/.symlinks/plugins/appkit_ui_element_colors/macos
2328
dynamic_color:
2429
:path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos
2530
file_selector_macos:
@@ -34,6 +39,7 @@ EXTERNAL SOURCES:
3439
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
3540

3641
SPEC CHECKSUMS:
42+
appkit_ui_element_colors: 39bb2d80be3f19b152ccf4c70d5bbe6cba43d74a
3743
dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f
3844
file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9
3945
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24

Diff for: example/test/pages/alert_page_test.dart

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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> openOkCanPopFalseDialog() => open('OK Dialog (canPop: false)');
13+
Future<void> openOkBarrierDismissibleFalseDialog() =>
14+
open('OK Dialog (barrierDismissible: false)');
15+
}
16+
17+
void main() {
18+
group('OK Dialog', () {
19+
testWidgets('OK', (tester) async {
20+
final container = await tester.setUpAlert();
21+
await tester.openOkDialog();
22+
23+
expect(find.text('Title'), findsOneWidget);
24+
expect(find.text('This is message.'), findsOneWidget);
25+
await tester.tap(find.widgetWithText(TextButton, 'OK'));
26+
await tester.pumpAndSettle();
27+
28+
expect(container.read(resultProvider), OkCancelResult.ok);
29+
});
30+
testWidgets('barrier', (tester) async {
31+
final container = await tester.setUpAlert();
32+
await tester.openOkDialog();
33+
34+
await tester.tapBarrier();
35+
36+
expect(container.read(resultProvider), OkCancelResult.cancel);
37+
});
38+
39+
testWidgets('maybePop', (tester) async {
40+
final container = await tester.setUpAlert();
41+
await tester.openOkDialog();
42+
43+
final context = tester.element(find.text('Title'));
44+
await Navigator.of(context).maybePop();
45+
await tester.pumpAndSettle();
46+
47+
expect(container.read(resultProvider), OkCancelResult.cancel);
48+
});
49+
});
50+
51+
group('OK Dialog (canPop: false)', () {
52+
testWidgets('OK', (tester) async {
53+
final container = await tester.setUpAlert();
54+
await tester.openOkCanPopFalseDialog();
55+
56+
expect(find.text('Title'), findsOneWidget);
57+
expect(find.text('This is message.'), findsOneWidget);
58+
await tester.tap(find.widgetWithText(TextButton, 'OK'));
59+
await tester.pumpAndSettle();
60+
61+
expect(container.read(resultProvider), OkCancelResult.ok);
62+
});
63+
testWidgets('maybePop', (tester) async {
64+
final container = await tester.setUpAlert();
65+
await tester.openOkCanPopFalseDialog();
66+
67+
final context = tester.element(find.text('Title'));
68+
await Navigator.of(context).maybePop();
69+
await tester.pumpAndSettle();
70+
71+
expect(container.read(resultProvider), isNull);
72+
expect(find.text('Title'), findsOneWidget);
73+
});
74+
});
75+
76+
group('OK Dialog (barrierDismissible: false)', () {
77+
testWidgets('OK', (tester) async {
78+
final container = await tester.setUpAlert();
79+
await tester.openOkBarrierDismissibleFalseDialog();
80+
81+
expect(find.text('Title'), findsOneWidget);
82+
expect(find.text('This is message.'), findsOneWidget);
83+
await tester.tap(find.widgetWithText(TextButton, 'OK'));
84+
await tester.pumpAndSettle();
85+
86+
expect(container.read(resultProvider), OkCancelResult.ok);
87+
});
88+
testWidgets('barrier', (tester) async {
89+
final container = await tester.setUpAlert();
90+
await tester.openOkBarrierDismissibleFalseDialog();
91+
92+
await tester.tapBarrier();
93+
94+
expect(container.read(resultProvider), isNull);
95+
expect(find.text('Title'), findsOneWidget);
96+
});
97+
});
98+
}

Diff for: example/test/util.dart

+31
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)