From 5744155400daf546d17bbe1dd82023d87b02e8ed Mon Sep 17 00:00:00 2001 From: poka Date: Wed, 24 Aug 2022 06:36:26 +0200 Subject: [PATCH] can spawn new block just after transactions --- integration_test/app_test.dart | 54 ++++++++++++++----- .../duniter/data/gecko_tests.json | 20 +++---- integration_test/launch_test.sh | 1 + integration_test/tests_utility.dart | 9 ++-- lib/models/widgets_keys.dart | 5 +- lib/providers/duniter_indexer.dart | 2 +- lib/providers/substrate_sdk.dart | 8 ++- lib/screens/home.dart | 22 ++++---- lib/screens/settings.dart | 6 +++ 9 files changed, 90 insertions(+), 37 deletions(-) diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart index a3f1193..47b178f 100644 --- a/integration_test/app_test.dart +++ b/integration_test/app_test.dart @@ -4,8 +4,10 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/widgets_keys.dart'; +import 'package:gecko/providers/substrate_sdk.dart'; import 'package:integration_test/integration_test.dart'; import 'package:gecko/main.dart' as app; +import 'package:provider/provider.dart'; import 'tests_utility.dart'; void main() { @@ -15,9 +17,9 @@ void main() { testWidgets('Import chests', (tester) async { app.main(); await tester.pumpAndSettle(const Duration(seconds: 1)); - final ipAddress = dotenv.env['ip_address'] ?? '127.0.0.1'; - log.d('ip address: $ipAddress'); + // Change Duniter endpoint to local + await changeNode(tester); // Delete all existing chests await deleteAllWallets(tester); @@ -25,12 +27,33 @@ void main() { // Restore a chest await restoreChest(tester); - // Execute a transaction to ChristCosmic - await payChrist(tester); + // Execute a transaction to test2 + await payTest2(tester); }); }); } +Future changeNode(WidgetTester tester) async { + final ipAddress = dotenv.env['ip_address'] ?? '127.0.0.1'; + log.d('ip address: $ipAddress'); + + await goKey(tester, keyDrawerMenu); + await goKey(tester, keyParameters); + await goKey(tester, keySelectDuniterNodeDropDown, duration: 5); + await goKey(tester, keySelectDuniterNode('Personnalisé'), selectLast: true); + await enterText(tester, keyCustomDuniterEndpoint, 'ws://$ipAddress:9944'); + // await sleep(tester, 10000); + await goKey(tester, keyConnectToEndpoint); + await isIconPresent(tester, Icons.add_card_sharp, + timeout: const Duration(seconds: 8)); + await goBack(tester); + // final BuildContext context = tester.element(find.byKey(keyDrawerMenu)); + // SubstrateSdk sub = Provider.of(context, listen: false); + // await sub.spawnBlock(3); + + // await waitFor(tester, 'Vous êtes bien connecté'); +} + // Customs actions Future deleteAllWallets(WidgetTester tester) async { if (await isPresent(tester, 'Rechercher')) { @@ -46,7 +69,7 @@ Future restoreChest(WidgetTester tester) async { await goKey(tester, keyRestoreChest); Clipboard.setData(const ClipboardData( text: - 'smart joy blossom stomach champion fun diary relief gossip hospital logic bike')); + 'pipe paddle ketchup filter life ice feel embody glide quantum ride usage')); await tester.pumpAndSettle(); await goKey(tester, keyPastMnemonic); await tester.pumpAndSettle(); @@ -64,20 +87,27 @@ Future restoreChest(WidgetTester tester) async { await waitFor(tester, "y'a pas de lézard"); } -Future payChrist(WidgetTester tester) async { +Future payTest2(WidgetTester tester) async { await waitFor(tester, 'Rechercher'); await goKey(tester, keyOpenSearch); - await enterText(tester, keySearchField, 'ChristCosmic'); + await enterText(tester, keySearchField, + '5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb'); await goKey(tester, keyConfirmSearch); - await waitFor(tester, 'XuiQeB'); + await waitFor(tester, 'Hd8Whb'); await goKey(tester, - keyIndexerResult('5CJKhFCpdSpumgWjSZ3TQmejJuHV6iELJrtdrfs38SXuiQeB')); - await waitFor(tester, 'XuiQeB'); + keySearchResult('5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb')); + await waitFor(tester, 'Hd8Whb'); 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 sleep(tester); + final BuildContext context = + tester.element(find.byKey(keyCloseTransactionScreen)); + SubstrateSdk sub = Provider.of(context, listen: false); + await sub.spawnBlock(); + + await waitFor(tester, 'validé !', timeout: const Duration(seconds: 1)); await goKey(tester, keyCloseTransactionScreen); - await waitFor(tester, 'XuiQeB'); + await waitFor(tester, 'Hd8Whb'); } diff --git a/integration_test/duniter/data/gecko_tests.json b/integration_test/duniter/data/gecko_tests.json index f874b5a..6e18849 100644 --- a/integration_test/duniter/data/gecko_tests.json +++ b/integration_test/duniter/data/gecko_tests.json @@ -1,8 +1,8 @@ { - "first_ud": 1000, + "first_ud": 10000, "first_ud_reeval": 100, "genesis_parameters": { - "genesis_certs_expire_on": 10, + "genesis_certs_expire_on": 2102400, "genesis_certs_min_received": 3, "genesis_memberships_expire_on": 1051200, "genesis_smith_certs_expire_on": 2102400, @@ -11,22 +11,22 @@ }, "identities": { "test1": { - "balance": 1000, + "balance": 10000, "certs": ["test2", "test3", "test4"], "pubkey": "5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa" }, "test2": { - "balance": 1000, + "balance": 10000, "certs": ["test1", "test3", "test4"], "pubkey": "5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb" }, "test3": { - "balance": 1000, + "balance": 10000, "certs": ["test1", "test2", "test4"], "pubkey": "5FhTLzXLNBPmtXtDBFECmD7fvKmTtTQDtvBTfVr97tachA1p" }, "test4": { - "balance": 1000, + "balance": 10000, "certs": ["test1", "test2", "test3"], "pubkey": "5DXJ4CusmCg8S1yF6JGVn4fxgk5oFx42WctXqHZ17mykgje5" } @@ -50,10 +50,10 @@ "smith_membership_period": 1000, "smith_pending_membership_period": 500, "smiths_wot_first_cert_issuable_on": 20, - "smiths_wot_min_cert_for_membership": 2, - "wot_first_cert_issuable_on": 20, - "wot_min_cert_for_create_idty_right": 2, - "wot_min_cert_for_membership": 2 + "smiths_wot_min_cert_for_membership": 3, + "wot_first_cert_issuable_on": 0, + "wot_min_cert_for_create_idty_right": 3, + "wot_min_cert_for_membership": 3 }, "smiths": { "test1": { diff --git a/integration_test/launch_test.sh b/integration_test/launch_test.sh index b2f2a51..482dccd 100755 --- a/integration_test/launch_test.sh +++ b/integration_test/launch_test.sh @@ -12,6 +12,7 @@ echo "ip_address=$ip_address" > .env ## Start local Duniter node cd integration_test/duniter +docker-compose down rm -rf data/chains docker-compose up -d cd ../.. diff --git a/integration_test/tests_utility.dart b/integration_test/tests_utility.dart index c6fb221..760801e 100644 --- a/integration_test/tests_utility.dart +++ b/integration_test/tests_utility.dart @@ -3,12 +3,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; +Future sleep(WidgetTester tester, [int time = 1000]) async { + await Future.delayed(Duration(milliseconds: time)); +} + Future goKey(WidgetTester tester, Key buttonKey, - {Finder? customFinder, int duration = 100}) async { + {Finder? customFinder, int duration = 100, bool selectLast = false}) async { await tester.pumpAndSettle(Duration(milliseconds: duration)); final Finder finder = customFinder ?? find.byKey(buttonKey); log.d('INTEGRATION TEST: Tap on ${finder.description}}'); - await tester.tap(finder); + await tester.tap(selectLast ? finder.last : finder); // await tester.pumpAndSettle(Duration(milliseconds: duration)); } @@ -38,7 +42,6 @@ Future waitFor( do { if (DateTime.now().isAfter(end)) { - throw Exception('Timed out waiting for text $text'); } diff --git a/lib/models/widgets_keys.dart b/lib/models/widgets_keys.dart index 31a0db1..d5ca4c3 100644 --- a/lib/models/widgets_keys.dart +++ b/lib/models/widgets_keys.dart @@ -61,6 +61,9 @@ const keyCachePassword = Key('keyCachePassword'); // Settings const keyDeleteAllWallets = Key('keyDeleteAllWallets'); +const keySelectDuniterNodeDropDown = Key('keySelectDuniterNodeDropDown'); +const keyCustomDuniterEndpoint = Key('keyCustomDuniterEndpoint'); +const keyConnectToEndpoint = Key('keyConnectToEndpoint'); // Onboarding const keyPastMnemonic = Key('keyPastMnemonic'); @@ -77,6 +80,6 @@ const keyConfirmSearch = Key('keyConfirmSearch'); // Unit keys Key keyMnemonicWord(String word) => Key('keyMnemonicWord$word'); -Key keyIndexerResult(String keyId) => Key('keyIndexerResult$keyId'); Key keyTransaction(int keyId) => Key('keyTransaction$keyId'); Key keySearchResult(String keyId) => Key('keySearchResult$keyId'); +Key keySelectDuniterNode(String keyId) => Key('keySelectDuniterNode$keyId'); diff --git a/lib/providers/duniter_indexer.dart b/lib/providers/duniter_indexer.dart index e0417b7..8d6123b 100644 --- a/lib/providers/duniter_indexer.dart +++ b/lib/providers/duniter_indexer.dart @@ -301,7 +301,7 @@ class DuniterIndexer with ChangeNotifier { Padding( padding: const EdgeInsets.symmetric(horizontal: 5), child: ListTile( - key: keyIndexerResult(profile['id']), + key: keySearchResult(profile['id']), horizontalTitleGap: 40, contentPadding: const EdgeInsets.all(5), leading: cesiumPlusProvider.defaultAvatar(avatarSize), diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 13a85cf..6f18f69 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -873,7 +873,6 @@ newKeySig: $newKeySig"""); keyring.current.pubKey, ); - log.d(sender.address); TxInfoData txInfo; txInfo = TxInfoData( @@ -940,6 +939,13 @@ newKeySig: $newKeySig"""); await sdk.api.keyring.deleteAccount(keyring, keypair); } + Future spawnBlock([int number = 1]) async { + for (var i = 1; i <= number; i++) { + await sdk.webView! + .evalJavascript('api.rpc.engine.createBlock(true, true)'); + } + } + void reload() { notifyListeners(); } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 071289a..9a800f3 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -40,6 +40,9 @@ class HomeScreen extends StatelessWidget { final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); + // sub.spawnBlock(); + // log.d('message'); + isTall = false; ratio = 1; if (MediaQuery.of(context).size.height >= 930) { @@ -122,17 +125,18 @@ class HomeScreen extends StatelessWidget { myWalletProvider.rebuildWidget(); } - var connectivityResult = - await (Connectivity().checkConnectivity()); + // var connectivityResult = + // await (Connectivity().checkConnectivity()); + + // if (connectivityResult != ConnectivityResult.mobile && + // connectivityResult != ConnectivityResult.wifi) { + // homeProvider.changeMessage( + // "notConnectedToInternet".tr(), 0); + // sub.nodeConnected = false; + // } + HomeProvider homeProvider = Provider.of(ctx, listen: false); - if (connectivityResult != ConnectivityResult.mobile && - connectivityResult != ConnectivityResult.wifi) { - homeProvider.changeMessage( - "notConnectedToInternet".tr(), 0); - sub.nodeConnected = false; - } - Connectivity() .onConnectivityChanged .listen((ConnectivityResult result) async { diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index f219eea..5c9e325 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -116,11 +116,14 @@ class SettingsScreen extends StatelessWidget { Icon(sub.nodeConnected && !sub.isLoadingEndpoint ? Icons.check : Icons.close), + if (sub.nodeConnected && !sub.isLoadingEndpoint) + const Icon(Icons.add_card_sharp, size: 0.01), const Spacer(), SizedBox( width: 265, child: Consumer(builder: (context, set, _) { return DropdownButtonHideUnderline( + key: keySelectDuniterNodeDropDown, child: DropdownButton( // alignment: AlignmentDirectional.topStart, value: selectedDuniterEndpoint, @@ -128,6 +131,7 @@ class SettingsScreen extends StatelessWidget { items: duniterBootstrapNodes .map((NetworkParams endpointParams) { return DropdownMenuItem( + key: keySelectDuniterNode(endpointParams.endpoint!), value: endpointParams.endpoint, child: Text(endpointParams.endpoint!), ); @@ -146,6 +150,7 @@ class SettingsScreen extends StatelessWidget { ? CircularProgressIndicator(color: orangeC) : Consumer(builder: (context, set, _) { return IconButton( + key: keyConnectToEndpoint, icon: Icon( Icons.send, color: selectedDuniterEndpoint != @@ -186,6 +191,7 @@ class SettingsScreen extends StatelessWidget { width: 200, height: 50, child: TextField( + key: keyCustomDuniterEndpoint, controller: endpointController, autocorrect: false, ),