diff --git a/Makefile b/Makefile index c9b33a8..981eab3 100644 --- a/Makefile +++ b/Makefile @@ -108,4 +108,4 @@ web_build_and_host: file_test: @reset - @flutter test test/shared/widgets/mobile_footer_tests.dart \ No newline at end of file + @flutter test test/ diff --git a/lib/home/sections/get_test_tokens.dart b/lib/home/sections/get_test_tokens.dart index 96c0939..495b303 100644 --- a/lib/home/sections/get_test_tokens.dart +++ b/lib/home/sections/get_test_tokens.dart @@ -59,237 +59,234 @@ class GetTestTokens extends HookConsumerWidget { return null; }, []); - return Container( - decoration: BoxDecoration(color: getSelectedColor(colorTheme, 0xFFFFFFFF, 0xFF282A2C)), + return SingleChildScrollView( child: Padding( padding: EdgeInsets.all(isMobile ? 16.0 : 40.0), - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - Strings.getTestNetwork, - style: headlineLarge(context), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + Strings.getTestNetwork, + style: headlineLarge(context), + ), + const SizedBox( + height: 48, + ), + Container( + height: 64, + width: 560, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: const Color.fromRGBO(112, 64, 236, 0.04), ), - const SizedBox( - height: 48, - ), - Container( - height: 64, - width: 560, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - color: const Color.fromRGBO(112, 64, 236, 0.04), - ), - child: Row( - children: [ - const SizedBox(width: 16), - Icon( - Icons.warning_amber, - color: getSelectedColor(colorTheme, 0xFF7040EC, 0xFF7040EC), - size: 24, - ), - const SizedBox(width: 16), - Expanded( - child: SizedBox( - width: 450, - child: Text( - 'Confirm details before submitting', - style: TextStyle( - fontSize: 14, - fontFamily: 'Rational Display', - fontWeight: FontWeight.w300, - color: getSelectedColor(colorTheme, 0xFF7040EC, 0xFF7040EC), - ), + child: Row( + children: [ + const SizedBox(width: 16), + Icon( + Icons.warning_amber, + color: getSelectedColor(colorTheme, 0xFF7040EC, 0xFF7040EC), + size: 24, + ), + const SizedBox(width: 16), + Expanded( + child: SizedBox( + width: 450, + child: Text( + 'Confirm details before submitting', + style: TextStyle( + fontSize: 14, + fontFamily: 'Rational Display', + fontWeight: FontWeight.w300, + color: getSelectedColor(colorTheme, 0xFF7040EC, 0xFF7040EC), ), ), ), - ], - ), - ), - const SizedBox( - height: 48, - ), - TextField( - key: lvlInputKey, - controller: TextEditingController(text: 'LVL'), - enabled: false, - style: bodyMedium(context), - decoration: InputDecoration( - labelText: 'Tokens', - labelStyle: bodyMedium(context), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), - ), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), - ), ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), - ), - ), - ), - ), - const SizedBox( - height: 24, + ], ), - CustomTestNetwork( - key: selectNetworkKey, - ), - const SizedBox( - height: 24, - ), - TextField( - key: addressInputKey, - controller: textWalletEditingController, - style: bodyMedium(context), - decoration: InputDecoration( - labelText: 'Wallet Address', - labelStyle: bodyMedium(context), - hintText: '0xxxxxxxxxxxxxxxxxxxxxxxxx', - suffix: TextButton( - style: TextButton.styleFrom( - foregroundColor: const Color(0xFFC0C4C4), - padding: const EdgeInsets.all(16.0), - textStyle: const TextStyle(fontSize: 16), - ), - onPressed: () async { - final copiedData = await Clipboard.getData('text/plain'); - textWalletEditingController.value = TextEditingValue( - text: copiedData?.text ?? '', - selection: TextSelection.fromPosition( - TextPosition(offset: copiedData?.text?.length ?? 0), - ), - ); - }, - child: const Text('Paste'), - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), - ), + ), + const SizedBox( + height: 48, + ), + TextField( + key: lvlInputKey, + controller: TextEditingController(text: 'LVL'), + enabled: false, + style: bodyMedium(context), + decoration: InputDecoration( + labelText: 'Tokens', + labelStyle: bodyMedium(context), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide( + color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), - ), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide( + color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), - ), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide( + color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), ), ), ), - const SizedBox( - height: 8, - ), - Stack(children: [ - SizedBox( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text( - validate ? "This field is required" : '', - style: titleSmall(context), + ), + const SizedBox( + height: 24, + ), + CustomTestNetwork( + key: selectNetworkKey, + ), + const SizedBox( + height: 24, + ), + TextField( + key: addressInputKey, + controller: textWalletEditingController, + style: bodyMedium(context), + decoration: InputDecoration( + labelText: 'Wallet Address', + labelStyle: bodyMedium(context), + hintText: '0xxxxxxxxxxxxxxxxxxxxxxxxx', + suffix: TextButton( + style: TextButton.styleFrom( + foregroundColor: const Color(0xFFC0C4C4), + padding: const EdgeInsets.all(16.0), + textStyle: const TextStyle(fontSize: 16), + ), + onPressed: () async { + final copiedData = await Clipboard.getData('text/plain'); + textWalletEditingController.value = TextEditingValue( + text: copiedData?.text ?? '', + selection: TextSelection.fromPosition( + TextPosition(offset: copiedData?.text?.length ?? 0), ), - ], + ); + }, + child: const Text('Paste'), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide( + color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), ), ), - SizedBox( - height: !isMobile ? 30 : null, + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide( + color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), + ), ), - WebViewX( - key: recaptchaWidgetKey, - initialContent: initialContent, - initialSourceType: SourceType.html, - height: 220, - width: 400, - onWebViewCreated: (controller) => webviewController = controller, - dartCallBacks: const {}, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide( + color: getSelectedColor(colorTheme, 0xFFC0C4C4, 0xFF858E8E), + ), ), - ]), - Padding( - padding: const EdgeInsets.only(top: 64.0), + ), + ), + const SizedBox( + height: 8, + ), + Stack(children: [ + SizedBox( child: Row( - mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.end, children: [ - Expanded( - child: SizedBox( - width: isMobile ? 100 : 272, - height: 56, - child: TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: Text( - 'Cancel', - style: titleSmall(context), - )), - ), - ), - const SizedBox( - width: 16, + Text( + validate ? "This field is required" : '', + style: titleSmall(context), ), - Expanded( - child: SizedBox( - width: isMobile ? 100 : 272, - height: 56, - child: ElevatedButton( - key: requestTokenButtonKey, - onPressed: () async { - await verifyToken(token); - if (token.value.isEmpty) { - // ignore: use_build_context_synchronously - errorDialogBuilder(context, 'Please verify reCaptcha'); - } else { - // ignore: use_build_context_synchronously - notifier.makeRequest( - context, - Request( - network: NetworkName.testnet, - walletAddress: textWalletEditingController.text, - status: Status.confirmed, - dateTime: DateTime.now(), - tokensDisbursed: 100, - ), - ); - } + ], + ), + ), + SizedBox( + height: !isMobile ? 30 : null, + ), + WebViewX( + key: recaptchaWidgetKey, + initialContent: initialContent, + initialSourceType: SourceType.html, + height: isMobile ? 110 : 220, + width: isMobile ? 200 : 400, + onWebViewCreated: (controller) => webviewController = controller, + dartCallBacks: const {}, + ), + ]), + Padding( + padding: const EdgeInsets.only(top: 64.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: SizedBox( + width: isMobile ? 100 : 272, + height: 56, + child: TextButton( + onPressed: () { + Navigator.pop(context); }, - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - const Color(0xFF0DC8D4), - ), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), + child: Text( + 'Cancel', + style: titleSmall(context), + )), + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: SizedBox( + width: isMobile ? 100 : 272, + height: 56, + child: ElevatedButton( + key: requestTokenButtonKey, + onPressed: () async { + await verifyToken(token); + if (token.value.isEmpty) { + // ignore: use_build_context_synchronously + errorDialogBuilder(context, 'Please verify reCaptcha'); + } else { + // ignore: use_build_context_synchronously + notifier.makeRequest( + context, + Request( + network: NetworkName.testnet, + walletAddress: textWalletEditingController.text, + status: Status.confirmed, + dateTime: DateTime.now(), + tokensDisbursed: 100, ), - ), + ); + } + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + const Color(0xFF0DC8D4), ), - child: Text( - Strings.getLVL, - style: titleSmall(context)!.copyWith(color: Colors.white), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), ), ), + child: Text( + Strings.getLVL, + style: titleSmall(context)!.copyWith(color: Colors.white), + ), ), ), - ], - ), - ) - ], - ), + ), + ], + ), + ) + ], ), ), ); diff --git a/lib/shared/extended-libraries/webviewx/src/controller/impl/web.dart b/lib/shared/extended-libraries/webviewx/src/controller/impl/web.dart index 7f3f165..34e535b 100644 --- a/lib/shared/extended-libraries/webviewx/src/controller/impl/web.dart +++ b/lib/shared/extended-libraries/webviewx/src/controller/impl/web.dart @@ -1,6 +1,5 @@ import 'dart:async' show Future; -// ignore: avoid_web_libraries_in_flutter -import 'dart:js' as js; +import 'package:universal_html/js.dart' as js; import 'package:faucet/shared/extended-libraries/webviewx/src/utils/logger.dart'; import 'package:faucet/shared/extended-libraries/webviewx/src/utils/source_type.dart'; @@ -222,13 +221,15 @@ class WebViewXController extends ChangeNotifier implements i.WebViewXController< /// Retrieves the inner page title @override Future getTitle() { - return Future.value(connector["document"]["title"].toString()); + final Map connectorMap = connector as Map; + return Future.value(connectorMap["document"]["title"].toString()); } /// Clears cache @override Future clearCache() { - connector["localStorage"].callMethod("clear", []); + final Map connectorMap = connector as Map; + connectorMap["localStorage"].callMethod("clear", []); evalRawJavascript( 'caches.keys().then((keyList) => Promise.all(keyList.map((key) => caches.delete(key))))', ); diff --git a/lib/shared/extended-libraries/webviewx/src/view/impl/web.dart b/lib/shared/extended-libraries/webviewx/src/view/impl/web.dart index a389ef5..6a05d21 100644 --- a/lib/shared/extended-libraries/webviewx/src/view/impl/web.dart +++ b/lib/shared/extended-libraries/webviewx/src/view/impl/web.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:html' as html; -import 'dart:js' as js; +import 'package:universal_html/html.dart' as html; +import 'package:universal_html/js.dart' as js; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -46,8 +46,7 @@ class WebViewX extends StatefulWidget implements view_interface.WebViewX { /// Callback which returns a referrence to the [WebViewXController] /// being created. @override - final Function(ctrl_interface.WebViewXController controller)? - onWebViewCreated; + final Function(ctrl_interface.WebViewXController controller)? onWebViewCreated; /// A set of [EmbeddedJsContent]. /// @@ -123,8 +122,7 @@ class WebViewX extends StatefulWidget implements view_interface.WebViewX { this.dartCallBacks = const {}, this.ignoreAllGestures = false, this.javascriptMode = JavascriptMode.unrestricted, - this.initialMediaPlaybackPolicy = - AutoMediaPlaybackPolicy.requireUserActionForAllMediaTypes, + this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.requireUserActionForAllMediaTypes, this.onPageStarted, this.onPageFinished, this.navigationDelegate, @@ -163,8 +161,7 @@ class _WebViewXState extends State { if (widget.initialSourceType == SourceType.html || widget.initialSourceType == SourceType.urlBypass || - (widget.initialSourceType == SourceType.url && - widget.initialContent == 'about:blank')) { + (widget.initialSourceType == SourceType.url && widget.initialContent == 'about:blank')) { _connectJsToFlutter(then: _callOnWebViewCreatedCallback); } else { _callOnWebViewCreatedCallback(); @@ -218,58 +215,6 @@ class _WebViewXState extends State { webViewXController.connector = jsWindowObject; then?.call(); - - /* - // Registering the same events as we already do inside - // HtmlUtils.embedClickListenersInPageSource(), but in Dart. - // So far it seems to be working, but needs more testing. - - jsWindowObject.callMethod('addEventListener', [ - "click", - js.allowInterop((event) { - final href = jsWindowObject["document"]["activeElement"]["href"].toString(); - print(href); - }) - ]); - - jsWindowObject.callMethod('addEventListener', [ - "submit", - js.allowInterop((event) { - final form = jsWindowObject["document"]["activeElement"]["form"]; - - final method = form["method"].toString(); - - if (method == 'get') { - final action = jsWindowObject.callMethod( - 'eval', - [ - "document.activeElement.form.action + '?' + new URLSearchParams(new FormData(document.activeElement.form))" - ], - ).toString(); - print(action); - } else { - // post - final action = form["action"].toString(); - - final formData = jsWindowObject - .callMethod( - 'eval', - ["[...new FormData(document.activeElement.form)]"], - ) - .toString() - .split(','); - - final mappedFields = {}; - for (var i = 0; i < formData.length; i++) { - if (i % 2 != 0) { - mappedFields[formData[i - 1]] = formData[i]; - } - } - print(mappedFields); - } - }) - ]); - */ }; } @@ -362,8 +307,7 @@ class _WebViewXState extends State { final allow = widget.webSpecificParams.additionalAllowOptions; - if (widget.initialMediaPlaybackPolicy == - AutoMediaPlaybackPolicy.alwaysAllow) { + if (widget.initialMediaPlaybackPolicy == AutoMediaPlaybackPolicy.alwaysAllow) { allow.add('autoplay'); } @@ -459,8 +403,7 @@ class _WebViewXState extends State { final href = dartObj['href'] as String; _debugLog(dartObj.toString()); - if (!await _checkNavigationAllowed( - href, webViewXController.value.sourceType)) { + if (!await _checkNavigationAllowed(href, webViewXController.value.sourceType)) { _debugLog('Navigation not allowed for source:\n$href\n'); return; } diff --git a/pubspec.yaml b/pubspec.yaml index 2b7eca5..4ef7e66 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,7 +58,7 @@ dependencies: collection: ^1.17.2 pointer_interceptor: ^0.9.3+5 easy_web_view: ^1.6.0 - + universal_html: ^2.2.4 dev_dependencies: flutter_test: diff --git a/test/requests/desktop_request_failed_test.dart b/test/requests/desktop_request_failed_test.dart index a4f299e..e1f38cf 100644 --- a/test/requests/desktop_request_failed_test.dart +++ b/test/requests/desktop_request_failed_test.dart @@ -18,9 +18,9 @@ void main() async { await requestTests.runTests(); } -Future invalidTestTokenRequest(TestScreenSizes testScreenSize) async => testWidgets( - 'Desktop - Should fail on invalid test token request', - (WidgetTester tester) async { +Future invalidTestTokenRequest(TestScreenSizes testScreenSize) async => + testWidgets('Should fail on invalid test token request', (WidgetTester tester) async { + await tester.runAsync(() async { await tester.pumpWidget( await essentialTestProviderWidget(tester: tester, testScreenSize: testScreenSize, overrides: [ hivePackageProvider.overrideWithValue( @@ -29,29 +29,47 @@ Future invalidTestTokenRequest(TestScreenSizes testScreenSize) async => te ]), ); await tester.pumpAndSettle(); + await tester.pumpAndSettle(); // click request token button await tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); await tester.pumpAndSettle(); - await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); await tester.pumpAndSettle(); - // check that the drawer is displayed - expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); - // click the request token button - var requestTokenButton = find.byKey(GetTestTokens.requestTokenButtonKey); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); + }); - await tester.ensureVisible(requestTokenButton); - await tester.pumpAndSettle(); - await tester.tap(requestTokenButton); - await tester.pumpAndSettle(); - await tester.ensureVisible(find.byKey(SuccessDialog.requestSuccessDialogKey)); - // first time success message - expect(find.byKey(SuccessDialog.requestSuccessDialogKey), findsOneWidget); - // find close button - await tester.tap(find.byKey(SuccessDialog.closeSuccessDialogKey)); - await tester.pumpAndSettle(); - await tester.pumpAndSettle(); - await tester.tap(requestTokenButton); - await tester.pumpAndSettle(const Duration(seconds: 1)); - expect(find.byKey(ErrorDialog.requestErrorDialogKey), findsOneWidget); - }, - ); + await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(SuccessDialog.requestSuccessDialogKey)); + }); + + Future.delayed(Duration.zero, () { + expect(find.byKey(SuccessDialog.requestSuccessDialogKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.bySemanticsLabel('Close'), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(ErrorDialog.requestErrorDialogKey), findsOneWidget); + }); + }); + }); diff --git a/test/requests/desktop_request_success_test.dart b/test/requests/desktop_request_success_test.dart new file mode 100644 index 0000000..42342b3 --- /dev/null +++ b/test/requests/desktop_request_success_test.dart @@ -0,0 +1,64 @@ +import 'package:faucet/home/sections/get_test_tokens.dart'; +import 'package:faucet/shared/services/hive/hive_service.dart'; +import 'package:faucet/transactions/sections/transaction_table.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../essential_test_provider_widget.dart'; +import '../required_test_class.dart'; +import 'utils/mock_request_hive_utils.dart'; + +class DesktopRequestSuccessTokensTest extends RequiredTest { + Future Function(TestScreenSizes testScreenSize) requestTokenTest; + + DesktopRequestSuccessTokensTest({ + required this.requestTokenTest, + required super.testScreenSize, + }); + + Future runTests() async { + await requestTokenTest(testScreenSize); + } +} + +void main() async { + final requestTests = DesktopRequestSuccessTokensTest( + requestTokenTest: (testScreenSize) => requestTokenTest(testScreenSize), + testScreenSize: TestScreenSizes.desktop, + ); + + await requestTests.runTests(); +} + +Future requestTokenTest(TestScreenSizes testScreenSize) async => + testWidgets('Should confirm that tokens are requested ${testScreenSize.name}', (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget( + await essentialTestProviderWidget( + tester: tester, + testScreenSize: testScreenSize, + overrides: [hivePackageProvider.overrideWithValue(getMockRequestHive().mockHive)], + ), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); + }); + + await tester.pumpAndSettle(); + await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey), warnIfMissed: false); + + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(TransactionTableScreen.requestTokensKey), warnIfMissed: false); + }); + await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey), warnIfMissed: false); + + Future.delayed(Duration.zero, () { + expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); + }); + + Future.delayed(Duration.zero, () async { + await tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey), warnIfMissed: false); + }); + }); + }); diff --git a/test/requests/mobile_request_failed_test.dart b/test/requests/mobile_request_failed_test.dart index c487bc2..252fa24 100644 --- a/test/requests/mobile_request_failed_test.dart +++ b/test/requests/mobile_request_failed_test.dart @@ -2,9 +2,7 @@ import 'package:faucet/home/sections/get_test_tokens.dart'; import 'package:faucet/requests/providers/requests_provider.dart'; import 'package:faucet/shared/services/hive/hive_service.dart'; import 'package:faucet/transactions/sections/transaction_table.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter_test/flutter_test.dart'; - import '../essential_test_provider_widget.dart'; import '../required_test_class.dart'; import 'required_request_tests.dart'; @@ -19,40 +17,60 @@ void main() async { await requestTests.runTests(); } -Future invalidTestTokenRequest(TestScreenSizes testScreenSize) async => testWidgets( - 'Mobile - Should fail on invalid test token request', - (WidgetTester tester) async { - await tester.pumpWidget( - await essentialTestProviderWidget(tester: tester, testScreenSize: testScreenSize, overrides: [ - hivePackageProvider.overrideWithValue( - getMockRequestHive().mockHive, - ), - ]), - ); - await tester.pumpAndSettle(); - // click request token button - await tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); - await tester.pumpAndSettle(); - // check that the drawer is displayed - expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); - // click the request token button - var requestTokenButton = find.byKey(GetTestTokens.requestTokenButtonKey); +Future invalidTestTokenRequest(TestScreenSizes testScreenSize) async => + testWidgets('Mobile - Should fail on invalid test token request', (WidgetTester tester) async { + await tester.runAsync( + () async { + await tester.pumpWidget( + await essentialTestProviderWidget(tester: tester, testScreenSize: testScreenSize, overrides: [ + hivePackageProvider.overrideWithValue( + getMockRequestHive().mockHive, + ), + ]), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + // click request token button + await tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); + }); + + await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(SuccessDialog.requestSuccessDialogKey)); + }); - await tester.ensureVisible(requestTokenButton); - await tester.pumpAndSettle(); - await tester.tap(requestTokenButton); - await tester.pumpAndSettle(); - await tester.ensureVisible(find.byKey(SuccessDialog.requestSuccessDialogKey)); - // first time success message - expect(find.byKey(SuccessDialog.requestSuccessDialogKey), findsOneWidget); - // find close button - await tester.tap(find.byKey(SuccessDialog.closeSuccessDialogKey)); - await tester.pumpAndSettle(); - await tester.pumpAndSettle(); - await tester.tap(requestTokenButton); - await tester.pumpAndSettle(const Duration(seconds: 1)); - expect(find.byKey(ErrorDialog.requestErrorDialogKey), findsOneWidget); - }, - ); + Future.delayed(Duration.zero, () { + expect(find.byKey(SuccessDialog.requestSuccessDialogKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.bySemanticsLabel('Close'), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(ErrorDialog.requestErrorDialogKey), findsOneWidget); + }); + }, + ); + }); diff --git a/test/requests/mobile_request_success_test.dart b/test/requests/mobile_request_success_test.dart new file mode 100644 index 0000000..252fa24 --- /dev/null +++ b/test/requests/mobile_request_success_test.dart @@ -0,0 +1,76 @@ +import 'package:faucet/home/sections/get_test_tokens.dart'; +import 'package:faucet/requests/providers/requests_provider.dart'; +import 'package:faucet/shared/services/hive/hive_service.dart'; +import 'package:faucet/transactions/sections/transaction_table.dart'; +import 'package:flutter_test/flutter_test.dart'; +import '../essential_test_provider_widget.dart'; +import '../required_test_class.dart'; +import 'required_request_tests.dart'; +import 'utils/mock_request_hive_utils.dart'; + +void main() async { + final requestTests = RequiredInvalidRequestsTests( + invalidTestTokenRequest: (testScreenSize) => invalidTestTokenRequest(testScreenSize), + testScreenSize: TestScreenSizes.mobile, + ); + + await requestTests.runTests(); +} + +Future invalidTestTokenRequest(TestScreenSizes testScreenSize) async => + testWidgets('Mobile - Should fail on invalid test token request', (WidgetTester tester) async { + await tester.runAsync( + () async { + await tester.pumpWidget( + await essentialTestProviderWidget(tester: tester, testScreenSize: testScreenSize, overrides: [ + hivePackageProvider.overrideWithValue( + getMockRequestHive().mockHive, + ), + ]), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + // click request token button + await tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); + }); + + await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(SuccessDialog.requestSuccessDialogKey)); + }); + + Future.delayed(Duration.zero, () { + expect(find.byKey(SuccessDialog.requestSuccessDialogKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.bySemanticsLabel('Close'), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(ErrorDialog.requestErrorDialogKey), findsOneWidget); + }); + }, + ); + }); diff --git a/test/requests/open_request_menu_test.dart b/test/requests/open_request_menu_test.dart index 7275332..088dc90 100644 --- a/test/requests/open_request_menu_test.dart +++ b/test/requests/open_request_menu_test.dart @@ -2,7 +2,6 @@ import 'package:faucet/transactions/sections/transaction_table.dart'; import 'package:faucet/home/sections/get_test_tokens.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_test/flutter_test.dart'; - import '../essential_test_provider_widget.dart'; import '../required_test_class.dart'; import './required_request_tests.dart'; @@ -12,29 +11,32 @@ void main() async { menuOpened: (testScreenSize) => menuOpened(testScreenSize), testScreenSize: TestScreenSizes.desktop, ); - await requestsTests.runTests(); } Future menuOpened(TestScreenSizes testScreenSize) async { testWidgets('Request tokens menu should appear', (WidgetTester tester) async { - await tester.pumpWidget( - await essentialTestProviderWidget( - tester: tester, - testScreenSize: testScreenSize, - ), - ); - await tester.pumpAndSettle(); - - final scrollable = find.byKey(const Key("transactionTableKey")); - expect(scrollable, findsOneWidget); - var button = find.byKey(TransactionTableScreen.requestTokensKey); - await tester.ensureVisible(button); - expect(button, findsOneWidget); - - await tester.tap(button); - await tester.pumpAndSettle(const Duration(seconds: 2)); - - expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); + await tester.runAsync(() async { + await tester.pumpWidget( + await essentialTestProviderWidget( + tester: tester, + testScreenSize: testScreenSize, + ), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + expect(find.byKey(const Key("transactionTableKey")), findsOneWidget); + }); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); + }); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey), warnIfMissed: false); + Future.delayed(Duration.zero, () { + expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); + }); + }); }); } diff --git a/test/requests/tablet_request_failed_test.dart b/test/requests/tablet_request_failed_test.dart index 0a3de4b..cc574fc 100644 --- a/test/requests/tablet_request_failed_test.dart +++ b/test/requests/tablet_request_failed_test.dart @@ -2,9 +2,7 @@ import 'package:faucet/home/sections/get_test_tokens.dart'; import 'package:faucet/requests/providers/requests_provider.dart'; import 'package:faucet/shared/services/hive/hive_service.dart'; import 'package:faucet/transactions/sections/transaction_table.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter_test/flutter_test.dart'; - import '../essential_test_provider_widget.dart'; import '../required_test_class.dart'; import 'required_request_tests.dart'; @@ -15,44 +13,58 @@ void main() async { invalidTestTokenRequest: (testScreenSize) => invalidTestTokenRequest(testScreenSize), testScreenSize: TestScreenSizes.tablet, ); - await requestTests.runTests(); } -Future invalidTestTokenRequest(TestScreenSizes testScreenSize) async => testWidgets( - 'Tablet - Should fail on invalid test token request', - (WidgetTester tester) async { - await tester.pumpWidget( - await essentialTestProviderWidget(tester: tester, testScreenSize: testScreenSize, overrides: [ - hivePackageProvider.overrideWithValue( - getMockRequestHive().mockHive, - ), - ]), - ); - await tester.pumpAndSettle(); - // click request token button - await tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); - await tester.pumpAndSettle(); - await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); - await tester.pumpAndSettle(); - // check that the drawer is displayed - expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); - // click the request token button - var requestTokenButton = find.byKey(GetTestTokens.requestTokenButtonKey); +Future invalidTestTokenRequest(TestScreenSizes testScreenSize) async => + testWidgets('Tablet - Should fail on invalid test token request', (WidgetTester tester) async { + await tester.runAsync( + () async { + await tester.pumpWidget( + await essentialTestProviderWidget(tester: tester, testScreenSize: testScreenSize, overrides: [ + hivePackageProvider.overrideWithValue( + getMockRequestHive().mockHive, + ), + ]), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + // click request token button + await tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); + }); + await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey)); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); - await tester.ensureVisible(requestTokenButton); - await tester.pumpAndSettle(); - await tester.tap(requestTokenButton); - await tester.pumpAndSettle(); - await tester.ensureVisible(find.byKey(SuccessDialog.requestSuccessDialogKey)); - // first time success message - expect(find.byKey(SuccessDialog.requestSuccessDialogKey), findsOneWidget); - // find close button - await tester.tap(find.byKey(SuccessDialog.closeSuccessDialogKey)); - await tester.pumpAndSettle(); - await tester.pumpAndSettle(); - await tester.tap(requestTokenButton); - await tester.pumpAndSettle(const Duration(seconds: 1)); - expect(find.byKey(ErrorDialog.requestErrorDialogKey), findsOneWidget); - }, - ); + Future.delayed(Duration.zero, () { + expect(find.byKey(SuccessDialog.requestSuccessDialogKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.bySemanticsLabel('Close'), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey)); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(ErrorDialog.requestErrorDialogKey), findsOneWidget); + }); + }, + ); + }); diff --git a/test/requests/tablet_request_success_test.dart b/test/requests/tablet_request_success_test.dart new file mode 100644 index 0000000..223fff3 --- /dev/null +++ b/test/requests/tablet_request_success_test.dart @@ -0,0 +1,71 @@ +import 'package:faucet/home/sections/get_test_tokens.dart'; +import 'package:faucet/requests/providers/requests_provider.dart'; +import 'package:faucet/shared/services/hive/hive_service.dart'; +import 'package:faucet/transactions/sections/transaction_table.dart'; +import 'package:flutter_test/flutter_test.dart'; +import '../essential_test_provider_widget.dart'; +import '../required_test_class.dart'; +import 'utils/mock_request_hive_utils.dart'; + +class TabletRequestTokensTest extends RequiredTest { + Future Function(TestScreenSizes testScreenSize) requestTokenTestTablet; + + TabletRequestTokensTest({ + required this.requestTokenTestTablet, + required super.testScreenSize, + }); + + Future runTests() async { + await requestTokenTestTablet(testScreenSize); + } +} + +void main() async { + final requestTests = TabletRequestTokensTest( + requestTokenTestTablet: (testScreenSize) => requestTokenTestTablet(testScreenSize), + testScreenSize: TestScreenSizes.tablet, + ); + + await requestTests.runTests(); +} + +Future requestTokenTestTablet(TestScreenSizes testScreenSize) async => + testWidgets('Should confirm that tokens are requested ${testScreenSize.name}', (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget( + await essentialTestProviderWidget( + tester: tester, + testScreenSize: testScreenSize, + overrides: [hivePackageProvider.overrideWithValue(getMockRequestHive().mockHive)], + ), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + + // click request token button + Future.delayed(Duration.zero, () { + tester.ensureVisible(find.byKey(TransactionTableScreen.requestTokensKey)); + }); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(TransactionTableScreen.requestTokensKey), warnIfMissed: false); + + Future.delayed(Duration.zero, () { + expect(find.byKey(GetTestTokens.getTestTokensKey), findsOneWidget); + }); + Future.delayed(Duration.zero, () { + tester.pumpAndSettle(); + }); + + Future.delayed(Duration.zero, () async { + await tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey), warnIfMissed: false); + }); + + Future.delayed(Duration.zero, () async { + await tester.tap(find.byKey(GetTestTokens.requestTokenButtonKey), warnIfMissed: false); + }); + Future.delayed(Duration.zero, () { + expect(find.byKey(SuccessDialog.requestSuccessDialogKey), findsOneWidget); + }); + }); + }); diff --git a/test/transactions/desktop_transactions_test.dart b/test/transactions/desktop_transactions_test.dart index a6e77ee..d637b60 100644 --- a/test/transactions/desktop_transactions_test.dart +++ b/test/transactions/desktop_transactions_test.dart @@ -1,6 +1,5 @@ -import 'package:faucet/transactions/sections/transaction_table.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; - import '../essential_test_provider_widget.dart'; import '../required_test_class.dart'; import 'required_transactions_tests.dart'; @@ -14,13 +13,17 @@ void main() async { Future transactionLoaded(TestScreenSizes testScreenSize) async => testWidgets('Desktop - Should show transaction table when transactions are loaded', (WidgetTester tester) async { - await tester.pumpWidget( - await essentialTestProviderWidget( - tester: tester, - testScreenSize: testScreenSize, - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(TransactionTableScreen.transactionsTableKey), findsOneWidget); + await tester.runAsync(() async { + await tester.pumpWidget( + await essentialTestProviderWidget( + tester: tester, + testScreenSize: testScreenSize, + ), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + expect(find.byKey(const Key("transactionTableKey")), findsOneWidget); + }); + }); }); diff --git a/test/transactions/mobile_transactions_test.dart b/test/transactions/mobile_transactions_test.dart index 919d356..1f8efa7 100644 --- a/test/transactions/mobile_transactions_test.dart +++ b/test/transactions/mobile_transactions_test.dart @@ -1,6 +1,5 @@ -import 'package:faucet/transactions/sections/transaction_table.dart'; +import 'package:flutter/semantics.dart'; import 'package:flutter_test/flutter_test.dart'; - import '../essential_test_provider_widget.dart'; import '../required_test_class.dart'; import 'required_transactions_tests.dart'; @@ -13,13 +12,17 @@ void main() async { Future transactionLoaded(TestScreenSizes testScreenSize) async => testWidgets('Mobile - Should show transaction table when transactions are loaded', (WidgetTester tester) async { - await tester.pumpWidget( - await essentialTestProviderWidget( - tester: tester, - testScreenSize: testScreenSize, - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(TransactionTableScreen.transactionsTableKey), findsOneWidget); + await tester.runAsync(() async { + await tester.pumpWidget( + await essentialTestProviderWidget( + tester: tester, + testScreenSize: testScreenSize, + ), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + expect(find.byKey(const Key("transactionTableKey")), findsOneWidget); + }); + }); }); diff --git a/test/transactions/tablet_transactions_test.dart b/test/transactions/tablet_transactions_test.dart index dc68519..a8d5ec6 100644 --- a/test/transactions/tablet_transactions_test.dart +++ b/test/transactions/tablet_transactions_test.dart @@ -1,6 +1,5 @@ -import 'package:faucet/transactions/sections/transaction_table.dart'; +import 'package:flutter/semantics.dart'; import 'package:flutter_test/flutter_test.dart'; - import '../essential_test_provider_widget.dart'; import '../required_test_class.dart'; import 'required_transactions_tests.dart'; @@ -13,13 +12,17 @@ void main() async { Future transactionLoaded(TestScreenSizes testScreenSize) async => testWidgets('Tablet - Should show transaction table when transactions are loaded', (WidgetTester tester) async { - await tester.pumpWidget( - await essentialTestProviderWidget( - tester: tester, - testScreenSize: testScreenSize, - ), - ); - await tester.pumpAndSettle(); - - expect(find.byKey(TransactionTableScreen.transactionsTableKey), findsOneWidget); + await tester.runAsync(() async { + await tester.pumpWidget( + await essentialTestProviderWidget( + tester: tester, + testScreenSize: testScreenSize, + ), + ); + await tester.pumpAndSettle(); + await tester.pumpAndSettle(); + Future.delayed(Duration.zero, () { + expect(find.byKey(const Key("transactionTableKey")), findsOneWidget); + }); + }); });