diff --git a/integration_test/duniter/data/gecko_tests.json b/integration_test/duniter/data/gecko_tests.json index 804b3de..252b7f1 100755 --- a/integration_test/duniter/data/gecko_tests.json +++ b/integration_test/duniter/data/gecko_tests.json @@ -2,7 +2,7 @@ "first_ud": 10000, "first_ud_reeval": 50, "genesis_parameters": { - "genesis_certs_expire_on": 500, + "genesis_certs_expire_on": 10, "genesis_certs_min_received": 3, "genesis_memberships_expire_on": 1051200, "genesis_smith_certs_expire_on": 2102400, @@ -54,7 +54,7 @@ "smith_cert_validity_period": 1000, "smith_membership_period": 1000, "smith_pending_membership_period": 500, - "smiths_wot_first_cert_issuable_on": 20, + "smiths_wot_first_cert_issuable_on": 4, "smiths_wot_min_cert_for_membership": 3, "wot_first_cert_issuable_on": 0, "wot_min_cert_for_create_idty_right": 3, diff --git a/integration_test/identity_revocation.dart b/integration_test/identity_revocation.dart deleted file mode 100644 index d66a408..0000000 --- a/integration_test/identity_revocation.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:gecko/models/widgets_keys.dart'; -import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; - -void main() async { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - await dotenv.load(); - - testWidgets('Identity revocation', (testerLoc) async { - tester = testerLoc; - // Connect local node and import test chest in background - await bkFastStart(); - - // Open chest - await firstOpenChest(); - - // Revoke test3 - await spawnBlock(); - await tapKey(keyOpenWallet(test3.address)); - await tapKey(keyManageMembership); - await tapKey(keyRevokeIdty); - await tapKey(keyConfirm); - spawnBlock(duration: 2000); - await waitFor('validé !', timeout: const Duration(seconds: 4)); - await tapKey(keyCloseTransactionScreen, duration: 0); - await waitFor('Membre validé !', reverse: true); - }, timeout: testTimeout()); -} diff --git a/integration_test/launch_test.sh b/integration_test/launch_test.sh index 7f130c0..27be648 100755 --- a/integration_test/launch_test.sh +++ b/integration_test/launch_test.sh @@ -17,7 +17,7 @@ docker compose up -d cd ../.. # Start integration test -flutter test integration_test/$testName.dart && echo '0' > /tmp/geckoTestResult || echo '1' > /tmp/geckoTestResult +flutter test integration_test/scenarios/$testName.dart && echo '0' > /tmp/geckoTestResult || echo '1' > /tmp/geckoTestResult # Reset .env echo "ip_address=127.0.0.1" > .env diff --git a/integration_test/cert_state.dart b/integration_test/scenarios/cert_state.dart similarity index 69% rename from integration_test/cert_state.dart rename to integration_test/scenarios/cert_state.dart index f36dc5c..67ea322 100644 --- a/integration_test/cert_state.dart +++ b/integration_test/scenarios/cert_state.dart @@ -3,8 +3,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); @@ -17,6 +17,7 @@ void main() async { // Open chest await firstOpenChest(); + spawnBlock(until: 15); await goBack(); // Go wallet 5 view @@ -35,21 +36,27 @@ void main() async { await waitFor('25.0 $currencyName'); await spawnBlock(); await waitFor('22.0 $currencyName'); - await bkCertify(fromAddress: test1.address, destAddress: test5.address); - await waitFor('1', exactMatch: true); + await bkCertify( + fromAddress: test1.address, + destAddress: test5.address, + spawnBloc: false); await bkConfirmIdentity(fromAddress: test5.address, name: test5.name); - await bkCertify(fromAddress: test2.address, destAddress: test5.address); - await waitFor('2', exactMatch: true); + await waitFor('1', exactMatch: true); + await bkCertify( + fromAddress: test2.address, + destAddress: test5.address, + spawnBloc: false); + // await waitFor('2', exactMatch: true); await bkCertify(fromAddress: test3.address, destAddress: test5.address); await waitFor('3', exactMatch: true); await bkCertify(fromAddress: test4.address, destAddress: test5.address); await waitFor('4', exactMatch: true); - await bkPay( - fromAddress: test2.address, destAddress: test5.address, amount: 40); - await waitFor('61.99 $currencyName'); - await spawnBlock(until: 10); - await waitFor('161.99 $currencyName'); - await spawnBlock(until: 20); - await waitFor('261.99 $currencyName'); + // await bkPay( + // fromAddress: test2.address, destAddress: test5.address, amount: 40); + await waitFor('21.99 $currencyName'); + await spawnBlock(until: 30); + await waitFor('121.99 $currencyName'); + await spawnBlock(until: 40); + await waitFor('221.99 $currencyName'); }, timeout: testTimeout()); } diff --git a/integration_test/gecko_complete.dart b/integration_test/scenarios/gecko_complete.dart similarity index 95% rename from integration_test/gecko_complete.dart rename to integration_test/scenarios/gecko_complete.dart index bcf1c23..07e5961 100644 --- a/integration_test/gecko_complete.dart +++ b/integration_test/scenarios/gecko_complete.dart @@ -2,8 +2,8 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); @@ -34,6 +34,7 @@ void main() async { } Future payTest2() async { + spawnBlock(until: 13); await waitFor('Rechercher'); await tapKey(keyOpenSearch); final addressToSearch = await clipPaste(); @@ -127,13 +128,13 @@ Future certifyTest5() async { await waitFor('Membre validé !'); // spawn 20 blocs and check if ud is creating - await spawnBlock(until: 10); - await waitFor('109.13'); await spawnBlock(until: 20); + await waitFor('109.13'); + await spawnBlock(until: 30); await waitFor('209.13'); // Check UD reval - await spawnBlock(until: 50); - await waitFor('509.36'); + await spawnBlock(until: 60); + await waitFor('509.57'); humanRead(5); } diff --git a/integration_test/scenarios/identity_revocation.dart b/integration_test/scenarios/identity_revocation.dart new file mode 100644 index 0000000..7925c06 --- /dev/null +++ b/integration_test/scenarios/identity_revocation.dart @@ -0,0 +1,47 @@ +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gecko/models/widgets_keys.dart'; +import 'package:integration_test/integration_test.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; + +void main() async { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + await dotenv.load(); + + testWidgets('Identity revocation', (testerLoc) async { + tester = testerLoc; + // Connect local node and import test chest in background + await bkFastStart(); + + // Open chest + await firstOpenChest(); + await spawnBlock(until: 13); + await sleep(); + + // Create test5 identity + await bkPay( + fromAddress: test1.address, destAddress: test5.address, amount: 30); + sub.reload(); + await bkCertify(fromAddress: test1.address, destAddress: test5.address); + sub.reload(); + await sleep(); + + // Certify test5 to become member + await tapKey(keyOpenWallet(test5.address)); + await bkConfirmIdentity(fromAddress: test5.address, name: test5.name); + await bkCertify(fromAddress: test2.address, destAddress: test5.address); + await bkCertify(fromAddress: test3.address, destAddress: test5.address); + await waitFor('Membre validé !', exactMatch: true); + + // Revoke test5 + await tapKey(keyManageMembership, duration: 1000); + await tapKey(keyRevokeIdty); + await tapKey(keyConfirm); + spawnBlock(duration: 2000); + await waitFor('validé !', timeout: const Duration(seconds: 4)); + await tapKey(keyCloseTransactionScreen, duration: 0); + await waitFor('Aucune identité', exactMatch: true); + await sleep(); + }, timeout: testTimeout()); +} diff --git a/integration_test/migrate_cesium_identity.dart b/integration_test/scenarios/migrate_cesium_identity.dart similarity index 96% rename from integration_test/migrate_cesium_identity.dart rename to integration_test/scenarios/migrate_cesium_identity.dart index e57720f..554c539 100644 --- a/integration_test/migrate_cesium_identity.dart +++ b/integration_test/scenarios/migrate_cesium_identity.dart @@ -4,8 +4,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/integration_test/multi_chests.dart b/integration_test/scenarios/multi_chests.dart similarity index 84% rename from integration_test/multi_chests.dart rename to integration_test/scenarios/multi_chests.dart index a81742e..ff0e77d 100644 --- a/integration_test/multi_chests.dart +++ b/integration_test/scenarios/multi_chests.dart @@ -1,8 +1,8 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/integration_test/ud_creation_state.dart b/integration_test/scenarios/ud_creation_state.dart similarity index 91% rename from integration_test/ud_creation_state.dart rename to integration_test/scenarios/ud_creation_state.dart index 88e9abd..9859feb 100644 --- a/integration_test/ud_creation_state.dart +++ b/integration_test/scenarios/ud_creation_state.dart @@ -3,8 +3,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/integration_test/general_actions.dart b/integration_test/utility/general_actions.dart similarity index 100% rename from integration_test/general_actions.dart rename to integration_test/utility/general_actions.dart diff --git a/integration_test/tests_utility.dart b/integration_test/utility/tests_utility.dart similarity index 97% rename from integration_test/tests_utility.dart rename to integration_test/utility/tests_utility.dart index e8c60b7..5aecdae 100644 --- a/integration_test/tests_utility.dart +++ b/integration_test/utility/tests_utility.dart @@ -190,15 +190,21 @@ Future bkPay( destAddress: destAddress, amount: amount, password: 'AAAAA'); + await sleep(500); await spawnBlock(); await sleep(500); } // Certify in background Future bkCertify( - {required String fromAddress, required String destAddress}) async { + {required String fromAddress, + required String destAddress, + bool spawnBloc = true}) async { sub.certify(fromAddress, destAddress, 'AAAAA'); - await spawnBlock(); + if (spawnBloc) { + await sleep(500); + await spawnBlock(); + } await sleep(500); } @@ -206,6 +212,7 @@ Future bkCertify( Future bkConfirmIdentity( {required String fromAddress, required String name}) async { sub.confirmIdentity(fromAddress, name, 'AAAAA'); + await sleep(500); await spawnBlock(); await sleep(500); } @@ -237,7 +244,7 @@ Future bkRestoreChest([String mnemonic = testMnemonic]) async { name: 'test${number + 1}', derivation: (number + 1) * 2); } - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); } Future _addImportAccount( @@ -273,7 +280,7 @@ Future bkDeleteAllWallets() async { await configBox.delete('defaultWallet'); await sub.deleteAllAccounts(); myWalletProvider.pinCode = ''; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); } } diff --git a/lib/providers/chest_provider.dart b/lib/providers/chest_provider.dart index ce788b9..729ab54 100644 --- a/lib/providers/chest_provider.dart +++ b/lib/providers/chest_provider.dart @@ -10,7 +10,7 @@ import 'package:gecko/providers/substrate_sdk.dart'; import 'package:provider/provider.dart'; class ChestProvider with ChangeNotifier { - void rebuildWidget() { + void reload() { notifyListeners(); } diff --git a/lib/providers/home.dart b/lib/providers/home.dart index fe5102f..9ff8cff 100644 --- a/lib/providers/home.dart +++ b/lib/providers/home.dart @@ -219,7 +219,7 @@ class HomeProvider with ChangeNotifier { ); } - void rebuildWidget() { + void reload() { notifyListeners(); } } diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index fd25eff..b38c122 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -219,7 +219,7 @@ class MyWalletsProvider with ChangeNotifier { if (actualLock == lockPin) pinCode = ''; } - void rebuildWidget() { + void reload() { notifyListeners(); } } diff --git a/lib/providers/search.dart b/lib/providers/search.dart index 5460e7a..a3f53ed 100644 --- a/lib/providers/search.dart +++ b/lib/providers/search.dart @@ -8,7 +8,7 @@ class SearchProvider with ChangeNotifier { final cacheDuring = 20 * 60 * 1000; //First number is minutes int cacheTime = 0; - void rebuildWidget() { + void reload() { notifyListeners(); } diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 13e3b01..b69f847 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -8,6 +8,8 @@ import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/my_wallets.dart'; +import 'package:gecko/providers/wallet_options.dart'; +import 'package:gecko/providers/wallets_profiles.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart'; import 'package:polkawallet_sdk/api/types/networkParams.dart'; import 'package:polkawallet_sdk/api/types/txInfoData.dart'; @@ -46,6 +48,10 @@ class SubstrateSdk with ChangeNotifier { Future _executeCall(TxInfoData txInfo, txOptions, String password, [String? rawParams]) async { + final walletOptions = + Provider.of(homeContext, listen: false); + final walletProfiles = + Provider.of(homeContext, listen: false); try { final hash = await sdk.api.tx.signAndSend(txInfo, txOptions, password, rawParam: rawParams, onStatusChange: (p0) { @@ -62,8 +68,11 @@ class SubstrateSdk with ChangeNotifier { return 'timeout'; } else { + // Success ! transactionStatus = hash.toString(); notifyListeners(); + walletOptions.reload(); + walletProfiles.reload(); return hash.toString(); } } catch (e) { @@ -272,6 +281,9 @@ class SubstrateSdk with ChangeNotifier { } Future idtyStatus(String address) async { + // WalletOptionsProvider walletOptions = + // Provider.of(homeContext, listen: false); + var idtyIndex = await _getIdentityIndexOf(address); if (idtyIndex == 0) { @@ -283,6 +295,10 @@ class SubstrateSdk with ChangeNotifier { if (idtyStatus != null) { final String status = idtyStatus['status']; + // if (address == walletOptions.address.text && status == 'Validated') { + // walletOptions.reloadBuild(); + // } + return (status); } else { return 'expired'; diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 3438bec..817b370 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -427,7 +427,7 @@ class WalletOptionsProvider with ChangeNotifier { return canValidateNameBool; } - void reloadBuild() { + void reload() { notifyListeners(); } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 221e19e..2803626 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -119,7 +119,7 @@ class HomeScreen extends StatelessWidget { await chestBox.clear(); await configBox.delete('defaultWallet'); await sub.deleteAllAccounts(); - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); } // var connectivityResult = diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart index e91676d..1571362 100644 --- a/lib/screens/myWallets/choose_chest.dart +++ b/lib/screens/myWallets/choose_chest.dart @@ -119,7 +119,7 @@ class _ChooseChestState extends State { myWalletProvider.pinCode = ''; WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); await Navigator.push( context, diff --git a/lib/screens/myWallets/choose_wallet.dart b/lib/screens/myWallets/choose_wallet.dart index 50c4eab..bc489e6 100644 --- a/lib/screens/myWallets/choose_wallet.dart +++ b/lib/screens/myWallets/choose_wallet.dart @@ -125,7 +125,7 @@ class ChooseWalletScreen extends StatelessWidget { key: keySelectThisWallet(repository.address!), onTap: () { selectedWallet = repository; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); }, child: ClipOvalShadow( shadow: const Shadow( @@ -202,7 +202,7 @@ class ChooseWalletScreen extends StatelessWidget { ), onTap: () async { selectedWallet = repository; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); }, ) ]), diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 04c23ab..bc8c006 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -244,7 +244,7 @@ class UnlockingWallet extends StatelessWidget { .shake); // Triggering error shake animation pinColor = Colors.red[600]; myWalletProvider.pinCode = myWalletProvider.mnemonic = ''; - walletOptions.reloadBuild(); + walletOptions.reload(); pinFocus.requestFocus(); } else { pinColor = Colors.green[400]; diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index bcbd873..087e523 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -54,7 +54,7 @@ class WalletOptions extends StatelessWidget { onWillPop: () { walletOptions.isEditing = false; walletOptions.isBalanceBlur = false; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); Navigator.pop(context); return Future.value(true); }, @@ -69,7 +69,7 @@ class WalletOptions extends StatelessWidget { onPressed: () { walletOptions.isEditing = false; walletOptions.isBalanceBlur = false; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); Navigator.pop(context); }), title: SizedBox( @@ -245,7 +245,7 @@ class WalletOptions extends StatelessWidget { wallet.imageCustomPath = newPath; walletBox.put(wallet.key, wallet); } - walletProvider.reloadBuild(); + walletProvider.reload(); }, child: wallet.imageCustomPath == null || wallet.imageCustomPath == '' ? Image.asset( @@ -273,7 +273,7 @@ class WalletOptions extends StatelessWidget { child: InkWell( onTap: () async { wallet.imageCustomPath = await (walletProvider.changeAvatar()); - walletProvider.reloadBuild(); + walletProvider.reload(); }, child: Image.asset( 'assets/walletOptions/camera.png', @@ -521,8 +521,8 @@ class WalletOptions extends StatelessWidget { // defaultWallet = wallet; await sub.setCurrentWallet(wallet); myWalletProvider.readAllWallets(currentChest); - myWalletProvider.rebuildWidget(); - walletOptions.reloadBuild(); + myWalletProvider.reload(); + walletOptions.reload(); } Widget deleteWallet(BuildContext context, @@ -556,7 +556,7 @@ class WalletOptions extends StatelessWidget { WidgetsBinding.instance.addPostFrameCallback((_) { myWalletProvider.listWallets = myWalletProvider.readAllWallets(currentChest); - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); }); } : null, diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 4b7b144..6abbf79 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -224,7 +224,7 @@ class OnboardingStepTen extends StatelessWidget { await walletBox.add(myWallet); } myWalletProvider.readAllWallets(currentChest); - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); generateWalletProvider.generatedMnemonic = ''; myWalletProvider.resetPinCode(); @@ -239,7 +239,7 @@ class OnboardingStepTen extends StatelessWidget { .shake); // Triggering error shake animation hasError = true; pinColor = Colors.red[600]; - walletOptions.reloadBuild(); + walletOptions.reload(); } }, onChanged: (value) { diff --git a/lib/screens/search.dart b/lib/screens/search.dart index ece009b..e8f2fd3 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -57,7 +57,7 @@ class SearchScreen extends StatelessWidget { autofocus: true, maxLines: 1, textAlign: TextAlign.left, - onChanged: (v) => searchProvider.rebuildWidget(), + onChanged: (v) => searchProvider.reload(), decoration: InputDecoration( filled: true, fillColor: Colors.white, diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 172bade..e116a12 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -594,7 +594,7 @@ class WalletViewScreen extends StatelessWidget { FilteringTextInputFormatter.allow( RegExp(r'(^\d+\.?\d{0,2})')), ], - // onChanged: (v) => _searchProvider.rebuildWidget(), + // onChanged: (v) => _searchProvider.reload(), decoration: InputDecoration( hintText: '0.00', suffix: Text(currencyName),