Skip to content

Commit f02bd4b

Browse files
test: update integration test to cover more cases
1 parent c35b673 commit f02bd4b

File tree

2 files changed

+186
-103
lines changed

2 files changed

+186
-103
lines changed

flutter_secure_storage/example/integration_test/app_test.dart

Lines changed: 177 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -3,138 +3,216 @@ import 'package:flutter_secure_storage_example/main.dart';
33
import 'package:flutter_test/flutter_test.dart';
44

55
void main() {
6-
testWidgets('Secure Storage Example', (WidgetTester tester) async {
7-
await tester.pumpWidget(const MaterialApp(home: HomePage()));
8-
await tester.pumpAndSettle();
9-
10-
final pageObject = HomePageObject(tester);
11-
12-
await pageObject.deleteAll();
13-
pageObject.hasNoRow(0);
14-
15-
await pageObject.addRandom();
16-
await Future<dynamic>.delayed(const Duration(seconds: 5));
17-
pageObject.hasRow(0);
18-
await pageObject.addRandom();
19-
await Future<dynamic>.delayed(const Duration(seconds: 5));
20-
pageObject.hasRow(1);
21-
22-
await pageObject.editRow('Row 0', 0);
23-
await Future<dynamic>.delayed(const Duration(seconds: 5));
24-
await pageObject.editRow('Row 1', 1);
25-
26-
await Future<dynamic>.delayed(const Duration(seconds: 5));
27-
28-
pageObject.rowHasTitle('Row 0', 0);
29-
await Future<dynamic>.delayed(const Duration(seconds: 5));
30-
pageObject.rowHasTitle('Row 1', 1);
31-
32-
await Future<dynamic>.delayed(const Duration(seconds: 5));
33-
34-
await pageObject.deleteRow(1);
35-
await Future<dynamic>.delayed(const Duration(seconds: 5));
36-
pageObject.hasNoRow(1);
37-
38-
await Future<dynamic>.delayed(const Duration(seconds: 5));
39-
40-
pageObject.rowHasTitle('Row 0', 0);
41-
await Future<dynamic>.delayed(const Duration(seconds: 5));
42-
await pageObject.deleteRow(0);
43-
await Future<dynamic>.delayed(const Duration(seconds: 5));
44-
pageObject.hasNoRow(0);
45-
46-
await Future<dynamic>.delayed(const Duration(seconds: 5));
47-
48-
await pageObject.isProtectedDataAvailable();
49-
50-
await pageObject.deleteAll();
6+
group('Secure Storage Tests', () {
7+
testWidgets('Add a Random Row', (WidgetTester tester) async {
8+
final pageObject = await _setupHomePage(tester);
9+
await pageObject.addRandomRow();
10+
pageObject.verifyRowExists(0);
11+
});
12+
13+
testWidgets('Edit a Row Value', (WidgetTester tester) async {
14+
final pageObject = await _setupHomePage(tester);
15+
await pageObject.addRandomRow();
16+
await pageObject.editValue('Updated Row', 0);
17+
pageObject.verifyValue('Updated Row', 0);
18+
});
19+
20+
testWidgets('Delete a Row', (WidgetTester tester) async {
21+
final pageObject = await _setupHomePage(tester);
22+
await pageObject.addRandomRow();
23+
await pageObject.deleteRow(0);
24+
pageObject.verifyRowDoesNotExist(0);
25+
});
26+
27+
testWidgets('Check Protected Data Availability',
28+
(WidgetTester tester) async {
29+
final pageObject = await _setupHomePage(tester);
30+
await pageObject.checkProtectedDataAvailability();
31+
});
32+
33+
testWidgets('Contains Key for a Row', (WidgetTester tester) async {
34+
final pageObject = await _setupHomePage(tester);
35+
await pageObject.addRandomRow();
36+
await pageObject.containsKeyForRow(0, expectedResult: true);
37+
});
38+
39+
testWidgets('Read Value for a Row', (WidgetTester tester) async {
40+
final pageObject = await _setupHomePage(tester);
41+
await pageObject.addRandomRow();
42+
await pageObject.editValue('Read Test', 0); // Ensure there's a value
43+
await pageObject.readValueForRow(
44+
0,
45+
expectedValue: 'Read Test',
46+
);
47+
});
48+
49+
testWidgets('Add Multiple Rows and Verify', (WidgetTester tester) async {
50+
final pageObject = await _setupHomePage(tester);
51+
await pageObject.addRandomRow();
52+
await pageObject.addRandomRow();
53+
pageObject
54+
..verifyRowExists(0)
55+
..verifyRowExists(1);
56+
});
57+
58+
testWidgets('Edit Multiple Rows', (WidgetTester tester) async {
59+
final pageObject = await _setupHomePage(tester);
60+
await pageObject.addRandomRow();
61+
await pageObject.addRandomRow();
62+
await pageObject.editValue('First Row', 0);
63+
await pageObject.editValue('Second Row', 1);
64+
pageObject
65+
..verifyValue('First Row', 0)
66+
..verifyValue('Second Row', 1);
67+
});
68+
69+
testWidgets('Delete All Rows', (WidgetTester tester) async {
70+
final pageObject = await _setupHomePage(tester);
71+
await pageObject.addRandomRow();
72+
await pageObject.addRandomRow();
73+
await pageObject.deleteAll();
74+
pageObject
75+
..verifyRowDoesNotExist(0)
76+
..verifyRowDoesNotExist(1);
77+
});
5178
});
5279
}
5380

81+
Future<HomePageObject> _setupHomePage(WidgetTester tester) async {
82+
await tester.pumpWidget(const MaterialApp(home: HomePage()));
83+
await tester.pumpAndSettle();
84+
final pageObject = HomePageObject(tester);
85+
await pageObject.deleteAll();
86+
return pageObject;
87+
}
88+
5489
class HomePageObject {
5590
HomePageObject(this.tester);
5691

5792
final WidgetTester tester;
58-
final Finder _addRandomButtonFinder = find.byKey(const Key('add_random'));
59-
final Finder _deleteAllButtonFinder = find.byKey(const Key('delete_all'));
60-
final Finder _popUpMenuButtonFinder = find.byKey(const Key('popup_menu'));
61-
final Finder _isProtectedDataAvailableButtonFinder =
93+
final Finder _addRandomButton = find.byKey(const Key('add_random'));
94+
final Finder _deleteAllButton = find.byKey(const Key('delete_all'));
95+
final Finder _popupMenuButton = find.byKey(const Key('popup_menu'));
96+
final Finder _protectedDataButton =
6297
find.byKey(const Key('is_protected_data_available'));
6398

6499
Future<void> deleteAll() async {
65-
expect(_popUpMenuButtonFinder, findsOneWidget);
66-
await tester.tap(_popUpMenuButtonFinder);
67-
await tester.pumpAndSettle();
100+
await _tap(_popupMenuButton);
101+
await _tap(_deleteAllButton);
102+
}
68103

69-
expect(_deleteAllButtonFinder, findsOneWidget);
70-
await tester.tap(_deleteAllButtonFinder);
71-
await tester.pumpAndSettle();
104+
Future<void> addRandomRow() async {
105+
await _tap(_addRandomButton);
72106
}
73107

74-
Future<void> addRandom() async {
75-
expect(_addRandomButtonFinder, findsOneWidget);
76-
await tester.tap(_addRandomButtonFinder);
108+
Future<void> editValue(String newValue, int index) async {
109+
await _tap(find.byKey(Key('popup_row_$index')));
110+
await _tap(find.byKey(Key('edit_row_$index')));
111+
112+
final textField = find.byKey(const Key('value_field'));
113+
expect(textField, findsOneWidget, reason: 'Value text field not found');
114+
await tester.enterText(textField, newValue);
77115
await tester.pumpAndSettle();
116+
117+
await _tap(find.byKey(const Key('save')));
78118
}
79119

80-
Future<void> editRow(String title, int index) async {
81-
final popupRow = find.byKey(Key('popup_row_$index'));
82-
expect(popupRow, findsOneWidget);
83-
await tester.tap(popupRow);
84-
await tester.pumpAndSettle();
120+
Future<void> deleteRow(int index) async {
121+
await _tap(find.byKey(Key('popup_row_$index')));
122+
await _tap(find.byKey(Key('delete_row_$index')));
123+
}
124+
125+
Future<void> checkProtectedDataAvailability() async {
126+
await _tap(_popupMenuButton);
127+
await _tap(_protectedDataButton);
128+
}
85129

86-
final editRow = find.byKey(Key('edit_row_$index'));
87-
expect(editRow, findsOneWidget);
88-
await tester.tap(editRow);
130+
Future<void> containsKeyForRow(
131+
int index, {
132+
required bool expectedResult,
133+
}) async {
134+
await _tap(find.byKey(Key('popup_row_$index')));
135+
await _tap(find.byKey(Key('contains_row_$index')));
136+
137+
final keyFinder = find.byKey(Key('key_row_$index'));
138+
expect(keyFinder, findsOneWidget, reason: 'Row $index not found');
139+
final keyWidget = tester.widget<Text>(keyFinder);
140+
141+
// Enter key in the dialog
142+
final textField = find.byType(TextField);
143+
expect(textField, findsOneWidget);
144+
await tester.enterText(textField, keyWidget.data!);
89145
await tester.pumpAndSettle();
90146

91-
final textFieldFinder = find.byKey(const Key('title_field'));
92-
expect(textFieldFinder, findsOneWidget);
93-
await tester.tap(textFieldFinder);
147+
// Confirm the action
148+
await tester.tap(find.text('OK'));
94149
await tester.pumpAndSettle();
95150

96-
await tester.enterText(textFieldFinder, title);
151+
// Verify the SnackBar message
152+
final expectedText = 'Contains Key: $expectedResult';
153+
expect(find.textContaining(expectedText), findsOneWidget);
154+
}
155+
156+
Future<void> readValueForRow(
157+
int index, {
158+
required String expectedValue,
159+
}) async {
160+
await _tap(find.byKey(Key('popup_row_$index')));
161+
await _tap(find.byKey(Key('read_row_$index')));
162+
163+
final keyFinder = find.byKey(Key('key_row_$index'));
164+
expect(keyFinder, findsOneWidget, reason: 'Row $index not found');
165+
final keyWidget = tester.widget<Text>(keyFinder);
166+
167+
// Enter key in the dialog
168+
final textField = find.byType(TextField);
169+
expect(textField, findsOneWidget);
170+
await tester.enterText(textField, keyWidget.data!);
97171
await tester.pumpAndSettle();
98172

99-
final saveButtonFinder = find.byKey(const Key('save'));
100-
expect(saveButtonFinder, findsOneWidget);
101-
await tester.tap(saveButtonFinder);
173+
// Confirm the action
174+
await tester.tap(find.text('OK'));
102175
await tester.pumpAndSettle();
103-
}
104176

105-
void rowHasTitle(String title, int index) {
106-
final titleRow = find.byKey(Key('title_row_$index'));
107-
expect(titleRow, findsOneWidget);
108-
expect((titleRow.evaluate().single.widget as Text).data, equals(title));
177+
// Verify the SnackBar message
178+
expect(find.text('value: $expectedValue'), findsOneWidget);
109179
}
110180

111-
void hasRow(int index) {
112-
expect(find.byKey(Key('title_row_$index')), findsOneWidget);
181+
void verifyValue(String expectedValue, int index) {
182+
final valueFinder = find.byKey(Key('value_row_$index'));
183+
expect(valueFinder, findsOneWidget, reason: 'Row $index not found');
184+
final textWidget = tester.widget<Text>(valueFinder);
185+
expect(
186+
textWidget.data,
187+
equals(expectedValue),
188+
reason: 'Expected "$expectedValue" but found "${textWidget.data}" in row '
189+
'$index',
190+
);
113191
}
114192

115-
Future<void> deleteRow(int index) async {
116-
final popupRow = find.byKey(Key('popup_row_$index'));
117-
expect(popupRow, findsOneWidget);
118-
await tester.tap(popupRow);
119-
await tester.pumpAndSettle();
120-
121-
final deleteRow = find.byKey(Key('delete_row_$index'));
122-
expect(deleteRow, findsOneWidget);
123-
await tester.tap(deleteRow);
124-
await tester.pumpAndSettle();
193+
void verifyRowExists(int index) {
194+
expect(
195+
find.byKey(Key('value_row_$index')),
196+
findsOneWidget,
197+
reason: 'Expected row $index to exist',
198+
);
125199
}
126200

127-
void hasNoRow(int index) {
128-
expect(find.byKey(Key('title_row_$index')), findsNothing);
201+
void verifyRowDoesNotExist(int index) {
202+
expect(
203+
find.byKey(Key('value_row_$index')),
204+
findsNothing,
205+
reason: 'Expected row $index to be absent',
206+
);
129207
}
130208

131-
Future<void> isProtectedDataAvailable() async {
132-
expect(_popUpMenuButtonFinder, findsOneWidget);
133-
await tester.tap(_popUpMenuButtonFinder);
134-
await tester.pumpAndSettle();
135-
136-
expect(_isProtectedDataAvailableButtonFinder, findsOneWidget);
137-
await tester.tap(_isProtectedDataAvailableButtonFinder);
209+
Future<void> _tap(Finder finder) async {
210+
expect(
211+
finder,
212+
findsOneWidget,
213+
reason: 'Widget not found for tapping: $finder',
214+
);
215+
await tester.tap(finder);
138216
await tester.pumpAndSettle();
139217
}
140218
}

flutter_secure_storage/example/lib/main.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,18 +183,23 @@ class HomePageState extends State<HomePage> {
183183
value: _ItemActions.read,
184184
child: Text(
185185
'Read',
186-
key: Key('contains_row_$index'),
186+
key: Key('read_row_$index'),
187187
),
188188
),
189189
],
190190
),
191+
leading: const Column(
192+
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
193+
crossAxisAlignment: CrossAxisAlignment.start,
194+
children: [Text('Value'), Text('Key')],
195+
),
191196
title: Text(
192197
_items[index].value,
193-
key: Key('title_row_$index'),
198+
key: Key('value_row_$index'),
194199
),
195200
subtitle: Text(
196201
_items[index].key,
197-
key: Key('subtitle_row_$index'),
202+
key: Key('key_row_$index'),
198203
),
199204
),
200205
),
@@ -291,7 +296,7 @@ class _EditItemWidget extends StatelessWidget {
291296
return AlertDialog(
292297
title: const Text('Edit item'),
293298
content: TextField(
294-
key: const Key('title_field'),
299+
key: const Key('value_field'),
295300
controller: _controller,
296301
autofocus: true,
297302
),

0 commit comments

Comments
 (0)