Skip to content

Commit 97ef00b

Browse files
committed
implement widget testing for new added features
1 parent 7e78ad2 commit 97ef00b

File tree

7 files changed

+260
-74
lines changed

7 files changed

+260
-74
lines changed

lib/Components/add_tag_dialogue.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class _AddTagDialogueState extends State<AddTagDialogue>
9797
content: Builder(builder: (context) {
9898
return AnimatedContainer(
9999
duration: Duration(milliseconds: 200),
100+
constraints: BoxConstraints(),
100101
height: _showdropdown
101102
? hp - (600 - (50 * _itemsVisibleInDropdown - 1))
102103
: hp - 650,
@@ -105,6 +106,7 @@ class _AddTagDialogueState extends State<AddTagDialogue>
105106
children: [
106107
Text(
107108
'Set Tags',
109+
key: Key('Set Tags Text'),
108110
textAlign: TextAlign.center,
109111
style: TextStyle(
110112
color: ThemeProvider.theme(widget.index)
@@ -128,6 +130,7 @@ class _AddTagDialogueState extends State<AddTagDialogue>
128130
children: <Widget>[
129131
Expanded(
130132
child: TextFormField(
133+
key: Key('Tags Text Form Field'),
131134
controller: _textController,
132135
decoration: InputDecoration(
133136
fillColor: themeProvider.isDarkMode
@@ -145,9 +148,11 @@ class _AddTagDialogueState extends State<AddTagDialogue>
145148
icon: _showdropdown
146149
? Icon(
147150
Icons.keyboard_arrow_up_rounded,
151+
key: Key('Show Arrow Up Icon'),
148152
)
149153
: Icon(
150154
Icons.keyboard_arrow_down_rounded,
155+
key: Key('Show Arrow Down Icon'),
151156
),
152157
onPressed: () {
153158
SystemChannels.textInput
@@ -192,6 +197,7 @@ class _AddTagDialogueState extends State<AddTagDialogue>
192197
),
193198
),
194199
Container(
200+
key: Key('Tags List Container'),
195201
decoration: BoxDecoration(
196202
borderRadius: BorderRadius.circular(10),
197203
color: themeProvider.isDarkMode

lib/Components/filter_by_status.dart

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ class _FilterByStatusState extends State<FilterByStatus> {
119119
),
120120
),
121121
ListTile(
122+
key: Key('Downloading Torrent ListTile'),
122123
leading: Icon(
123124
Icons.download_sharp,
124125
size: 20,
@@ -197,6 +198,7 @@ class _FilterByStatusState extends State<FilterByStatus> {
197198
),
198199
),
199200
ListTile(
201+
key: Key('Seeding Torrent ListTile'),
200202
leading: Icon(
201203
Icons.upload_sharp,
202204
size: 20,
@@ -274,6 +276,7 @@ class _FilterByStatusState extends State<FilterByStatus> {
274276
),
275277
),
276278
ListTile(
279+
key: Key('Complete Torrent ListTile'),
277280
leading: Icon(
278281
Icons.done,
279282
size: 20,
@@ -351,6 +354,7 @@ class _FilterByStatusState extends State<FilterByStatus> {
351354
),
352355
),
353356
ListTile(
357+
key: Key('Stopped Torrent ListTile'),
354358
leading: Icon(
355359
Icons.stop,
356360
size: 20,
@@ -428,6 +432,7 @@ class _FilterByStatusState extends State<FilterByStatus> {
428432
),
429433
),
430434
ListTile(
435+
key: Key('Active Torrent ListTile'),
431436
leading: Icon(
432437
Icons.trending_up_outlined,
433438
size: 20,
@@ -505,6 +510,7 @@ class _FilterByStatusState extends State<FilterByStatus> {
505510
),
506511
),
507512
ListTile(
513+
key: Key('Inactive Torrent ListTile'),
508514
leading: Icon(
509515
Icons.trending_down_outlined,
510516
size: 20,
@@ -582,6 +588,7 @@ class _FilterByStatusState extends State<FilterByStatus> {
582588
),
583589
),
584590
ListTile(
591+
key: Key('Error Torrent ListTile'),
585592
leading: Icon(
586593
Icons.error,
587594
size: 20,
@@ -790,10 +797,8 @@ class _FilterByStatusState extends State<FilterByStatus> {
790797
trailing: Row(
791798
mainAxisSize: MainAxisSize.min,
792799
children: [
793-
filterModel.mapTags.values
794-
.toList()[index][1]
795-
.toString()
796-
.contains('0.0')
800+
filterModel.mapTags.values.toList()[index][1] ==
801+
0.0
797802
? Container()
798803
: Text(
799804
humanReadableByteCountSI(filterModel
@@ -1033,10 +1038,9 @@ class _FilterByStatusState extends State<FilterByStatus> {
10331038
trailing: Row(
10341039
mainAxisSize: MainAxisSize.min,
10351040
children: [
1036-
filterModel.maptrackerURIs.values
1037-
.toList()[index][1]
1038-
.toString()
1039-
.contains('0.0')
1041+
filterModel.maptrackerURIs.values.toList()[index]
1042+
[1] ==
1043+
0.0
10401044
? Container()
10411045
: Text(
10421046
humanReadableByteCountSI(filterModel

lib/Components/speed_graph.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class SpeedGraphState extends State<SpeedGraph> {
2323
builder: (context, themeProvider, _) {
2424
graph.updateDataSource(widget.model);
2525
return SfCartesianChart(
26+
key: Key('Speed Graph'),
2627
margin: EdgeInsets.all(0),
2728
borderWidth: 0,
2829
borderColor: Colors.transparent,

lib/Components/user_list.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class UsersListView extends StatelessWidget {
2121
itemCount: usersList.length,
2222
itemBuilder: (context, index) {
2323
return Container(
24+
key: Key('User list item container'),
2425
height: 50.0,
2526
padding: EdgeInsets.symmetric(vertical: 5),
2627
decoration: BoxDecoration(

lib/Pages/torrent_screen.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ class _TorrentScreenState extends State<TorrentScreen> {
183183
Flexible(
184184
flex: 1,
185185
child: ElevatedButton(
186+
key: Key("Show Chart Button"),
186187
style: ElevatedButton.styleFrom(
187188
alignment: Alignment.center,
188189
backgroundColor: graph.showChart
@@ -289,6 +290,7 @@ class _TorrentScreenState extends State<TorrentScreen> {
289290
padding: EdgeInsets.only(
290291
left: wp * 0.05, right: wp * 0.05),
291292
child: TextField(
293+
key: Key("Search Torrent TextField"),
292294
onChanged: (value) {
293295
setState(() {
294296
keyword = value;
@@ -300,6 +302,7 @@ class _TorrentScreenState extends State<TorrentScreen> {
300302
horizontal: 20, vertical: 20),
301303
hintText: 'Search Torrent',
302304
suffixIcon: Padding(
305+
key: Key("Filter Torrent ActionChip"),
303306
padding:
304307
const EdgeInsets.only(right: 5),
305308
child: ActionChip(
@@ -388,6 +391,8 @@ class _TorrentScreenState extends State<TorrentScreen> {
388391
.background,
389392
builder: (context) {
390393
return FilterByStatus(
394+
key: Key(
395+
"Filter By Status Bottom Sheet"),
391396
index: widget.index);
392397
},
393398
);

test/settings_screen_widget_test.dart

Lines changed: 69 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:flood_mobile/Components/settings_text_field.dart';
2+
import 'package:flood_mobile/Components/user_list.dart';
23
import 'package:flood_mobile/Constants/theme_provider.dart';
34
import 'package:flood_mobile/Model/client_settings_model.dart';
5+
import 'package:flood_mobile/Model/current_user_detail_model.dart';
46
import 'package:flood_mobile/Pages/settings_screen.dart';
57
import 'package:flood_mobile/Provider/api_provider.dart';
68
import 'package:flood_mobile/Provider/client_provider.dart';
@@ -18,42 +20,51 @@ class MockHomeProvider extends Mock implements HomeProvider {}
1820
class MockClientSettingsProvider extends Mock
1921
implements ClientSettingsProvider {}
2022

23+
class MockUserDetailProvider extends Mock implements UserDetailProvider {}
24+
2125
void main() {
2226
setUp(() {});
23-
UserDetailProvider userDetailProvider = UserDetailProvider();
27+
MockUserDetailProvider mockUserDetailProvider = MockUserDetailProvider();
2428
MockClientSettingsProvider mockClientSettingsProvider =
2529
MockClientSettingsProvider();
30+
when(() => mockUserDetailProvider.usersList).thenReturn([
31+
CurrentUserDetailModel(username: 'test username 1', level: 1),
32+
CurrentUserDetailModel(username: 'test username 2', level: 2),
33+
]);
34+
when(() => mockUserDetailProvider.token).thenReturn('token');
35+
when(() => mockUserDetailProvider.username).thenReturn('test username 1');
2636
when(() => mockClientSettingsProvider.clientSettings).thenReturn(
27-
ClientSettingsModel(
28-
dht: false,
29-
dhtPort: 1,
30-
directoryDefault: 'test directory',
31-
networkHttpMaxOpen: 2,
32-
networkLocalAddress: ['test networkLocalAddress'],
33-
networkMaxOpenFiles: 3,
34-
networkPortOpen: true,
35-
networkPortRandom: false,
36-
networkPortRange: 'test networkPortRange',
37-
piecesHashOnCompletion: true,
38-
piecesMemoryMax: 4,
39-
protocolPex: false,
40-
throttleGlobalDownSpeed: 5,
41-
throttleGlobalUpSpeed: 6,
42-
throttleMaxDownloads: 7,
43-
throttleMaxDownloadsGlobal: 8,
44-
throttleMaxPeersNormal: 9,
45-
throttleMaxPeersSeed: 10,
46-
throttleMaxUploads: 11,
47-
throttleMaxUploadsGlobal: 12,
48-
throttleMinPeersNormal: 13,
49-
throttleMinPeersSeed: 14,
50-
trackersNumWant: 15));
37+
ClientSettingsModel(
38+
dht: false,
39+
dhtPort: 1,
40+
directoryDefault: 'test directory',
41+
networkHttpMaxOpen: 2,
42+
networkLocalAddress: ['test networkLocalAddress'],
43+
networkMaxOpenFiles: 3,
44+
networkPortOpen: true,
45+
networkPortRandom: false,
46+
networkPortRange: 'test networkPortRange',
47+
piecesHashOnCompletion: true,
48+
piecesMemoryMax: 4,
49+
protocolPex: false,
50+
throttleGlobalDownSpeed: 5,
51+
throttleGlobalUpSpeed: 6,
52+
throttleMaxDownloads: 7,
53+
throttleMaxDownloadsGlobal: 8,
54+
throttleMaxPeersNormal: 9,
55+
throttleMaxPeersSeed: 10,
56+
throttleMaxUploads: 11,
57+
throttleMaxUploadsGlobal: 12,
58+
throttleMinPeersNormal: 13,
59+
throttleMinPeersSeed: 14,
60+
trackersNumWant: 15),
61+
);
5162

5263
Widget createWidgetUnderTest() {
5364
return MultiProvider(
5465
providers: [
5566
ChangeNotifierProvider<UserDetailProvider>(
56-
create: (context) => UserDetailProvider(),
67+
create: (context) => mockUserDetailProvider,
5768
),
5869
ChangeNotifierProvider<HomeProvider>(
5970
create: (context) => HomeProvider(),
@@ -296,43 +307,38 @@ void main() {
296307
});
297308

298309
testWidgets("Check authentication options", (WidgetTester tester) async {
299-
if (userDetailProvider.usersList.length != 0) {
300-
await tester.pumpWidget(createWidgetUnderTest());
301-
expect(
302-
find.byKey(Key('Authentication Expansion Card')), findsOneWidget);
303-
await tester
304-
.ensureVisible(find.byKey(Key('Authentication Expansion Card')));
305-
await tester.tap(find.byKey(Key('Authentication Expansion Card')));
306-
await tester.pumpAndSettle();
307-
expect(find.byKey(Key('Authentication option display column')),
308-
findsOneWidget);
309-
expect(find.text('Add User'), findsOneWidget);
310-
//check if all the text boxes of authentication option displayed
311-
expect(find.byType(SettingsTextField), findsNWidgets(9));
312-
//check if all the check boxes of authentication option displayed
313-
expect(find.byType(CheckboxListTile), findsNWidgets(3));
314-
//check if all the dropdown of authentication option displayed
315-
expect(find.byKey(Key('Authentication dropdown')), findsOneWidget);
316-
final dropdownFinder1 = find.byKey(Key('Authentication dropdown'));
317-
var dropdown1 = tester.firstWidget(dropdownFinder1) as DropdownButton;
318-
expect(dropdown1.value, 'rTorrent');
319-
expect(find.text('qBittorrent'), findsNWidgets(1));
320-
await tester.ensureVisible(find.byKey(Key('Authentication dropdown')));
321-
await tester.tap(find.byKey(Key('Authentication dropdown')));
322-
await tester.pumpAndSettle();
323-
expect(find.text('qBittorrent'), findsNWidgets(2));
324-
expect(find.byType(ElevatedButton), findsOneWidget);
325-
expect(find.text('Add'), findsOneWidget);
326-
} else {
327-
await tester.pumpWidget(createWidgetUnderTest());
328-
expect(
329-
find.byKey(Key('Authentication Expansion Card')), findsOneWidget);
330-
await tester
331-
.ensureVisible(find.byKey(Key('Authentication Expansion Card')));
332-
await tester.tap(find.byKey(Key('Authentication Expansion Card')));
333-
await tester.pumpAndSettle();
334-
expect(find.text('User is not Admin'), findsOneWidget);
335-
}
310+
await tester.pumpWidget(createWidgetUnderTest());
311+
expect(find.byKey(Key('Authentication Expansion Card')), findsOneWidget);
312+
await tester
313+
.ensureVisible(find.byKey(Key('Authentication Expansion Card')));
314+
await tester.tap(find.byKey(Key('Authentication Expansion Card')));
315+
await tester.pumpAndSettle();
316+
expect(find.byKey(Key('Authentication option display column')),
317+
findsOneWidget);
318+
expect(find.text('User Accounts'), findsOneWidget);
319+
//check if all the text boxes of user list displayed
320+
expect(find.byType(UsersListView), findsOneWidget);
321+
expect(find.byKey(Key('User list item container')), findsNWidgets(2));
322+
expect(find.text('test username 1'), findsOneWidget);
323+
expect(find.text('Current User'), findsOneWidget);
324+
expect(find.text('test username 2'), findsOneWidget);
325+
expect(find.text('Add User'), findsOneWidget);
326+
//check if all the text boxes of authentication option displayed
327+
expect(find.byType(SettingsTextField), findsNWidgets(9));
328+
//check if all the check boxes of authentication option displayed
329+
expect(find.byType(CheckboxListTile), findsNWidgets(3));
330+
//check if all the dropdown of authentication option displayed
331+
expect(find.byKey(Key('Authentication dropdown')), findsOneWidget);
332+
final dropdownFinder1 = find.byKey(Key('Authentication dropdown'));
333+
var dropdown1 = tester.firstWidget(dropdownFinder1) as DropdownButton;
334+
expect(dropdown1.value, 'rTorrent');
335+
expect(find.text('qBittorrent'), findsNWidgets(1));
336+
await tester.ensureVisible(find.byKey(Key('Authentication dropdown')));
337+
await tester.tap(find.byKey(Key('Authentication dropdown')));
338+
await tester.pumpAndSettle();
339+
expect(find.text('qBittorrent'), findsNWidgets(2));
340+
expect(find.byType(ElevatedButton), findsOneWidget);
341+
expect(find.text('Add'), findsOneWidget);
336342
});
337343
});
338344
}

0 commit comments

Comments
 (0)