@@ -3,138 +3,216 @@ import 'package:flutter_secure_storage_example/main.dart';
3
3
import 'package:flutter_test/flutter_test.dart' ;
4
4
5
5
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
+ });
51
78
});
52
79
}
53
80
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
+
54
89
class HomePageObject {
55
90
HomePageObject (this .tester);
56
91
57
92
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 =
62
97
find.byKey (const Key ('is_protected_data_available' ));
63
98
64
99
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
+ }
68
103
69
- expect (_deleteAllButtonFinder, findsOneWidget);
70
- await tester.tap (_deleteAllButtonFinder);
71
- await tester.pumpAndSettle ();
104
+ Future <void > addRandomRow () async {
105
+ await _tap (_addRandomButton);
72
106
}
73
107
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);
77
115
await tester.pumpAndSettle ();
116
+
117
+ await _tap (find.byKey (const Key ('save' )));
78
118
}
79
119
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
+ }
85
129
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! );
89
145
await tester.pumpAndSettle ();
90
146
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' ));
94
149
await tester.pumpAndSettle ();
95
150
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! );
97
171
await tester.pumpAndSettle ();
98
172
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' ));
102
175
await tester.pumpAndSettle ();
103
- }
104
176
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);
109
179
}
110
180
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
+ );
113
191
}
114
192
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
+ );
125
199
}
126
200
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
+ );
129
207
}
130
208
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 );
138
216
await tester.pumpAndSettle ();
139
217
}
140
218
}
0 commit comments