From 79201ebc7fcd681ca688da90dfc495b1d8ff398e Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Tue, 13 Aug 2024 03:12:08 +0530 Subject: [PATCH 1/8] wip: interation test helper --- integration_test/env_manager_test.dart | 57 +++++++ integration_test/test_helper.dart | 49 ++++++ lib/main.dart | 30 ++-- lib/screens/dashboard.dart | 4 +- pubspec.lock | 142 +++++++++--------- pubspec.yaml | 2 + test/extensions/widget_tester_extensions.dart | 17 +++ test/providers/ui_providers_test.dart | 2 +- test/widgets/button_group_filled_test.dart | 1 - test_driver/integration_test.dart | 3 + 10 files changed, 222 insertions(+), 85 deletions(-) create mode 100644 integration_test/env_manager_test.dart create mode 100644 integration_test/test_helper.dart create mode 100644 test_driver/integration_test.dart diff --git a/integration_test/env_manager_test.dart b/integration_test/env_manager_test.dart new file mode 100644 index 00000000..21d9aa20 --- /dev/null +++ b/integration_test/env_manager_test.dart @@ -0,0 +1,57 @@ +import 'package:apidash/widgets/menu_item_card.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:spot/spot.dart'; +import 'package:apidash/app.dart'; +import 'package:apidash/consts.dart'; + +import 'package:apidash/screens/envvar/environments_pane.dart'; +import '../test/extensions/widget_tester_extensions.dart'; +import 'test_helper.dart'; + +void main() async { + await ApidashTestHelper.initialize(); + apidashWidgetTest("Testing Environment Manager end-to-end", + (WidgetTester tester, helper) async { + await tester.pumpUntilFound(find.byType(DashApp)); + await Future.delayed(const Duration(seconds: 2)); + + /// Navigate to Environment Manager + Finder envNavbutton = find.byIcon(Icons.laptop_windows_outlined); + expect(envNavbutton, findsOneWidget); + await tester.tap(envNavbutton); + await tester.pumpAndSettle(); + await Future.delayed(const Duration(seconds: 1)); + + /// Create New Environment + final newEnvButton = + spot().spot().spotText(kLabelPlusNew); + newEnvButton.existsOnce(); + await act.tap(newEnvButton); + await tester.pumpAndSettle(); + await Future.delayed(const Duration(seconds: 1)); + + /// Open ItemCardMenu of the new environment + spot() + .spot() + .spot() + .existsAtLeastNTimes(2); + Finder envItems = find.byType(EnvironmentItem); + Finder newEnvItem = envItems.at(1); + expect(find.descendant(of: newEnvItem, matching: find.text('untitled')), + findsOneWidget); + Finder itemCardMenu = + find.descendant(of: newEnvItem, matching: find.byType(ItemCardMenu)); + await tester.tap(itemCardMenu); + await tester.pumpAndSettle(); + + /// Rename the new environment + await tester.tap(find.text('Rename').last); + await tester.pump(); + await tester.enterText(newEnvItem, "New Environment"); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pump(); + + await Future.delayed(const Duration(seconds: 2)); + }); +} diff --git a/integration_test/test_helper.dart b/integration_test/test_helper.dart new file mode 100644 index 00000000..88b07f6c --- /dev/null +++ b/integration_test/test_helper.dart @@ -0,0 +1,49 @@ +import 'dart:ui'; + +import 'package:apidash/app.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:apidash/main.dart' as app; + +class ApidashTestHelper { + final WidgetTester tester; + + ApidashTestHelper(this.tester); + + static Future initialize( + {Size? size}) async { + final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive; + + await app.initApp(); + await app.initWindow(sz: size); + + return binding; + } + + static Future loadApp(WidgetTester tester) async { + await app.initApp(); + await tester.pumpWidget( + const ProviderScope( + child: DashApp(), + ), + ); + } +} + +@isTest +void apidashWidgetTest( + String description, + Future Function(WidgetTester, ApidashTestHelper) test, +) { + testWidgets( + description, + (widgetTester) async { + await ApidashTestHelper.loadApp(widgetTester); + await test(widgetTester, ApidashTestHelper(widgetTester)); + }, + semanticsEnabled: false, + ); +} diff --git a/lib/main.dart b/lib/main.dart index d9730a03..54b521ca 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,19 +7,29 @@ import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - GoogleFonts.config.allowRuntimeFetching = false; - await openBoxes(); - await autoClearHistory(); - if (kIsLinux) { - await setupInitialWindow(); - } - if (kIsMacOS || kIsWindows) { - var win = getInitialSize(); - await setupWindow(sz: win.$1, off: win.$2); - } + + await initApp(); + await initWindow(); + runApp( const ProviderScope( child: DashApp(), ), ); } + +Future initApp() async { + GoogleFonts.config.allowRuntimeFetching = false; + await openBoxes(); + await autoClearHistory(); +} + +Future initWindow({Size? sz}) async { + if (kIsLinux) { + await setupInitialWindow(sz: sz); + } + if (kIsMacOS || kIsWindows) { + var win = sz == null ? (sz, null) : getInitialSize(); + await setupWindow(sz: win.$1, off: win.$2); + } +} diff --git a/lib/screens/dashboard.dart b/lib/screens/dashboard.dart index c0f1532f..d5bce2f1 100644 --- a/lib/screens/dashboard.dart +++ b/lib/screens/dashboard.dart @@ -46,8 +46,8 @@ class Dashboard extends ConsumerWidget { onPressed: () { ref.read(navRailIndexStateProvider.notifier).state = 1; }, - icon: const Icon(Icons.computer_outlined), - selectedIcon: const Icon(Icons.computer_rounded), + icon: const Icon(Icons.laptop_windows_outlined), + selectedIcon: const Icon(Icons.laptop_windows), ), Text( 'Variables', diff --git a/pubspec.lock b/pubspec.lock index 4e463339..80c375d3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: audio_session - sha256: a49af9981eec5d7cd73b37bacb6ee73f8143a6a9f9bd5b6021e6c346b9b6cf4e + sha256: "343e83bc7809fbda2591a49e525d6b63213ade10c76f15813be9aed6657b3261" url: "https://pub.dev" source: hosted - version: "0.1.19" + version: "0.1.21" barcode: dependency: transitive description: @@ -93,10 +93,10 @@ packages: dependency: transitive description: name: build_daemon - sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" build_resolvers: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: build_runner_core - sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.3.1" built_collection: dependency: transitive description: @@ -205,18 +205,18 @@ packages: dependency: transitive description: name: coverage - sha256: "3945034e86ea203af7a056d98e98e42a5518fff200d6e8e6647e1886b07e936e" + sha256: "576aaab8b1abdd452e0f656c3e73da9ead9d7880e15bdc494189d9c1a1baf0db" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.0" cross_file: dependency: transitive description: name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.dev" source: hosted - version: "0.3.4+1" + version: "0.3.4+2" crypto: dependency: transitive description: @@ -350,10 +350,10 @@ packages: dependency: transitive description: name: file_selector_android - sha256: "8bcc3af859e9d47fab9c7dc315537406511a894ab578e198bd8f9ed745ea5a01" + sha256: d1e8655c1a4850a900a0cfaed55fdd273881d53a4bb78e4736dc170a0b17db78 url: "https://pub.dev" source: hosted - version: "0.5.1+2" + version: "0.5.1+5" file_selector_ios: dependency: transitive description: @@ -390,18 +390,18 @@ packages: dependency: transitive description: name: file_selector_web - sha256: "619e431b224711a3869e30dbd7d516f5f5a4f04b265013a50912f39e1abc88c8" + sha256: c4c0ea4224d97a60a7067eca0c8fd419e708ff830e0c83b11a48faf566cec3e7 url: "https://pub.dev" source: hosted - version: "0.9.4+1" + version: "0.9.4+2" file_selector_windows: dependency: transitive description: name: file_selector_windows - sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69" url: "https://pub.dev" source: hosted - version: "0.9.3+1" + version: "0.9.3+2" fixnum: dependency: transitive description: @@ -512,10 +512,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "85cc6f7daeae537844c92e2d56e2aff61b00095f8f77913b529ea4be12fc45ea" + sha256: "2e8a801b1ded5ea001a4529c97b1f213dcb11c6b20668e081cafb23468593514" url: "https://pub.dev" source: hosted - version: "0.7.2+1" + version: "0.7.3" flutter_portal: dependency: "direct main" description: @@ -570,18 +570,18 @@ packages: dependency: "direct main" description: name: freezed_annotation - sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.4" frontend_server_client: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" fuchsia_remote_debug_protocol: dependency: transitive description: flutter @@ -615,10 +615,10 @@ packages: dependency: transitive description: name: graphs - sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" highlighter: dependency: "direct main" description: @@ -700,7 +700,7 @@ packages: source: hosted version: "4.2.0" integration_test: - dependency: transitive + dependency: "direct dev" description: flutter source: sdk version: "0.0.0" @@ -732,10 +732,10 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.1" json_annotation: dependency: "direct main" description: @@ -773,10 +773,10 @@ packages: dependency: "direct main" description: name: just_audio - sha256: "5abfab1d199e01ab5beffa61b3e782350df5dad036cb8c83b79fa45fc656614e" + sha256: ee50602364ba83fa6308f5512dd560c713ec3e1f2bc75f0db43618f0d82ef71a url: "https://pub.dev" source: hosted - version: "0.9.38" + version: "0.9.39" just_audio_mpv: dependency: "direct main" description: @@ -917,10 +917,10 @@ packages: dependency: "direct main" description: name: multi_split_view - sha256: "1ee1974d9aae6bdc08e2abdead6066c914cefe4b0c5999cac1a2e4722fcf33ba" + sha256: "30548c5e4cc6f24d5d4ca784dc5dff80d599ef1f704b1565819eb88a74f0eb62" url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.5.0" multi_trigger_autocomplete: dependency: "direct main" description: @@ -966,18 +966,18 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0 + sha256: "4de6c36df77ffbcef0a5aefe04669d33f2d18397fea228277b852a2d4e58e860" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.0.1" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" path: dependency: "direct main" description: @@ -998,18 +998,18 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + sha256: "490539678396d4c3c0b06efdaab75ae60675c3e0c66f72bc04c2e2c1e0e2abeb" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.9" path_provider_foundation: dependency: transitive description: @@ -1038,18 +1038,18 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" pdf: dependency: transitive description: name: pdf - sha256: "243f05342fc0bdf140eba5b069398985cdbdd3dbb1d776cf43d5ea29cc570ba6" + sha256: "81d5522bddc1ef5c28e8f0ee40b71708761753c163e0c93a40df56fd515ea0f0" url: "https://pub.dev" source: hosted - version: "3.10.8" + version: "3.11.0" pdf_widget_wrapper: dependency: "direct overridden" description: @@ -1086,10 +1086,10 @@ packages: dependency: transitive description: name: pointer_interceptor - sha256: d0a8e660d1204eaec5bd34b34cc92174690e076d2e4f893d9d68c486a13b07c4 + sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523" url: "https://pub.dev" source: hosted - version: "0.10.1+1" + version: "0.10.1+2" pointer_interceptor_ios: dependency: transitive description: @@ -1110,10 +1110,10 @@ packages: dependency: transitive description: name: pointer_interceptor_web - sha256: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e + sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044" url: "https://pub.dev" source: hosted - version: "0.10.2" + version: "0.10.2+1" pool: dependency: transitive description: @@ -1126,10 +1126,10 @@ packages: dependency: "direct main" description: name: printing - sha256: "1c99cab90ebcc1fff65831d264627d5b529359d563e53f33ab9b8117f2d280bc" + sha256: cc4b256a5a89d5345488e3318897b595867f5181b8c5ed6fc63bfa5f2044aec3 url: "https://pub.dev" source: hosted - version: "5.12.0" + version: "5.13.1" process: dependency: transitive description: @@ -1166,10 +1166,10 @@ packages: dependency: transitive description: name: qr - sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3" + sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" riverpod: dependency: "direct main" description: @@ -1182,10 +1182,10 @@ packages: dependency: transitive description: name: rxdart - sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" url: "https://pub.dev" source: hosted - version: "0.27.7" + version: "0.28.0" screen_retriever: dependency: transitive description: @@ -1427,18 +1427,18 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "17cd5e205ea615e2c6ea7a77323a11712dffa0720a8a90540db57a01347f9ad9" + sha256: "94d8ad05f44c6d4e2ffe5567ab4d741b82d62e3c8e288cc1fcea45965edf47c9" url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.8" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_linux: dependency: transitive description: @@ -1467,26 +1467,26 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: "direct main" description: name: uuid - sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" + sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.4.2" vector_graphics: dependency: transitive description: @@ -1523,18 +1523,18 @@ packages: dependency: "direct main" description: name: video_player - sha256: aced48e701e24c02b0b7f881a8819e4937794e46b5a5821005e2bf3b40a324cc + sha256: e30df0d226c4ef82e2c150ebf6834b3522cf3f654d8e2f9419d376cdc071425d url: "https://pub.dev" source: hosted - version: "2.8.7" + version: "2.9.1" video_player_android: dependency: transitive description: name: video_player_android - sha256: "134e1ad410d67e18a19486ed9512c72dfc6d8ffb284d0e8f2e99e903d1ba8fa3" + sha256: "4de50df9ee786f5891d3281e1e633d7b142ef1acf47392592eb91cba5d355849" url: "https://pub.dev" source: hosted - version: "2.4.14" + version: "2.6.0" video_player_avfoundation: dependency: transitive description: @@ -1555,10 +1555,10 @@ packages: dependency: transitive description: name: video_player_web - sha256: ff4d69a6614b03f055397c27a71c9d3ddea2b2a23d71b2ba0164f59ca32b8fe2 + sha256: "6dcdd298136523eaf7dfc31abaf0dfba9aa8a8dbc96670e87e9d42b6f2caf774" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" vm_service: dependency: transitive description: @@ -1611,10 +1611,10 @@ packages: dependency: transitive description: name: win32 - sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" + sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9" url: "https://pub.dev" source: hosted - version: "5.5.0" + version: "5.5.3" window_manager: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 515fc0c9..5563422f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -89,6 +89,8 @@ dev_dependencies: freezed: ^2.5.2 json_serializable: ^6.7.1 spot: ^0.13.0 + integration_test: + sdk: flutter flutter: uses-material-design: true diff --git a/test/extensions/widget_tester_extensions.dart b/test/extensions/widget_tester_extensions.dart index d17c26e5..fe08e568 100644 --- a/test/extensions/widget_tester_extensions.dart +++ b/test/extensions/widget_tester_extensions.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:ui'; import 'package:flutter_test/flutter_test.dart'; import '../test_consts.dart'; @@ -22,3 +23,19 @@ extension ScreenSizeManager on WidgetTester { view.devicePixelRatio = pixelDensity; } } + +extension PumpUntilFound on WidgetTester { + Future pumpUntilFound( + Finder finder, { + Duration timeout = const Duration(seconds: 20), + }) async { + bool found = false; + final timer = Timer( + timeout, () => throw TimeoutException("Pump until has timed out")); + while (found != true) { + await pump(); + found = any(finder); + } + timer.cancel(); + } +} diff --git a/test/providers/ui_providers_test.dart b/test/providers/ui_providers_test.dart index 9b0653d3..82116586 100644 --- a/test/providers/ui_providers_test.dart +++ b/test/providers/ui_providers_test.dart @@ -217,7 +217,7 @@ void main() { // Verify that the EnvironmentPage is displayed expect(find.byType(EnvironmentPage), findsOneWidget); // Verify that the selected icon is the filled version (selectedIcon) - expect(find.byIcon(Icons.computer_rounded), findsOneWidget); + expect(find.byIcon(Icons.laptop_windows_outlined), findsOneWidget); // Go to HistoryPage container.read(navRailIndexStateProvider.notifier).state = 2; diff --git a/test/widgets/button_group_filled_test.dart b/test/widgets/button_group_filled_test.dart index 44fe9e6e..a69d2e95 100644 --- a/test/widgets/button_group_filled_test.dart +++ b/test/widgets/button_group_filled_test.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:apidash/consts.dart'; import 'package:apidash/widgets/button_group_filled.dart'; void main() { diff --git a/test_driver/integration_test.dart b/test_driver/integration_test.dart new file mode 100644 index 00000000..b38629cc --- /dev/null +++ b/test_driver/integration_test.dart @@ -0,0 +1,3 @@ +import 'package:integration_test/integration_test_driver.dart'; + +Future main() => integrationDriver(); From 87bcb2719ac9053c3445af6a097801d215bac0f5 Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Wed, 14 Aug 2024 15:15:14 +0530 Subject: [PATCH 2/8] test: env_manager_test --- integration_test/env_manager_test.dart | 86 ++++++++++++++++++++++---- integration_test/test_helper.dart | 8 ++- 2 files changed, 79 insertions(+), 15 deletions(-) diff --git a/integration_test/env_manager_test.dart b/integration_test/env_manager_test.dart index 21d9aa20..5aa4bef8 100644 --- a/integration_test/env_manager_test.dart +++ b/integration_test/env_manager_test.dart @@ -1,10 +1,16 @@ -import 'package:apidash/widgets/menu_item_card.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:spot/spot.dart'; import 'package:apidash/app.dart'; import 'package:apidash/consts.dart'; - +import 'package:apidash/screens/screens.dart'; +import 'package:apidash/widgets/field_cell.dart'; +import 'package:apidash/widgets/menu_item_card.dart'; +import 'package:apidash/widgets/popup_menu_env.dart'; +import 'package:apidash/screens/common_widgets/env_trigger_options.dart'; +import 'package:apidash/screens/envvar/editor_pane/variables_pane.dart'; +import 'package:apidash/screens/home_page/editor_pane/editor_request.dart'; +import 'package:apidash/screens/home_page/editor_pane/url_card.dart'; import 'package:apidash/screens/envvar/environments_pane.dart'; import '../test/extensions/widget_tester_extensions.dart'; import 'test_helper.dart'; @@ -14,14 +20,11 @@ void main() async { apidashWidgetTest("Testing Environment Manager end-to-end", (WidgetTester tester, helper) async { await tester.pumpUntilFound(find.byType(DashApp)); - await Future.delayed(const Duration(seconds: 2)); + await Future.delayed(const Duration(seconds: 1)); /// Navigate to Environment Manager - Finder envNavbutton = find.byIcon(Icons.laptop_windows_outlined); - expect(envNavbutton, findsOneWidget); - await tester.tap(envNavbutton); - await tester.pumpAndSettle(); - await Future.delayed(const Duration(seconds: 1)); + await navigateByIcon(Icons.laptop_windows_outlined, tester); + await Future.delayed(const Duration(milliseconds: 500)); /// Create New Environment final newEnvButton = @@ -29,13 +32,9 @@ void main() async { newEnvButton.existsOnce(); await act.tap(newEnvButton); await tester.pumpAndSettle(); - await Future.delayed(const Duration(seconds: 1)); + await Future.delayed(const Duration(milliseconds: 500)); /// Open ItemCardMenu of the new environment - spot() - .spot() - .spot() - .existsAtLeastNTimes(2); Finder envItems = find.byType(EnvironmentItem); Finder newEnvItem = envItems.at(1); expect(find.descendant(of: newEnvItem, matching: find.text('untitled')), @@ -51,6 +50,67 @@ void main() async { await tester.enterText(newEnvItem, "New Environment"); await tester.testTextInput.receiveAction(TextInputAction.done); await tester.pump(); + await Future.delayed(const Duration(milliseconds: 500)); + + /// Edit Environment Variables + final envCells = find.descendant( + of: find.byType(EditEnvironmentVariables), + matching: find.byType(CellField)); + await tester.enterText(envCells.at(0), "test-key"); + await tester.enterText(envCells.at(1), "test-value"); + await Future.delayed(const Duration(milliseconds: 500)); + + /// Navigate to Request Editor + await navigateByIcon(Icons.auto_awesome_mosaic_outlined, tester); + await Future.delayed(const Duration(milliseconds: 500)); + + /// Create a new request + await act.tap( + spot().spot().spotText(kLabelPlusNew)); + await tester.pumpAndSettle(); + + /// Set active environment + await tester.tap(find.descendant( + of: find.byType(EnvironmentPopupMenu), + matching: find.byIcon(Icons.unfold_more))); + await tester.pumpAndSettle(); + + await tester.tap(find.text('New Environment').last); + await tester.pumpAndSettle(); + + /// Check if environment suggestions are working + await act.tap(spot().spot()); + tester.testTextInput.enterText("{{test-k"); + await tester.pumpAndSettle( + const Duration(milliseconds: 500)); // wait for suggestions + spot() + .spot() + .spotText('test-key') + .existsOnce(); + + /// Navigate to Environment Manager + await navigateByIcon(Icons.laptop_windows_outlined, tester); + await Future.delayed(const Duration(milliseconds: 500)); + + /// Delete the environment variable + final delButtons = find.descendant( + of: find.byType(EditEnvironmentVariables), + matching: find.byIcon(Icons.remove_circle)); + await tester.tap(delButtons.at(0)); + + /// Navigate back to Request Editor + await navigateByIcon(Icons.auto_awesome_mosaic_outlined, tester); + await Future.delayed(const Duration(milliseconds: 500)); + + /// Check if environment suggestions are shown + await act.tap(spot().spot()); + tester.testTextInput.enterText("{{test-k"); + await tester.pumpAndSettle( + const Duration(milliseconds: 500)); // wait for suggestions + spot() + .spot() + .spotText('test-key') + .doesNotExist(); await Future.delayed(const Duration(seconds: 2)); }); diff --git a/integration_test/test_helper.dart b/integration_test/test_helper.dart index 88b07f6c..6300d99f 100644 --- a/integration_test/test_helper.dart +++ b/integration_test/test_helper.dart @@ -1,6 +1,5 @@ -import 'dart:ui'; - import 'package:apidash/app.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; @@ -47,3 +46,8 @@ void apidashWidgetTest( semanticsEnabled: false, ); } + +Future navigateByIcon(IconData icon, WidgetTester tester) async { + await tester.tap(find.byIcon(icon)); + await tester.pumpAndSettle(); +} From 52d275ee8b2915107eebd9cd152cc417fb9ff0ed Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Fri, 16 Aug 2024 03:06:52 +0530 Subject: [PATCH 3/8] test: env_manager desktop --- .../{ => desktop}/env_manager_test.dart | 109 ++++++++++++------ integration_test/test_helper.dart | 2 +- 2 files changed, 76 insertions(+), 35 deletions(-) rename integration_test/{ => desktop}/env_manager_test.dart (50%) diff --git a/integration_test/env_manager_test.dart b/integration_test/desktop/env_manager_test.dart similarity index 50% rename from integration_test/env_manager_test.dart rename to integration_test/desktop/env_manager_test.dart index 5aa4bef8..0610580c 100644 --- a/integration_test/env_manager_test.dart +++ b/integration_test/desktop/env_manager_test.dart @@ -1,29 +1,38 @@ +import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:spot/spot.dart'; import 'package:apidash/app.dart'; import 'package:apidash/consts.dart'; +import 'package:apidash/widgets/widgets.dart'; import 'package:apidash/screens/screens.dart'; -import 'package:apidash/widgets/field_cell.dart'; -import 'package:apidash/widgets/menu_item_card.dart'; -import 'package:apidash/widgets/popup_menu_env.dart'; import 'package:apidash/screens/common_widgets/env_trigger_options.dart'; import 'package:apidash/screens/envvar/editor_pane/variables_pane.dart'; import 'package:apidash/screens/home_page/editor_pane/editor_request.dart'; import 'package:apidash/screens/home_page/editor_pane/url_card.dart'; import 'package:apidash/screens/envvar/environments_pane.dart'; -import '../test/extensions/widget_tester_extensions.dart'; -import 'test_helper.dart'; +import '../../test/extensions/widget_tester_extensions.dart'; +import '../test_helper.dart'; void main() async { + const environmentName = "test-env-name"; + const envVarName = "test-env-var"; + const envVarValue = "8700000"; + const testEndpoint = "api.apidash.dev/humanize/social?num="; + const unknown = "unknown"; + const untitled = "untitled"; + const expectedCurlCode = + "curl --url 'https://api.apidash.dev/humanize/social?num=8700000'"; + await ApidashTestHelper.initialize(); - apidashWidgetTest("Testing Environment Manager end-to-end", + apidashWidgetTest("Testing Environment Manager in desktop end-to-end", (WidgetTester tester, helper) async { await tester.pumpUntilFound(find.byType(DashApp)); await Future.delayed(const Duration(seconds: 1)); /// Navigate to Environment Manager - await navigateByIcon(Icons.laptop_windows_outlined, tester); + await navigateByIcon(tester, Icons.laptop_windows_outlined); await Future.delayed(const Duration(milliseconds: 500)); /// Create New Environment @@ -37,7 +46,7 @@ void main() async { /// Open ItemCardMenu of the new environment Finder envItems = find.byType(EnvironmentItem); Finder newEnvItem = envItems.at(1); - expect(find.descendant(of: newEnvItem, matching: find.text('untitled')), + expect(find.descendant(of: newEnvItem, matching: find.text(untitled)), findsOneWidget); Finder itemCardMenu = find.descendant(of: newEnvItem, matching: find.byType(ItemCardMenu)); @@ -45,9 +54,9 @@ void main() async { await tester.pumpAndSettle(); /// Rename the new environment - await tester.tap(find.text('Rename').last); + await tester.tap(find.text(ItemMenuOption.edit.label).last); await tester.pump(); - await tester.enterText(newEnvItem, "New Environment"); + await tester.enterText(newEnvItem, environmentName); await tester.testTextInput.receiveAction(TextInputAction.done); await tester.pump(); await Future.delayed(const Duration(milliseconds: 500)); @@ -56,13 +65,13 @@ void main() async { final envCells = find.descendant( of: find.byType(EditEnvironmentVariables), matching: find.byType(CellField)); - await tester.enterText(envCells.at(0), "test-key"); - await tester.enterText(envCells.at(1), "test-value"); + await tester.enterText(envCells.at(0), envVarName); + await tester.enterText(envCells.at(1), envVarValue); await Future.delayed(const Duration(milliseconds: 500)); /// Navigate to Request Editor - await navigateByIcon(Icons.auto_awesome_mosaic_outlined, tester); - await Future.delayed(const Duration(milliseconds: 500)); + await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await Future.delayed(const Duration(milliseconds: 200)); /// Create a new request await act.tap( @@ -75,43 +84,75 @@ void main() async { matching: find.byIcon(Icons.unfold_more))); await tester.pumpAndSettle(); - await tester.tap(find.text('New Environment').last); + await tester.tap(find.text(environmentName).last); await tester.pumpAndSettle(); /// Check if environment suggestions are working await act.tap(spot().spot()); - tester.testTextInput.enterText("{{test-k"); + tester.testTextInput.enterText("$testEndpoint{{$envVarName"); await tester.pumpAndSettle( const Duration(milliseconds: 500)); // wait for suggestions - spot() + await act.tap(spot() .spot() - .spotText('test-key') - .existsOnce(); + .spotText(envVarValue)); + await tester.pumpAndSettle(); + + final gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); + await gesture.addPointer(location: Offset.zero); + addTearDown(gesture.removePointer); + await tester.pump(); + + /// Check if environment variable is shown on hover + await gesture.moveTo(tester.getCenter(find.descendant( + of: find.byType(URLTextField), + matching: find.text('{{$envVarName}}')))); + await tester.pumpAndSettle(); + expect(find.text(envVarValue), findsOneWidget); + await Future.delayed(const Duration(milliseconds: 500)); + + /// Change codegen language to curl + await navigateByIcon(tester, Icons.settings_outlined); + await tester.tap(find.descendant( + of: find.byType(CodegenPopupMenu), + matching: find.byIcon(Icons.unfold_more))); + await tester.pumpAndSettle(); + + await tester.tap(find.text(CodegenLanguage.curl.label).last); + await tester.pumpAndSettle(); + await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await Future.delayed(const Duration(milliseconds: 200)); + + /// Check variable substitution in request + await act.tap(spot().spotText(kLabelViewCode)); + await tester.pumpAndSettle(); + expect( + find.descendant( + of: find.byType(CodeGenPreviewer), + matching: find.text(expectedCurlCode)), + findsOneWidget); /// Navigate to Environment Manager - await navigateByIcon(Icons.laptop_windows_outlined, tester); - await Future.delayed(const Duration(milliseconds: 500)); + await navigateByIcon(tester, Icons.laptop_windows_outlined); + await Future.delayed(const Duration(milliseconds: 200)); /// Delete the environment variable final delButtons = find.descendant( of: find.byType(EditEnvironmentVariables), matching: find.byIcon(Icons.remove_circle)); await tester.tap(delButtons.at(0)); - - /// Navigate back to Request Editor - await navigateByIcon(Icons.auto_awesome_mosaic_outlined, tester); await Future.delayed(const Duration(milliseconds: 500)); - /// Check if environment suggestions are shown - await act.tap(spot().spot()); - tester.testTextInput.enterText("{{test-k"); - await tester.pumpAndSettle( - const Duration(milliseconds: 500)); // wait for suggestions - spot() - .spot() - .spotText('test-key') - .doesNotExist(); + /// Navigate back to Request Editor + await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await Future.delayed(const Duration(milliseconds: 200)); - await Future.delayed(const Duration(seconds: 2)); + /// Check if environment variable is now shown on hover + await gesture.moveTo(tester.getCenter(find.descendant( + of: find.byType(URLTextField), + matching: find.text('{{$envVarName}}')))); + await tester.pumpAndSettle(); + expect(find.text(unknown), findsNWidgets(2)); + + await Future.delayed(const Duration(milliseconds: 500)); }); } diff --git a/integration_test/test_helper.dart b/integration_test/test_helper.dart index 6300d99f..f92a106c 100644 --- a/integration_test/test_helper.dart +++ b/integration_test/test_helper.dart @@ -47,7 +47,7 @@ void apidashWidgetTest( ); } -Future navigateByIcon(IconData icon, WidgetTester tester) async { +Future navigateByIcon(WidgetTester tester, IconData icon) async { await tester.tap(find.byIcon(icon)); await tester.pumpAndSettle(); } From 833494540fc407d840c016f2599cb110886c0a65 Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Fri, 16 Aug 2024 03:45:57 +0530 Subject: [PATCH 4/8] test: env_manager mobile --- .../desktop/env_manager_test.dart | 2 +- integration_test/mobile/env_manager_test.dart | 186 ++++++++++++++++++ lib/main.dart | 2 +- .../common_widgets/common_widgets.dart | 1 + lib/screens/mobile/navbar.dart | 4 +- 5 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 integration_test/mobile/env_manager_test.dart diff --git a/integration_test/desktop/env_manager_test.dart b/integration_test/desktop/env_manager_test.dart index 0610580c..28327d6c 100644 --- a/integration_test/desktop/env_manager_test.dart +++ b/integration_test/desktop/env_manager_test.dart @@ -146,7 +146,7 @@ void main() async { await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); await Future.delayed(const Duration(milliseconds: 200)); - /// Check if environment variable is now shown on hover + /// Check if environment variable is now shown on hover await gesture.moveTo(tester.getCenter(find.descendant( of: find.byType(URLTextField), matching: find.text('{{$envVarName}}')))); diff --git a/integration_test/mobile/env_manager_test.dart b/integration_test/mobile/env_manager_test.dart new file mode 100644 index 00000000..ea4632e4 --- /dev/null +++ b/integration_test/mobile/env_manager_test.dart @@ -0,0 +1,186 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:spot/spot.dart'; +import 'package:apidash/app.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash/widgets/widgets.dart'; +import 'package:apidash/screens/screens.dart'; +import 'package:apidash/screens/common_widgets/env_trigger_options.dart'; +import 'package:apidash/screens/envvar/editor_pane/variables_pane.dart'; +import 'package:apidash/screens/home_page/editor_pane/url_card.dart'; +import 'package:apidash/screens/envvar/environments_pane.dart'; +import '../../test/extensions/widget_tester_extensions.dart'; +import '../test_helper.dart'; + +void main() async { + const environmentName = "test-env-name"; + const envVarName = "test-env-var"; + const envVarValue = "8700000"; + const testEndpoint = "api.apidash.dev/humanize/social?num="; + const unknown = "unknown"; + const untitled = "untitled"; + const expectedCurlCode = + "curl --url 'https://api.apidash.dev/humanize/social?num=8700000'"; + + await ApidashTestHelper.initialize( + size: Size(kCompactWindowWidth, kMinWindowSize.height)); + apidashWidgetTest("Testing Environment Manager in desktop end-to-end", + (WidgetTester tester, helper) async { + await tester.pumpUntilFound(find.byType(DashApp)); + await Future.delayed(const Duration(seconds: 1)); + + kHomeScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + /// Navigate to Environment Manager + await navigateByIcon(tester, Icons.laptop_windows_outlined); + await Future.delayed(const Duration(milliseconds: 500)); + + kEnvScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + /// Create New Environment + final newEnvButton = + spot().spot().spotText(kLabelPlusNew); + newEnvButton.existsOnce(); + await act.tap(newEnvButton); + await tester.pumpAndSettle(); + await Future.delayed(const Duration(milliseconds: 500)); + + /// Open ItemCardMenu of the new environment + Finder envItems = find.byType(EnvironmentItem); + Finder newEnvItem = envItems.at(1); + expect(find.descendant(of: newEnvItem, matching: find.text(untitled)), + findsOneWidget); + Finder itemCardMenu = + find.descendant(of: newEnvItem, matching: find.byType(ItemCardMenu)); + await tester.tap(itemCardMenu); + await tester.pumpAndSettle(); + + /// Rename the new environment + await tester.tap(find.text(ItemMenuOption.edit.label).last); + await tester.pump(); + await tester.enterText(newEnvItem, environmentName); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pump(); + await Future.delayed(const Duration(milliseconds: 500)); + + kEnvScaffoldKey.currentState!.closeDrawer(); + await tester.pumpAndSettle(); + + /// Edit Environment Variables + final envCells = find.descendant( + of: find.byType(EditEnvironmentVariables), + matching: find.byType(CellField)); + await tester.enterText(envCells.at(0), envVarName); + await tester.enterText(envCells.at(1), envVarValue); + await Future.delayed(const Duration(milliseconds: 500)); + + kEnvScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + /// Navigate to Request Editor + await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await Future.delayed(const Duration(milliseconds: 200)); + + kHomeScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + /// Create a new request + await act.tap( + spot().spot().spotText(kLabelPlusNew)); + await tester.pumpAndSettle(); + + kHomeScaffoldKey.currentState!.closeDrawer(); + await tester.pumpAndSettle(); + + /// Set active environment + await tester.tap(find.descendant( + of: find.byType(EnvironmentPopupMenu), + matching: find.byIcon(Icons.unfold_more))); + await tester.pumpAndSettle(); + + await tester.tap(find.text(environmentName).last); + await tester.pumpAndSettle(); + + /// Check if environment suggestions are working + await act.tap(spot()); + tester.testTextInput.enterText("$testEndpoint{{$envVarName"); + await tester.pumpAndSettle( + const Duration(milliseconds: 500)); // wait for suggestions + await act.tap(spot() + .spot() + .spotText(envVarValue)); + await tester.pumpAndSettle(); + + final gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); + await gesture.addPointer(location: Offset.zero); + addTearDown(gesture.removePointer); + await tester.pump(); + + /// Check if environment variable is shown on hover + await gesture.moveTo(tester.getCenter(find.descendant( + of: find.byType(URLTextField), + matching: find.text('{{$envVarName}}')))); + await tester.pumpAndSettle(); + expect(find.text(envVarValue), findsOneWidget); + await gesture.moveBy(const Offset(0, 100)); + await Future.delayed(const Duration(milliseconds: 500)); + + kHomeScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + /// Change codegen language to curl + await navigateByIcon(tester, Icons.settings_outlined); + await tester.tap(find.descendant( + of: find.byType(CodegenPopupMenu), + matching: find.byIcon(Icons.unfold_more))); + await tester.pumpAndSettle(); + + await tester.tap(find.text(CodegenLanguage.curl.label).last); + await tester.pumpAndSettle(); + await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await Future.delayed(const Duration(milliseconds: 200)); + + /// Check variable substitution in request + await act.tap(spot().spotText(kLabelCode)); + await tester.pumpAndSettle(); + expect( + find.descendant( + of: find.byType(CodeGenPreviewer), + matching: find.text(expectedCurlCode)), + findsOneWidget); + + kHomeScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + /// Navigate to Environment Manager + await navigateByIcon(tester, Icons.laptop_windows_outlined); + await Future.delayed(const Duration(milliseconds: 200)); + + /// Delete the environment variable + final delButtons = find.descendant( + of: find.byType(EditEnvironmentVariables), + matching: find.byIcon(Icons.remove_circle)); + await tester.tap(delButtons.at(0)); + await Future.delayed(const Duration(milliseconds: 500)); + + kEnvScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + /// Navigate back to Request Editor + await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await Future.delayed(const Duration(milliseconds: 200)); + + /// Check if environment variable is now shown on hover + await gesture.moveTo(tester.getCenter(find.descendant( + of: find.byType(URLTextField), + matching: find.text('{{$envVarName}}')))); + await tester.pumpAndSettle(); + expect(find.text(unknown), findsNWidgets(2)); + + await Future.delayed(const Duration(milliseconds: 500)); + }); +} diff --git a/lib/main.dart b/lib/main.dart index 54b521ca..4a8b07fd 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -29,7 +29,7 @@ Future initWindow({Size? sz}) async { await setupInitialWindow(sz: sz); } if (kIsMacOS || kIsWindows) { - var win = sz == null ? (sz, null) : getInitialSize(); + var win = sz != null ? (sz, const Offset(100, 100)) : getInitialSize(); await setupWindow(sz: win.$1, off: win.$2); } } diff --git a/lib/screens/common_widgets/common_widgets.dart b/lib/screens/common_widgets/common_widgets.dart index 02a1f583..ee150dd8 100644 --- a/lib/screens/common_widgets/common_widgets.dart +++ b/lib/screens/common_widgets/common_widgets.dart @@ -8,6 +8,7 @@ export 'environment_dropdown.dart'; export 'envvar_indicator.dart'; export 'envvar_span.dart'; export 'envvar_popover.dart'; +export 'env_trigger_options.dart'; export 'sidebar_filter.dart'; export 'sidebar_header.dart'; export 'sidebar_save_button.dart'; diff --git a/lib/screens/mobile/navbar.dart b/lib/screens/mobile/navbar.dart index b5402b88..b1495b6a 100644 --- a/lib/screens/mobile/navbar.dart +++ b/lib/screens/mobile/navbar.dart @@ -34,8 +34,8 @@ class BottomNavBar extends ConsumerWidget { child: NavbarButton( railIdx: railIdx, buttonIdx: 0, - selectedIcon: Icons.dashboard, - icon: Icons.dashboard_outlined, + selectedIcon: Icons.auto_awesome_mosaic_rounded, + icon: Icons.auto_awesome_mosaic_outlined, label: 'Requests', ), ), From b16829735094ff93c25816939246e53f8d31a618 Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Sun, 18 Aug 2024 03:58:53 +0530 Subject: [PATCH 5/8] fix: pass size param --- integration_test/desktop/env_manager_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integration_test/desktop/env_manager_test.dart b/integration_test/desktop/env_manager_test.dart index 28327d6c..047e2d33 100644 --- a/integration_test/desktop/env_manager_test.dart +++ b/integration_test/desktop/env_manager_test.dart @@ -25,7 +25,8 @@ void main() async { const expectedCurlCode = "curl --url 'https://api.apidash.dev/humanize/social?num=8700000'"; - await ApidashTestHelper.initialize(); + await ApidashTestHelper.initialize( + size: Size(kExpandedWindowWidth, kMinWindowSize.height)); apidashWidgetTest("Testing Environment Manager in desktop end-to-end", (WidgetTester tester, helper) async { await tester.pumpUntilFound(find.byType(DashApp)); From a676de6389ce25ac03f73f504e7d6345304e7fcc Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Sun, 18 Aug 2024 04:24:37 +0530 Subject: [PATCH 6/8] refactor: abstract to helper --- .../desktop/env_manager_test.dart | 78 ++++----------- integration_test/env_helper.dart | 71 ++++++++++++++ integration_test/mobile/env_manager_test.dart | 95 ++++--------------- integration_test/req_helper.dart | 39 ++++++++ integration_test/test_helper.dart | 85 +++++++++++++++-- 5 files changed, 223 insertions(+), 145 deletions(-) create mode 100644 integration_test/env_helper.dart create mode 100644 integration_test/req_helper.dart diff --git a/integration_test/desktop/env_manager_test.dart b/integration_test/desktop/env_manager_test.dart index 047e2d33..a3743501 100644 --- a/integration_test/desktop/env_manager_test.dart +++ b/integration_test/desktop/env_manager_test.dart @@ -6,12 +6,9 @@ import 'package:spot/spot.dart'; import 'package:apidash/app.dart'; import 'package:apidash/consts.dart'; import 'package:apidash/widgets/widgets.dart'; -import 'package:apidash/screens/screens.dart'; import 'package:apidash/screens/common_widgets/env_trigger_options.dart'; -import 'package:apidash/screens/envvar/editor_pane/variables_pane.dart'; import 'package:apidash/screens/home_page/editor_pane/editor_request.dart'; import 'package:apidash/screens/home_page/editor_pane/url_card.dart'; -import 'package:apidash/screens/envvar/environments_pane.dart'; import '../../test/extensions/widget_tester_extensions.dart'; import '../test_helper.dart'; @@ -19,11 +16,9 @@ void main() async { const environmentName = "test-env-name"; const envVarName = "test-env-var"; const envVarValue = "8700000"; - const testEndpoint = "api.apidash.dev/humanize/social?num="; + const testEndpoint = "https://api.apidash.dev/humanize/social?num="; const unknown = "unknown"; - const untitled = "untitled"; - const expectedCurlCode = - "curl --url 'https://api.apidash.dev/humanize/social?num=8700000'"; + const expectedCurlCode = "curl --url '$testEndpoint$envVarValue'"; await ApidashTestHelper.initialize( size: Size(kExpandedWindowWidth, kMinWindowSize.height)); @@ -33,60 +28,30 @@ void main() async { await Future.delayed(const Duration(seconds: 1)); /// Navigate to Environment Manager - await navigateByIcon(tester, Icons.laptop_windows_outlined); + await helper.navigateToEnvironmentManager(); await Future.delayed(const Duration(milliseconds: 500)); /// Create New Environment - final newEnvButton = - spot().spot().spotText(kLabelPlusNew); - newEnvButton.existsOnce(); - await act.tap(newEnvButton); - await tester.pumpAndSettle(); + await helper.envHelper.addNewEnvironment(); await Future.delayed(const Duration(milliseconds: 500)); - /// Open ItemCardMenu of the new environment - Finder envItems = find.byType(EnvironmentItem); - Finder newEnvItem = envItems.at(1); - expect(find.descendant(of: newEnvItem, matching: find.text(untitled)), - findsOneWidget); - Finder itemCardMenu = - find.descendant(of: newEnvItem, matching: find.byType(ItemCardMenu)); - await tester.tap(itemCardMenu); - await tester.pumpAndSettle(); - /// Rename the new environment - await tester.tap(find.text(ItemMenuOption.edit.label).last); - await tester.pump(); - await tester.enterText(newEnvItem, environmentName); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pump(); + await helper.envHelper.renameNewEnvironment(environmentName); await Future.delayed(const Duration(milliseconds: 500)); - /// Edit Environment Variables - final envCells = find.descendant( - of: find.byType(EditEnvironmentVariables), - matching: find.byType(CellField)); - await tester.enterText(envCells.at(0), envVarName); - await tester.enterText(envCells.at(1), envVarValue); + /// Add Environment Variables + await helper.envHelper.addEnvironmentVariables([(envVarName, envVarValue)]); await Future.delayed(const Duration(milliseconds: 500)); /// Navigate to Request Editor - await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await helper.navigateToRequestEditor(); await Future.delayed(const Duration(milliseconds: 200)); /// Create a new request - await act.tap( - spot().spot().spotText(kLabelPlusNew)); - await tester.pumpAndSettle(); + await helper.reqHelper.addNewRequest(); /// Set active environment - await tester.tap(find.descendant( - of: find.byType(EnvironmentPopupMenu), - matching: find.byIcon(Icons.unfold_more))); - await tester.pumpAndSettle(); - - await tester.tap(find.text(environmentName).last); - await tester.pumpAndSettle(); + await helper.envHelper.setActiveEnvironment(environmentName); /// Check if environment suggestions are working await act.tap(spot().spot()); @@ -111,16 +76,12 @@ void main() async { expect(find.text(envVarValue), findsOneWidget); await Future.delayed(const Duration(milliseconds: 500)); - /// Change codegen language to curl - await navigateByIcon(tester, Icons.settings_outlined); - await tester.tap(find.descendant( - of: find.byType(CodegenPopupMenu), - matching: find.byIcon(Icons.unfold_more))); - await tester.pumpAndSettle(); + await helper.navigateToSettings(); - await tester.tap(find.text(CodegenLanguage.curl.label).last); - await tester.pumpAndSettle(); - await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + /// Change codegen language to curl + await helper.changeCodegenLanguage(CodegenLanguage.curl); + + await helper.navigateToRequestEditor(); await Future.delayed(const Duration(milliseconds: 200)); /// Check variable substitution in request @@ -133,18 +94,15 @@ void main() async { findsOneWidget); /// Navigate to Environment Manager - await navigateByIcon(tester, Icons.laptop_windows_outlined); + await helper.navigateToEnvironmentManager(); await Future.delayed(const Duration(milliseconds: 200)); /// Delete the environment variable - final delButtons = find.descendant( - of: find.byType(EditEnvironmentVariables), - matching: find.byIcon(Icons.remove_circle)); - await tester.tap(delButtons.at(0)); + await helper.envHelper.deleteFirstEnvironmentVariable(); await Future.delayed(const Duration(milliseconds: 500)); /// Navigate back to Request Editor - await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await helper.navigateToRequestEditor(); await Future.delayed(const Duration(milliseconds: 200)); /// Check if environment variable is now shown on hover diff --git a/integration_test/env_helper.dart b/integration_test/env_helper.dart new file mode 100644 index 00000000..a2acfb23 --- /dev/null +++ b/integration_test/env_helper.dart @@ -0,0 +1,71 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter/material.dart'; +import 'package:spot/spot.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash/widgets/widgets.dart'; +import 'package:apidash/screens/envvar/environments_pane.dart'; +import 'package:apidash/screens/envvar/editor_pane/variables_pane.dart'; + +class ApidashTestEnvHelper { + final WidgetTester tester; + + ApidashTestEnvHelper(this.tester); + + Future addNewEnvironment({bool isMobile = false}) async { + if (isMobile) { + kEnvScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + } + final newEnvButton = + spot().spot().spotText(kLabelPlusNew); + newEnvButton.existsOnce(); + await act.tap(newEnvButton); + await tester.pumpAndSettle(); + } + + Future renameNewEnvironment(String newEnvName) async { + Finder envItems = find.byType(EnvironmentItem); + Finder newEnvItem = envItems.at(1); + expect(find.descendant(of: newEnvItem, matching: find.text("untitled")), + findsOneWidget); + Finder itemCardMenu = + find.descendant(of: newEnvItem, matching: find.byType(ItemCardMenu)); + await tester.tap(itemCardMenu); + await tester.pumpAndSettle(); + + await tester.tap(find.text(ItemMenuOption.edit.label).last); + await tester.pump(); + await tester.enterText(newEnvItem, newEnvName); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pump(); + } + + Future addEnvironmentVariables( + List<(String, String)> keyValuePairs) async { + final envCells = find.descendant( + of: find.byType(EditEnvironmentVariables), + matching: find.byType(CellField)); + for (var i = 0; i < keyValuePairs.length; i++) { + await tester.enterText(envCells.at(i), keyValuePairs[i].$1); + await tester.enterText(envCells.at(i + 1), keyValuePairs[i].$2); + } + } + + Future deleteFirstEnvironmentVariable() async { + final delButtons = find.descendant( + of: find.byType(EditEnvironmentVariables), + matching: find.byIcon(Icons.remove_circle)); + await tester.tap(delButtons.at(0)); + await tester.pump(); + } + + Future setActiveEnvironment(String envName) async { + await tester.tap(find.descendant( + of: find.byType(EnvironmentPopupMenu), + matching: find.byIcon(Icons.unfold_more))); + await tester.pumpAndSettle(); + + await tester.tap(find.text(envName).last); + await tester.pumpAndSettle(); + } +} diff --git a/integration_test/mobile/env_manager_test.dart b/integration_test/mobile/env_manager_test.dart index ea4632e4..491e4653 100644 --- a/integration_test/mobile/env_manager_test.dart +++ b/integration_test/mobile/env_manager_test.dart @@ -6,11 +6,8 @@ import 'package:spot/spot.dart'; import 'package:apidash/app.dart'; import 'package:apidash/consts.dart'; import 'package:apidash/widgets/widgets.dart'; -import 'package:apidash/screens/screens.dart'; import 'package:apidash/screens/common_widgets/env_trigger_options.dart'; -import 'package:apidash/screens/envvar/editor_pane/variables_pane.dart'; import 'package:apidash/screens/home_page/editor_pane/url_card.dart'; -import 'package:apidash/screens/envvar/environments_pane.dart'; import '../../test/extensions/widget_tester_extensions.dart'; import '../test_helper.dart'; @@ -18,11 +15,9 @@ void main() async { const environmentName = "test-env-name"; const envVarName = "test-env-var"; const envVarValue = "8700000"; - const testEndpoint = "api.apidash.dev/humanize/social?num="; + const testEndpoint = "https://api.apidash.dev/humanize/social?num="; const unknown = "unknown"; - const untitled = "untitled"; - const expectedCurlCode = - "curl --url 'https://api.apidash.dev/humanize/social?num=8700000'"; + const expectedCurlCode = "curl --url '$testEndpoint$envVarValue'"; await ApidashTestHelper.initialize( size: Size(kCompactWindowWidth, kMinWindowSize.height)); @@ -31,79 +26,37 @@ void main() async { await tester.pumpUntilFound(find.byType(DashApp)); await Future.delayed(const Duration(seconds: 1)); - kHomeScaffoldKey.currentState!.openDrawer(); - await tester.pumpAndSettle(); - /// Navigate to Environment Manager - await navigateByIcon(tester, Icons.laptop_windows_outlined); + await helper.navigateToEnvironmentManager(scaffoldKey: kHomeScaffoldKey); await Future.delayed(const Duration(milliseconds: 500)); - kEnvScaffoldKey.currentState!.openDrawer(); - await tester.pumpAndSettle(); - /// Create New Environment - final newEnvButton = - spot().spot().spotText(kLabelPlusNew); - newEnvButton.existsOnce(); - await act.tap(newEnvButton); - await tester.pumpAndSettle(); + await helper.envHelper.addNewEnvironment(isMobile: true); await Future.delayed(const Duration(milliseconds: 500)); - /// Open ItemCardMenu of the new environment - Finder envItems = find.byType(EnvironmentItem); - Finder newEnvItem = envItems.at(1); - expect(find.descendant(of: newEnvItem, matching: find.text(untitled)), - findsOneWidget); - Finder itemCardMenu = - find.descendant(of: newEnvItem, matching: find.byType(ItemCardMenu)); - await tester.tap(itemCardMenu); - await tester.pumpAndSettle(); - /// Rename the new environment - await tester.tap(find.text(ItemMenuOption.edit.label).last); - await tester.pump(); - await tester.enterText(newEnvItem, environmentName); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pump(); + await helper.envHelper.renameNewEnvironment(environmentName); await Future.delayed(const Duration(milliseconds: 500)); kEnvScaffoldKey.currentState!.closeDrawer(); await tester.pumpAndSettle(); - /// Edit Environment Variables - final envCells = find.descendant( - of: find.byType(EditEnvironmentVariables), - matching: find.byType(CellField)); - await tester.enterText(envCells.at(0), envVarName); - await tester.enterText(envCells.at(1), envVarValue); + /// Add Environment Variables + await helper.envHelper.addEnvironmentVariables([(envVarName, envVarValue)]); await Future.delayed(const Duration(milliseconds: 500)); - kEnvScaffoldKey.currentState!.openDrawer(); - await tester.pumpAndSettle(); - /// Navigate to Request Editor - await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await helper.navigateToRequestEditor(scaffoldKey: kEnvScaffoldKey); await Future.delayed(const Duration(milliseconds: 200)); - kHomeScaffoldKey.currentState!.openDrawer(); - await tester.pumpAndSettle(); - /// Create a new request - await act.tap( - spot().spot().spotText(kLabelPlusNew)); - await tester.pumpAndSettle(); + await helper.reqHelper.addNewRequest(isMobile: true); kHomeScaffoldKey.currentState!.closeDrawer(); await tester.pumpAndSettle(); /// Set active environment - await tester.tap(find.descendant( - of: find.byType(EnvironmentPopupMenu), - matching: find.byIcon(Icons.unfold_more))); - await tester.pumpAndSettle(); - - await tester.tap(find.text(environmentName).last); - await tester.pumpAndSettle(); + await helper.envHelper.setActiveEnvironment(environmentName); /// Check if environment suggestions are working await act.tap(spot()); @@ -129,19 +82,12 @@ void main() async { await gesture.moveBy(const Offset(0, 100)); await Future.delayed(const Duration(milliseconds: 500)); - kHomeScaffoldKey.currentState!.openDrawer(); - await tester.pumpAndSettle(); + await helper.navigateToSettings(scaffoldKey: kHomeScaffoldKey); /// Change codegen language to curl - await navigateByIcon(tester, Icons.settings_outlined); - await tester.tap(find.descendant( - of: find.byType(CodegenPopupMenu), - matching: find.byIcon(Icons.unfold_more))); - await tester.pumpAndSettle(); + await helper.changeCodegenLanguage(CodegenLanguage.curl); - await tester.tap(find.text(CodegenLanguage.curl.label).last); - await tester.pumpAndSettle(); - await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await helper.navigateToRequestEditor(); await Future.delayed(const Duration(milliseconds: 200)); /// Check variable substitution in request @@ -153,25 +99,16 @@ void main() async { matching: find.text(expectedCurlCode)), findsOneWidget); - kHomeScaffoldKey.currentState!.openDrawer(); - await tester.pumpAndSettle(); - /// Navigate to Environment Manager - await navigateByIcon(tester, Icons.laptop_windows_outlined); + await helper.navigateToEnvironmentManager(scaffoldKey: kHomeScaffoldKey); await Future.delayed(const Duration(milliseconds: 200)); /// Delete the environment variable - final delButtons = find.descendant( - of: find.byType(EditEnvironmentVariables), - matching: find.byIcon(Icons.remove_circle)); - await tester.tap(delButtons.at(0)); + await helper.envHelper.deleteFirstEnvironmentVariable(); await Future.delayed(const Duration(milliseconds: 500)); - kEnvScaffoldKey.currentState!.openDrawer(); - await tester.pumpAndSettle(); - /// Navigate back to Request Editor - await navigateByIcon(tester, Icons.auto_awesome_mosaic_outlined); + await helper.navigateToRequestEditor(scaffoldKey: kEnvScaffoldKey); await Future.delayed(const Duration(milliseconds: 200)); /// Check if environment variable is now shown on hover diff --git a/integration_test/req_helper.dart b/integration_test/req_helper.dart new file mode 100644 index 00000000..d32680ce --- /dev/null +++ b/integration_test/req_helper.dart @@ -0,0 +1,39 @@ +import 'package:apidash/consts.dart'; +import 'package:apidash/screens/home_page/collection_pane.dart'; +import 'package:apidash/widgets/menu_item_card.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:spot/spot.dart'; + +class ApidashTestRequestHelper { + final WidgetTester tester; + + ApidashTestRequestHelper(this.tester); + + Future addNewRequest({bool isMobile = false}) async { + if (isMobile) { + kHomeScaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + } + await act.tap( + spot().spot().spotText(kLabelPlusNew)); + await tester.pumpAndSettle(); + } + + Future renameNewRequest(String newReqName) async { + Finder reqItems = find.byType(RequestItem); + Finder newReqItem = reqItems.at(0); + expect(find.descendant(of: newReqItem, matching: find.text("untitled")), + findsOneWidget); + Finder itemCardMenu = + find.descendant(of: newReqItem, matching: find.byType(ItemCardMenu)); + await tester.tap(itemCardMenu); + await tester.pumpAndSettle(); + + await tester.tap(find.text(ItemMenuOption.edit.label).last); + await tester.pump(); + await tester.enterText(newReqItem, newReqName); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pump(); + } +} diff --git a/integration_test/test_helper.dart b/integration_test/test_helper.dart index f92a106c..24453d91 100644 --- a/integration_test/test_helper.dart +++ b/integration_test/test_helper.dart @@ -1,16 +1,34 @@ import 'package:apidash/app.dart'; -import 'package:flutter/widgets.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash/widgets/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:integration_test/integration_test.dart'; import 'package:apidash/main.dart' as app; +import 'env_helper.dart'; +import 'req_helper.dart'; + class ApidashTestHelper { final WidgetTester tester; ApidashTestHelper(this.tester); + ApidashTestRequestHelper? _reqHelper; + ApidashTestEnvHelper? _envHelper; + + ApidashTestRequestHelper get reqHelper { + _reqHelper ??= ApidashTestRequestHelper(tester); + return _reqHelper!; + } + + ApidashTestEnvHelper get envHelper { + _envHelper ??= ApidashTestEnvHelper(tester); + return _envHelper!; + } + static Future initialize( {Size? size}) async { final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); @@ -30,6 +48,66 @@ class ApidashTestHelper { ), ); } + + Future navigateToRequestEditor( + {GlobalKey? scaffoldKey}) async { + if (scaffoldKey != null) { + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + } + await tester.tap(find.byIcon(Icons.auto_awesome_mosaic_outlined)); + await tester.pumpAndSettle(); + } + + Future navigateToEnvironmentManager( + {GlobalKey? scaffoldKey}) async { + if (scaffoldKey != null) { + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + } + await tester.tap(find.byIcon(Icons.laptop_windows_outlined)); + await tester.pumpAndSettle(); + } + + Future navigateToHistory( + {GlobalKey? scaffoldKey}) async { + if (scaffoldKey != null) { + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + } + await tester.tap(find.byIcon(Icons.history_outlined)); + await tester.pumpAndSettle(); + } + + Future navigateToSettings( + {GlobalKey? scaffoldKey}) async { + if (scaffoldKey != null) { + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + } + await tester.tap(find.byIcon(Icons.settings_outlined)); + await tester.pumpAndSettle(); + } + + Future changeURIScheme(String scheme) async { + await tester.tap(find.descendant( + of: find.byType(URIPopupMenu), + matching: find.byIcon(Icons.unfold_more))); + await tester.pumpAndSettle(); + + await tester.tap(find.text(scheme).last); + await tester.pumpAndSettle(); + } + + Future changeCodegenLanguage(CodegenLanguage language) async { + await tester.tap(find.descendant( + of: find.byType(CodegenPopupMenu), + matching: find.byIcon(Icons.unfold_more))); + await tester.pumpAndSettle(); + + await tester.tap(find.text(language.label).last); + await tester.pumpAndSettle(); + } } @isTest @@ -46,8 +124,3 @@ void apidashWidgetTest( semanticsEnabled: false, ); } - -Future navigateByIcon(WidgetTester tester, IconData icon) async { - await tester.tap(find.byIcon(icon)); - await tester.pumpAndSettle(); -} From 087c0b4ab131eb35f842a98dd3ac1e6786b4b407 Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Sun, 18 Aug 2024 21:34:11 +0530 Subject: [PATCH 7/8] fix: hover issue --- integration_test/desktop/env_manager_test.dart | 4 +--- integration_test/mobile/env_manager_test.dart | 6 +++--- integration_test/req_helper.dart | 6 ++++++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/integration_test/desktop/env_manager_test.dart b/integration_test/desktop/env_manager_test.dart index a3743501..b68d168c 100644 --- a/integration_test/desktop/env_manager_test.dart +++ b/integration_test/desktop/env_manager_test.dart @@ -7,7 +7,6 @@ import 'package:apidash/app.dart'; import 'package:apidash/consts.dart'; import 'package:apidash/widgets/widgets.dart'; import 'package:apidash/screens/common_widgets/env_trigger_options.dart'; -import 'package:apidash/screens/home_page/editor_pane/editor_request.dart'; import 'package:apidash/screens/home_page/editor_pane/url_card.dart'; import '../../test/extensions/widget_tester_extensions.dart'; import '../test_helper.dart'; @@ -54,8 +53,7 @@ void main() async { await helper.envHelper.setActiveEnvironment(environmentName); /// Check if environment suggestions are working - await act.tap(spot().spot()); - tester.testTextInput.enterText("$testEndpoint{{$envVarName"); + await helper.reqHelper.addRequestURL("$testEndpoint{{$envVarName"); await tester.pumpAndSettle( const Duration(milliseconds: 500)); // wait for suggestions await act.tap(spot() diff --git a/integration_test/mobile/env_manager_test.dart b/integration_test/mobile/env_manager_test.dart index 491e4653..80ea165b 100644 --- a/integration_test/mobile/env_manager_test.dart +++ b/integration_test/mobile/env_manager_test.dart @@ -15,7 +15,8 @@ void main() async { const environmentName = "test-env-name"; const envVarName = "test-env-var"; const envVarValue = "8700000"; - const testEndpoint = "https://api.apidash.dev/humanize/social?num="; + // TODO: Hover on variable doesn't work in test for long URLs + const testEndpoint = "https://api.apidash.dev?num="; const unknown = "unknown"; const expectedCurlCode = "curl --url '$testEndpoint$envVarValue'"; @@ -59,8 +60,7 @@ void main() async { await helper.envHelper.setActiveEnvironment(environmentName); /// Check if environment suggestions are working - await act.tap(spot()); - tester.testTextInput.enterText("$testEndpoint{{$envVarName"); + await helper.reqHelper.addRequestURL("$testEndpoint{{$envVarName"); await tester.pumpAndSettle( const Duration(milliseconds: 500)); // wait for suggestions await act.tap(spot() diff --git a/integration_test/req_helper.dart b/integration_test/req_helper.dart index d32680ce..c72f0af5 100644 --- a/integration_test/req_helper.dart +++ b/integration_test/req_helper.dart @@ -1,5 +1,6 @@ import 'package:apidash/consts.dart'; import 'package:apidash/screens/home_page/collection_pane.dart'; +import 'package:apidash/screens/home_page/editor_pane/url_card.dart'; import 'package:apidash/widgets/menu_item_card.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -36,4 +37,9 @@ class ApidashTestRequestHelper { await tester.testTextInput.receiveAction(TextInputAction.done); await tester.pump(); } + + Future addRequestURL(String url) async { + await act.tap(spot()); + tester.testTextInput.enterText(url); + } } From 6e82d2b5701b149b4dca817ea7d7d473f69f72ac Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Wed, 21 Aug 2024 16:57:01 +0530 Subject: [PATCH 8/8] fix: selected icon test --- test/providers/ui_providers_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/providers/ui_providers_test.dart b/test/providers/ui_providers_test.dart index 82116586..db2f21d1 100644 --- a/test/providers/ui_providers_test.dart +++ b/test/providers/ui_providers_test.dart @@ -217,7 +217,7 @@ void main() { // Verify that the EnvironmentPage is displayed expect(find.byType(EnvironmentPage), findsOneWidget); // Verify that the selected icon is the filled version (selectedIcon) - expect(find.byIcon(Icons.laptop_windows_outlined), findsOneWidget); + expect(find.byIcon(Icons.laptop_windows), findsOneWidget); // Go to HistoryPage container.read(navRailIndexStateProvider.notifier).state = 2;