From 85468ac55ee36745c5f4a9f59bcd749e64a1e9a8 Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Sun, 4 Aug 2024 02:04:35 +0530 Subject: [PATCH] test: dialog tests --- lib/widgets/dialog_rename.dart | 113 ++++++++---- .../his_response_pane_test.dart | 56 ++++++ .../history_widgets/his_url_card_test.dart | 51 +++++ .../dialog_history_retention_test.dart | 150 +++++++++++++++ test/widgets/dialog_rename_test.dart | 146 +++++++++++++++ test/widgets/dropdown_codegen_test.dart | 49 +++++ test/widgets/dropdown_content_type_test.dart | 49 +++++ test/widgets/dropdown_formdata_test.dart | 49 +++++ test/widgets/dropdowns_http_method_test.dart | 48 +++++ test/widgets/dropdowns_test.dart | 174 ------------------ 10 files changed, 673 insertions(+), 212 deletions(-) create mode 100644 test/screens/history/history_widgets/his_response_pane_test.dart create mode 100644 test/screens/history/history_widgets/his_url_card_test.dart create mode 100644 test/widgets/dialog_history_retention_test.dart create mode 100644 test/widgets/dialog_rename_test.dart create mode 100644 test/widgets/dropdown_codegen_test.dart create mode 100644 test/widgets/dropdown_content_type_test.dart create mode 100644 test/widgets/dropdown_formdata_test.dart create mode 100644 test/widgets/dropdowns_http_method_test.dart delete mode 100644 test/widgets/dropdowns_test.dart diff --git a/lib/widgets/dialog_rename.dart b/lib/widgets/dialog_rename.dart index 4b78e987..ee2f9f77 100644 --- a/lib/widgets/dialog_rename.dart +++ b/lib/widgets/dialog_rename.dart @@ -10,44 +10,81 @@ showRenameDialog( showDialog( context: context, builder: (context) { - final controller = TextEditingController(text: name ?? ""); - controller.selection = - TextSelection(baseOffset: 0, extentOffset: controller.text.length); - return AlertDialog( - icon: const Icon(Icons.edit_rounded), - iconColor: Theme.of(context).colorScheme.primary, - title: Text(dialogTitle), - titleTextStyle: Theme.of(context).textTheme.titleLarge, - content: Container( - padding: kPt20, - width: 300, - child: TextField( - autofocus: true, - controller: controller, - decoration: const InputDecoration( - hintText: "Enter new name", - border: OutlineInputBorder( - borderRadius: kBorderRadius12, - )), - ), - ), - actions: [ - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: const Text('Cancel')), - TextButton( - onPressed: () { - final val = controller.text.trim(); - onRename(val); - Navigator.pop(context); - Future.delayed(const Duration(milliseconds: 100), () { - controller.dispose(); - }); - }, - child: const Text('Ok')), - ], + return RenameDialogContent( + dialogTitle: dialogTitle, + onRename: onRename, + name: name, ); }); } + +class RenameDialogContent extends StatefulWidget { + const RenameDialogContent({ + super.key, + required this.dialogTitle, + required this.onRename, + this.name, + }); + + final String dialogTitle; + final Function(String) onRename; + final String? name; + + @override + State createState() => _RenameDialogContentState(); +} + +class _RenameDialogContentState extends State { + late TextEditingController controller; + + @override + void initState() { + super.initState(); + controller = TextEditingController(text: widget.name ?? ""); + controller.selection = + TextSelection(baseOffset: 0, extentOffset: controller.text.length); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + icon: const Icon(Icons.edit_rounded), + iconColor: Theme.of(context).colorScheme.primary, + title: Text(widget.dialogTitle), + titleTextStyle: Theme.of(context).textTheme.titleLarge, + content: Container( + padding: kPt20, + width: 300, + child: TextField( + autofocus: true, + controller: controller, + decoration: const InputDecoration( + hintText: "Enter new name", + border: OutlineInputBorder( + borderRadius: kBorderRadius12, + )), + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text('Cancel')), + TextButton( + onPressed: () { + final val = controller.text.trim(); + widget.onRename(val); + Navigator.pop(context); + }, + child: const Text('Ok')), + ], + ); + } +} diff --git a/test/screens/history/history_widgets/his_response_pane_test.dart b/test/screens/history/history_widgets/his_response_pane_test.dart new file mode 100644 index 00000000..f45aadda --- /dev/null +++ b/test/screens/history/history_widgets/his_response_pane_test.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:apidash/providers/providers.dart'; +import 'package:apidash/widgets/response_widgets.dart'; +import 'package:apidash/screens/history/history_widgets/his_response_pane.dart'; + +import '../../../models/history_models.dart'; + +void main() { + group('HistoryResponsePane Widget Tests', () { + testWidgets('displays "No Request Selected" when no request is selected', + (tester) async { + await tester.pumpWidget( + ProviderScope( + overrides: [ + selectedHistoryIdStateProvider.overrideWith((ref) => null), + selectedHistoryRequestModelProvider.overrideWith((ref) => null), + ], + child: const MaterialApp( + home: Scaffold( + body: HistoryResponsePane(), + ), + ), + ), + ); + + expect(find.text("No Request Selected"), findsOneWidget); + }); + + testWidgets( + 'displays ResponsePaneHeader and ResponseTabView when a request is selected', + (tester) async { + final historyRequestModel = historyRequestModel1; + + await tester.pumpWidget( + ProviderScope( + overrides: [ + selectedHistoryIdStateProvider + .overrideWith((ref) => historyRequestModel.historyId), + selectedHistoryRequestModelProvider + .overrideWith((ref) => historyRequestModel), + ], + child: const MaterialApp( + home: Scaffold( + body: HistoryResponsePane(), + ), + ), + ), + ); + + expect(find.byType(ResponsePaneHeader), findsOneWidget); + expect(find.byType(ResponseTabView), findsOneWidget); + }); + }); +} diff --git a/test/screens/history/history_widgets/his_url_card_test.dart b/test/screens/history/history_widgets/his_url_card_test.dart new file mode 100644 index 00000000..6723fefb --- /dev/null +++ b/test/screens/history/history_widgets/his_url_card_test.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:apidash/screens/history/history_widgets/his_url_card.dart'; + +import '../../../models/history_models.dart'; + +void main() { + group('Testing HistoryURLCard', () { + final historyRequestModel = historyRequestModel1; + + testWidgets('Testing with given HistoryRequestModel', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: HistoryURLCard(historyRequestModel: historyRequestModel), + ), + ), + ); + + expect(find.byType(HistoryURLCard), findsOneWidget); + }); + + testWidgets('Testing if displays correct request method', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: HistoryURLCard(historyRequestModel: historyRequestModel), + ), + ), + ); + + expect( + find.text( + historyRequestModel.httpRequestModel.method.name.toUpperCase()), + findsOneWidget); + }); + + testWidgets('Testing if displays correct URL', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: HistoryURLCard(historyRequestModel: historyRequestModel), + ), + ), + ); + + expect( + find.text(historyRequestModel.httpRequestModel.url), findsOneWidget); + }); + }); +} diff --git a/test/widgets/dialog_history_retention_test.dart b/test/widgets/dialog_history_retention_test.dart new file mode 100644 index 00000000..b48c7018 --- /dev/null +++ b/test/widgets/dialog_history_retention_test.dart @@ -0,0 +1,150 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash/widgets/dialog_history_retention.dart'; + +void main() { + group('showHistoryRetentionDialog Tests', () { + testWidgets('Testing History Retention dialog content', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showHistoryRetentionDialog( + context, + HistoryRetentionPeriod.forever, + (period) {}, + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + + expect(find.text('Manage History'), findsOneWidget); + expect(find.byIcon(Icons.manage_history_rounded), findsOneWidget); + + expect(find.byType(RadioListTile), + findsNWidgets(HistoryRetentionPeriod.values.length)); + }); + + testWidgets('updates selected retention period correctly', (tester) async { + HistoryRetentionPeriod selectedPeriod = HistoryRetentionPeriod.forever; + + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showHistoryRetentionDialog( + context, + selectedPeriod, + (period) { + selectedPeriod = period; + }, + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + + await tester.tap(find.text(HistoryRetentionPeriod.oneWeek.label)); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Confirm')); + await tester.pumpAndSettle(); + + expect(selectedPeriod, HistoryRetentionPeriod.oneWeek); + }); + + testWidgets('Cancel button closes dialog without changing retention period', + (tester) async { + HistoryRetentionPeriod selectedPeriod = HistoryRetentionPeriod.oneWeek; + + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showHistoryRetentionDialog( + context, + selectedPeriod, + (period) { + selectedPeriod = period; + }, + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Cancel')); + await tester.pumpAndSettle(); + + expect(find.byType(AlertDialog), findsNothing); + expect(selectedPeriod, HistoryRetentionPeriod.oneWeek); + }); + + testWidgets( + 'Confirm button closes dialog and calls onRetentionPeriodChange', + (tester) async { + HistoryRetentionPeriod selectedPeriod = + HistoryRetentionPeriod.threeMonths; + HistoryRetentionPeriod newPeriod = HistoryRetentionPeriod.oneWeek; + + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showHistoryRetentionDialog( + context, + selectedPeriod, + (period) { + selectedPeriod = period; + }, + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + + await tester.tap(find.text(newPeriod.label)); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Confirm')); + await tester.pumpAndSettle(); + + expect(find.byType(AlertDialog), findsNothing); + expect(selectedPeriod, newPeriod); + }); + }); +} diff --git a/test/widgets/dialog_rename_test.dart b/test/widgets/dialog_rename_test.dart new file mode 100644 index 00000000..208a7b13 --- /dev/null +++ b/test/widgets/dialog_rename_test.dart @@ -0,0 +1,146 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:apidash/widgets/dialog_rename.dart'; + +void main() { + group('showRenameDialog Tests', () { + testWidgets('displays dialog with correct content', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showRenameDialog( + context, + 'Rename Item', + 'Old Name', + (newName) {}, + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + + expect(find.text('Rename Item'), findsOneWidget); + expect(find.byIcon(Icons.edit_rounded), findsOneWidget); + + expect(find.byType(TextField), findsOneWidget); + expect(find.text('Old Name'), findsOneWidget); + }); + + testWidgets('calls onRename with new name when Ok is pressed', + (tester) async { + String? renamedValue; + + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showRenameDialog( + context, + 'Rename Item', + 'Old Name', + (newName) { + renamedValue = newName; + }, + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + + await tester.enterText(find.byType(TextField), 'New Name'); + await tester.tap(find.text('Ok')); + await tester.pumpAndSettle(); + + expect(renamedValue, 'New Name'); + }); + + testWidgets('does not call onRename when Cancel is pressed', + (tester) async { + String? renamedValue; + + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showRenameDialog( + context, + 'Rename Item', + 'Old Name', + (newName) { + renamedValue = newName; + }, + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + + await tester.enterText(find.byType(TextField), 'New Name'); + await tester.tap(find.text('Cancel')); + await tester.pumpAndSettle(); + + expect(renamedValue, isNull); + }); + + testWidgets('disposes TextEditingController after dialog is closed', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Builder( + builder: (context) { + return ElevatedButton( + onPressed: () { + showRenameDialog( + context, + 'Rename Item', + 'Old Name', + (newName) {}, + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ), + ); + + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + + final textFieldFinder = find.byType(TextField); + expect(textFieldFinder, findsOneWidget); + + await tester.tap(find.text('Ok')); + await tester.pumpAndSettle(); + + expect(textFieldFinder, findsNothing); + }); + }); +} diff --git a/test/widgets/dropdown_codegen_test.dart b/test/widgets/dropdown_codegen_test.dart new file mode 100644 index 00000000..01432b10 --- /dev/null +++ b/test/widgets/dropdown_codegen_test.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:apidash/widgets/widgets.dart'; +import 'package:apidash/consts.dart'; +import '../test_consts.dart'; + +void main() { + testWidgets('Testing Dropdown for Codegen', (tester) async { + dynamic changedValue; + await tester.pumpWidget( + MaterialApp( + title: 'Dropdown Codegen Type testing', + theme: kThemeDataLight, + home: Scaffold( + body: Center( + child: Column( + children: [ + DropdownButtonCodegenLanguage( + codegenLanguage: CodegenLanguage.curl, + onChanged: (value) { + changedValue = value!; + }, + ), + ], + ), + ), + ), + ), + ); + + expect(find.byIcon(Icons.unfold_more_rounded), findsOneWidget); + expect(find.byType(DropdownButton), findsOneWidget); + expect( + (tester.widget(find.byType(DropdownButton)) + as DropdownButton) + .value, + equals(CodegenLanguage.curl)); + + await tester.tap(find.text('cURL')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + await tester.tap(find.text('Dart (dio)').last); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + expect(changedValue, CodegenLanguage.dartDio); + }); +} diff --git a/test/widgets/dropdown_content_type_test.dart b/test/widgets/dropdown_content_type_test.dart new file mode 100644 index 00000000..62e10cc6 --- /dev/null +++ b/test/widgets/dropdown_content_type_test.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:apidash/widgets/widgets.dart'; +import 'package:apidash/consts.dart'; +import '../test_consts.dart'; + +void main() { + testWidgets('Testing Dropdown for Content Type', (tester) async { + dynamic changedValue; + await tester.pumpWidget( + MaterialApp( + title: 'Dropdown Content Type testing', + theme: kThemeDataLight, + home: Scaffold( + body: Center( + child: Column( + children: [ + DropdownButtonContentType( + contentType: ContentType.json, + onChanged: (value) { + changedValue = value!; + }, + ), + ], + ), + ), + ), + ), + ); + + expect(find.byIcon(Icons.unfold_more_rounded), findsOneWidget); + expect(find.byType(DropdownButton), findsOneWidget); + expect( + (tester.widget(find.byType(DropdownButton)) + as DropdownButton) + .value, + equals(ContentType.json)); + + await tester.tap(find.text('json')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + await tester.tap(find.text('text').last); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + expect(changedValue, ContentType.text); + }); +} diff --git a/test/widgets/dropdown_formdata_test.dart b/test/widgets/dropdown_formdata_test.dart new file mode 100644 index 00000000..2b7b5238 --- /dev/null +++ b/test/widgets/dropdown_formdata_test.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:apidash/widgets/widgets.dart'; +import 'package:apidash/consts.dart'; +import '../test_consts.dart'; + +void main() { + testWidgets('Testing Dropdown for FormData', (tester) async { + dynamic changedValue; + await tester.pumpWidget( + MaterialApp( + title: 'Dropdown FormData Type testing', + theme: kThemeDataLight, + home: Scaffold( + body: Center( + child: Column( + children: [ + DropdownButtonFormData( + formDataType: FormDataType.file, + onChanged: (value) { + changedValue = value!; + }, + ), + ], + ), + ), + ), + ), + ); + + expect(find.byIcon(Icons.unfold_more_rounded), findsOneWidget); + expect(find.byType(DropdownButton), findsOneWidget); + expect( + (tester.widget(find.byType(DropdownButton)) + as DropdownButton) + .value, + equals(FormDataType.file)); + + await tester.tap(find.text('file')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + await tester.tap(find.text('text').last); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + expect(changedValue, FormDataType.text); + }); +} diff --git a/test/widgets/dropdowns_http_method_test.dart b/test/widgets/dropdowns_http_method_test.dart new file mode 100644 index 00000000..663face7 --- /dev/null +++ b/test/widgets/dropdowns_http_method_test.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:apidash/widgets/widgets.dart'; +import 'package:apidash/consts.dart'; +import '../test_consts.dart'; + +void main() { + testWidgets('Testing Dropdown for Http Method', (tester) async { + dynamic changedValue; + await tester.pumpWidget( + MaterialApp( + title: 'Dropdown Http method testing', + theme: kThemeDataLight, + home: Scaffold( + body: Center( + child: Column( + children: [ + DropdownButtonHttpMethod( + method: HTTPVerb.post, + onChanged: (value) { + changedValue = value!; + }, + ), + ], + ), + ), + ), + ), + ); + + expect(find.byIcon(Icons.unfold_more_rounded), findsOneWidget); + expect(find.byType(DropdownButton), findsOneWidget); + expect( + (tester.widget(find.byType(DropdownButton)) as DropdownButton) + .value, + equals(HTTPVerb.post)); + + await tester.tap(find.text('POST')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + await tester.tap(find.text('PUT').last); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + expect(changedValue, HTTPVerb.put); + }); +} diff --git a/test/widgets/dropdowns_test.dart b/test/widgets/dropdowns_test.dart deleted file mode 100644 index cca255fc..00000000 --- a/test/widgets/dropdowns_test.dart +++ /dev/null @@ -1,174 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:apidash/widgets/widgets.dart'; -import 'package:apidash/consts.dart'; -import '../test_consts.dart'; - -void main() { - testWidgets('Testing Dropdowns', (tester) async { - dynamic changedValue; - await tester.pumpWidget( - MaterialApp( - title: 'Dropdown testing', - theme: kThemeDataLight, - home: Scaffold( - body: Center( - child: Column( - children: [ - DropdownButtonHttpMethod( - method: HTTPVerb.post, - onChanged: (value) { - changedValue = value!; - }, - ), - ], - ), - ), - ), - ), - ); - - expect(find.byIcon(Icons.unfold_more_rounded), findsOneWidget); - expect(find.byType(DropdownButton), findsOneWidget); - expect( - (tester.widget(find.byType(DropdownButton)) as DropdownButton) - .value, - equals(HTTPVerb.post)); - - await tester.tap(find.text('POST')); - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); - - await tester.tap(find.text('PUT').last); - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); - - expect(changedValue, HTTPVerb.put); - }); - - testWidgets('Testing Dropdown for Content Type', (tester) async { - dynamic changedValue; - await tester.pumpWidget( - MaterialApp( - title: 'Dropdown Content Type testing', - theme: kThemeDataLight, - home: Scaffold( - body: Center( - child: Column( - children: [ - DropdownButtonContentType( - contentType: ContentType.json, - onChanged: (value) { - changedValue = value!; - }, - ), - ], - ), - ), - ), - ), - ); - - expect(find.byIcon(Icons.unfold_more_rounded), findsOneWidget); - expect(find.byType(DropdownButton), findsOneWidget); - expect( - (tester.widget(find.byType(DropdownButton)) - as DropdownButton) - .value, - equals(ContentType.json)); - - await tester.tap(find.text('json')); - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); - - await tester.tap(find.text('text').last); - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); - - expect(changedValue, ContentType.text); - }); - - testWidgets('Testing Dropdown for FormData', (tester) async { - dynamic changedValue; - await tester.pumpWidget( - MaterialApp( - title: 'Dropdown FormData Type testing', - theme: kThemeDataLight, - home: Scaffold( - body: Center( - child: Column( - children: [ - DropdownButtonFormData( - formDataType: FormDataType.file, - onChanged: (value) { - changedValue = value!; - }, - ), - ], - ), - ), - ), - ), - ); - - expect(find.byIcon(Icons.unfold_more_rounded), findsOneWidget); - expect(find.byType(DropdownButton), findsOneWidget); - expect( - (tester.widget(find.byType(DropdownButton)) - as DropdownButton) - .value, - equals(FormDataType.file)); - - await tester.tap(find.text('file')); - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); - - await tester.tap(find.text('text').last); - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); - - expect(changedValue, FormDataType.text); - }); - - testWidgets('Testing Dropdown for Codegen', (tester) async { - dynamic changedValue; - await tester.pumpWidget( - MaterialApp( - title: 'Dropdown Codegen Type testing', - theme: kThemeDataLight, - home: Scaffold( - body: Center( - child: Column( - children: [ - DropdownButtonCodegenLanguage( - codegenLanguage: CodegenLanguage.curl, - onChanged: (value) { - changedValue = value!; - }, - ), - ], - ), - ), - ), - ), - ); - - expect(find.byIcon(Icons.unfold_more_rounded), findsOneWidget); - expect(find.byType(DropdownButton), findsOneWidget); - expect( - (tester.widget(find.byType(DropdownButton)) - as DropdownButton) - .value, - equals(CodegenLanguage.curl)); - - await tester.tap(find.text('cURL')); - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); - - await tester.tap(find.text('Dart (dio)').last); - await tester.pump(); - await tester.pump(const Duration(seconds: 1)); - - expect(changedValue, CodegenLanguage.dartDio); - }); -}