From fc80f5693c7715807780a8da22c6b1d419554e2e Mon Sep 17 00:00:00 2001 From: poka Date: Tue, 23 Aug 2022 02:13:54 +0200 Subject: [PATCH] test: execute a transaction to ChristCosmic --- integration_test/app_test.dart | 47 ++++++++++++++++++------ integration_test/tests_utility.dart | 20 ++++++++++ lib/models/widgets_keys.dart | 14 +++++-- lib/providers/duniter_indexer.dart | 3 +- lib/screens/home.dart | 3 +- lib/screens/my_contacts.dart | 3 +- lib/screens/search.dart | 3 ++ lib/screens/search_result.dart | 3 +- lib/screens/transaction_in_progress.dart | 2 + lib/screens/wallet_view.dart | 2 + 10 files changed, 78 insertions(+), 22 deletions(-) diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart index b0257be..a30b1e0 100644 --- a/integration_test/app_test.dart +++ b/integration_test/app_test.dart @@ -1,10 +1,9 @@ +import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; - import 'package:gecko/main.dart' as app; - import 'tests_utility.dart'; void main() { @@ -15,22 +14,27 @@ void main() { app.main(); await tester.pumpAndSettle(const Duration(seconds: 1)); - // await deleteAllWallets(tester); + // Delete all existing chests + await deleteAllWallets(tester); + + // Restore a chest await restoreChest(tester); - }); - testWidgets('Send 10 ĞD to ChristCosmic', (tester) async { - // await goKey(tester, buttonKey); + + // Execute a transaction to ChristCosmic + await payChrist(tester); }); }); } // Customs actions Future deleteAllWallets(WidgetTester tester) async { - await goKey(tester, keyDrawerMenu); - await goKey(tester, keyParameters); - await goKey(tester, keyDeleteAllWallets); - await goKey(tester, keyConfirm); - await tester.pumpAndSettle(); + if (await isPresent(tester, 'Rechercher')) { + await goKey(tester, keyDrawerMenu); + await goKey(tester, keyParameters); + await goKey(tester, keyDeleteAllWallets); + await goKey(tester, keyConfirm); + await tester.pumpAndSettle(); + } } Future restoreChest(WidgetTester tester) async { @@ -45,7 +49,8 @@ Future restoreChest(WidgetTester tester) async { await goKey(tester, keyGoNext); await goKey(tester, keyGoNext); await goKey(tester, keyGoNext); - await goKey(tester, keyCachePassword); + final isCached = await isIconPresent(tester, Icons.check_box); + if (!isCached) await goKey(tester, keyCachePassword); await enterText(tester, keyPinForm, 'AAAAA'); await waitFor(tester, 'Accéder à mon coffre'); await goKey(tester, keyGoWalletsHome); @@ -53,3 +58,21 @@ Future restoreChest(WidgetTester tester) async { await goBack(tester); await waitFor(tester, "y'a pas de lézard"); } + +Future payChrist(WidgetTester tester) async { + await waitFor(tester, 'Rechercher'); + await goKey(tester, keyOpenSearch); + await enterText(tester, keySearchField, 'ChristCosmic'); + await goKey(tester, keyConfirmSearch); + await waitFor(tester, 'XuiQeB'); + await goKey(tester, + keyIndexerResult('5CJKhFCpdSpumgWjSZ3TQmejJuHV6iELJrtdrfs38SXuiQeB')); + await waitFor(tester, 'XuiQeB'); + await waitFor(tester, 'ĞD'); + await goKey(tester, keyPay); + await enterText(tester, keyAmountField, '2.14'); + await goKey(tester, keyConfirmPayment); + await waitFor(tester, 'validé !', timeout: const Duration(seconds: 12)); + await goKey(tester, keyCloseTransactionScreen); + await waitFor(tester, 'XuiQeB'); +} diff --git a/integration_test/tests_utility.dart b/integration_test/tests_utility.dart index 30bd14d..cc5c582 100644 --- a/integration_test/tests_utility.dart +++ b/integration_test/tests_utility.dart @@ -46,6 +46,26 @@ Future waitFor( } while (finder.evaluate().isEmpty); } +// Test if text is visible on screen, return a boolean +Future isPresent(WidgetTester tester, String text, + {Duration timeout = const Duration(seconds: 1)}) async { + try { + await waitFor(tester, text, timeout: timeout); + return true; + } catch (exception) { + return false; + } +} + +// Test if widget exist on screen, return a boolean +Future isIconPresent(WidgetTester tester, IconData icon, + {Duration timeout = const Duration(seconds: 1)}) async { + await tester.pumpAndSettle(); + final finder = find.byIcon(icon); + log.d('tatatatatatata: ${finder.evaluate()}'); + return finder.evaluate().isEmpty ? false : true; +} + extension Truncate on String { String truncate({required int max, String suffix = ''}) { return length < max diff --git a/lib/models/widgets_keys.dart b/lib/models/widgets_keys.dart index e83e29d..31a0db1 100644 --- a/lib/models/widgets_keys.dart +++ b/lib/models/widgets_keys.dart @@ -10,7 +10,8 @@ const keyConfirm = Key('keyConfirm'); const keyParameters = Key('keyParameters'); const keyContacts = Key('keyContacts'); const keyDrawerMenu = Key('keyDrawerMenu'); -const keyManageWallets = Key('keyManageWallets'); +const keyOpenWalletsHomme = Key('keyOpenWalletsHomme'); +const keyOpenSearch = Key('keyOpenSearch'); const keyRestoreChest = Key('keyRestoreChest'); // Wallets home @@ -46,6 +47,9 @@ const keyImportChest = Key('keyImportChest'); const keyViewActivity = Key('keyViewActivity'); const keyCertify = Key('keyCertify'); const keyPay = Key('keyPay'); +const keyAmountField = Key('keyAmountField'); +const keyConfirmPayment = Key('keyConfirmPayment'); +const keyCloseTransactionScreen = Key('keyCloseTransactionScreen'); // Activity view const keyListTransactions = Key('keyListTransactions'); @@ -67,8 +71,12 @@ const keyInputWord = Key('keyInputWord'); const keyGeneratedPin = Key('keyGeneratedPin'); const keyGoWalletsHome = Key('keyGoWalletsHome'); +// Search +const keySearchField = Key('keySearchField'); +const keyConfirmSearch = Key('keyConfirmSearch'); + // Unit keys Key keyMnemonicWord(String word) => Key('keyMnemonicWord$word'); -Key keyIndexerResult(int keyId) => Key('keyIndexerResult$keyId'); +Key keyIndexerResult(String keyId) => Key('keyIndexerResult$keyId'); Key keyTransaction(int keyId) => Key('keyTransaction$keyId'); -Key keySearchResult(int keyId) => Key('keySearchResult$keyId'); +Key keySearchResult(String keyId) => Key('keySearchResult$keyId'); diff --git a/lib/providers/duniter_indexer.dart b/lib/providers/duniter_indexer.dart index a4570fb..e0417b7 100644 --- a/lib/providers/duniter_indexer.dart +++ b/lib/providers/duniter_indexer.dart @@ -294,7 +294,6 @@ class DuniterIndexer with ChangeNotifier { return Text('noResult'.tr()); } - int keyID = 0; double avatarSize = 55; return Expanded( child: ListView(children: [ @@ -302,7 +301,7 @@ class DuniterIndexer with ChangeNotifier { Padding( padding: const EdgeInsets.symmetric(horizontal: 5), child: ListTile( - key: keyIndexerResult(keyID++), + key: keyIndexerResult(profile['id']), horizontalTitleGap: 40, contentPadding: const EdgeInsets.all(5), leading: cesiumPlusProvider.defaultAvatar(avatarSize), diff --git a/lib/screens/home.dart b/lib/screens/home.dart index ddff84c..071289a 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -282,6 +282,7 @@ Widget geckHome(context) { child: Material( color: orangeC, // button color child: InkWell( + key: keyOpenSearch, child: Padding( padding: const EdgeInsets.all(18), child: Image( @@ -324,7 +325,7 @@ Widget geckHome(context) { ], ), child: ClipOval( - key: keyManageWallets, + key: keyOpenWalletsHomme, child: Material( color: orangeC, // button color child: InkWell( diff --git a/lib/screens/my_contacts.dart b/lib/screens/my_contacts.dart index abe9fc0..3307e35 100644 --- a/lib/screens/my_contacts.dart +++ b/lib/screens/my_contacts.dart @@ -29,7 +29,6 @@ class ContactsScreen extends StatelessWidget { DuniterIndexer duniterIndexer = Provider.of(context, listen: false); - int keyID = 0; double avatarSize = 55; final myContacts = contactsBox.toMap().values.toList(); @@ -72,7 +71,7 @@ class ContactsScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 5), child: ListTile( - key: keySearchResult(keyID++), + key: keySearchResult('keyID++'), horizontalTitleGap: 40, contentPadding: const EdgeInsets.all(5), leading: cesiumPlusProvider diff --git a/lib/screens/search.dart b/lib/screens/search.dart index 5ab523e..ff3c6d7 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; +import 'package:gecko/models/widgets_keys.dart'; // import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/search.dart'; import 'package:gecko/screens/common_elements.dart'; @@ -51,6 +52,7 @@ class SearchScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 17), child: TextField( + key: keySearchField, controller: searchProvider.searchController, autofocus: true, maxLines: 1, @@ -91,6 +93,7 @@ class SearchScreen extends StatelessWidget { width: 410, height: 70, child: ElevatedButton( + key: keyConfirmSearch, style: ElevatedButton.styleFrom( elevation: 4, primary: orangeC, // background diff --git a/lib/screens/search_result.dart b/lib/screens/search_result.dart index 89ccc05..c1ca7f0 100644 --- a/lib/screens/search_result.dart +++ b/lib/screens/search_result.dart @@ -32,7 +32,6 @@ class SearchResultScreen extends StatelessWidget { DuniterIndexer duniterIndexer = Provider.of(context, listen: false); - int keyID = 0; double avatarSize = 55; return Scaffold( @@ -95,7 +94,7 @@ class SearchResultScreen extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 5), child: ListTile( - key: keySearchResult(keyID++), + key: keySearchResult(g1Wallet.pubkey!), horizontalTitleGap: 40, contentPadding: const EdgeInsets.all(5), leading: cesiumPlusProvider diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index dafd381..b00c805 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; +import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallets_profiles.dart'; @@ -263,6 +264,7 @@ class TransactionInProgress extends StatelessWidget { width: 380 * ratio, height: 60 * ratio, child: ElevatedButton( + key: keyCloseTransactionScreen, style: ElevatedButton.styleFrom( elevation: 4, primary: orangeC, // background diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index c606cc9..45db562 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -573,6 +573,7 @@ class WalletViewScreen extends StatelessWidget { ), const SizedBox(height: 10), TextField( + key: keyAmountField, controller: walletViewProvider.payAmount, autofocus: true, maxLines: 1, @@ -618,6 +619,7 @@ class WalletViewScreen extends StatelessWidget { width: double.infinity, height: 60, child: ElevatedButton( + key: keyConfirmPayment, style: ElevatedButton.styleFrom( elevation: 4, primary: orangeC, // background