From bdc095f7a914f5a9f8bac4796edee47ada39d1a0 Mon Sep 17 00:00:00 2001 From: overtorment Date: Sun, 11 Aug 2024 10:55:56 +0100 Subject: [PATCH 1/4] TST: e2e test for manage contacts & payment codes --- package.json | 2 +- screen/receive/details.js | 6 +- screen/wallets/PaymentCodesList.tsx | 22 +++-- screen/wallets/details.js | 11 ++- tests/e2e/bluewallet2.spec.js | 125 ++++++++++++++++++++++++++++ 5 files changed, 155 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 0ad1a1a4a8..5a3fb01e27 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "test": "npm run tslint && npm run lint && npm run unit && npm run jest", "jest": "jest tests/integration/*", "e2e:debug-build": "detox build -c android.debug", - "e2e:debug-test": "detox test -c android.debug -d 200000 -l info", + "e2e:debug-test": "detox test -c android.debug -d 200000 -l info --reuse", "e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test", "e2e:release-build": "detox build -c android.release", "e2e:release-test": "detox test -c android.release", diff --git a/screen/receive/details.js b/screen/receive/details.js index d53a9d8050..98a497a58e 100644 --- a/screen/receive/details.js +++ b/screen/receive/details.js @@ -405,7 +405,11 @@ const ReceiveDetails = () => { return ( <> - + {wallet?.allowBIP47() && wallet.isBIP47Enabled() && ( { + const renderItem = (pc: string, index: number) => { if (counterpartyMetadata?.[pc]?.hidden) return null; // hidden contact, do not render const color = createHash('sha256').update(pc).digest().toString('hex').substring(0, 6); - const displayName = shortenContactName(counterpartyMetadata?.[pc]?.label ?? pc); + const displayName = shortenContactName(counterpartyMetadata?.[pc]?.label || pc); if (previousRouteName === 'SendDetails') { return ( @@ -204,7 +204,9 @@ export default function PaymentCodesList() { - {displayName} + + {displayName} + @@ -222,7 +224,9 @@ export default function PaymentCodesList() { - {displayName} + + {displayName} + @@ -260,6 +264,7 @@ export default function PaymentCodesList() { if (cl.isAddressValid(newPc)) { // this is not a payment code but a regular onchain address. pretending its a payment code and adding it foundWallet.addBIP47Receiver(newPc); + await saveToDisk(); setReload(Math.random()); return; } @@ -272,6 +277,7 @@ export default function PaymentCodesList() { if (cl.isBip352PaymentCodeValid(newPc)) { // ok its a SilentPayments code, notification tx is not needed, just add it to recipients: foundWallet.addBIP47Receiver(newPc); + await saveToDisk(); setReload(Math.random()); return; } @@ -354,7 +360,11 @@ export default function PaymentCodesList() { Internal error ) : ( - item + index} renderItem={({ item }) => renderItem(item)} /> + item + index} + renderItem={({ item, index }) => renderItem(item, index)} + /> )} diff --git a/screen/wallets/details.js b/screen/wallets/details.js index 9852e7e4f9..2b10c706aa 100644 --- a/screen/wallets/details.js +++ b/screen/wallets/details.js @@ -117,6 +117,7 @@ const WalletDetails = () => { const [useWithHardwareWallet, setUseWithHardwareWallet] = useState(wallet.useWithHardwareWalletEnabled()); const { isAdvancedModeEnabled } = useSettings(); const [isBIP47Enabled, setIsBIP47Enabled] = useState(wallet.isBIP47Enabled()); + const [isContactsVisible, setIsContactsVisible] = useState(wallet.allowBIP47() && wallet.isBIP47Enabled()); const [hideTransactionsInWalletsList, setHideTransactionsInWalletsList] = useState(!wallet.getHideTransactionsInWalletsList()); const { goBack, setOptions, navigate } = useExtendedNavigation(); const { colors } = useTheme(); @@ -135,6 +136,10 @@ const WalletDetails = () => { const onMenuWillShow = () => setIsToolTipMenuVisible(true); const onMenuWillHide = () => setIsToolTipMenuVisible(false); + useEffect(() => { + setIsContactsVisible(isBIP47Enabled); + }, [isBIP47Enabled]); + useEffect(() => { if (isAdvancedModeEnabled && wallet.allowMasterFingerprint()) { InteractionManager.runAfterInteractions(() => { @@ -523,7 +528,7 @@ const WalletDetails = () => { {loc.bip47.payment_code} {loc.bip47.purpose} - + ) : null} @@ -563,9 +568,9 @@ const WalletDetails = () => { {(wallet instanceof AbstractHDElectrumWallet || (wallet.type === WatchOnlyWallet.type && wallet.isHd())) && ( )} - {wallet.allowBIP47() && wallet.isBIP47Enabled() && ( + {isContactsVisible ? ( - )} + ) : null} diff --git a/tests/e2e/bluewallet2.spec.js b/tests/e2e/bluewallet2.spec.js index 87fa17c4fb..fb33a99672 100644 --- a/tests/e2e/bluewallet2.spec.js +++ b/tests/e2e/bluewallet2.spec.js @@ -369,6 +369,131 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1'); }); + it.only('payment code on receive screen', async () => { + const lockFile = '/tmp/travislock.' + hashIt('t_manage_contacts'); + if (process.env.TRAVIS) { + if (require('fs').existsSync(lockFile)) return console.warn('skipping as it previously passed on Travis'); + } + if (!process.env.HD_MNEMONIC_BIP84) { + console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); + return; + } + // if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); + + await device.launchApp({ newInstance: true }); + + // go inside the wallet + await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap(); + await element(by.id('WalletDetails')).tap(); + + // switch on BIP47 slider if its not switched + try { + await expect(element(by.id('BIP47Switch'))).toHaveToggleValue(true); + } catch (_) { + await element(by.id('BIP47Switch')).tap(); + await expect(element(by.text('Contacts'))).toBeVisible(); + } + + await element(by.text('Save')).tap(); + await element(by.text('OK')).tap(); + + // go to receive screen and check that payment code is there + + await element(by.id('ReceiveButton')).tap(); + + try { + await element(by.text('ASK ME LATER.')).tap(); + } catch (_) {} + + await element(by.text('Payment Code')).tap(); + await element(by.id('ReceiveDetailsScrollView')).swipe('up', 'fast', 1); // in case emu screen is small and it doesnt fit + + await expect( + element( + by.text('PM8TJbcHbQFgBL5mAYUCxJEhsz8F66abWAnVqiq6Pa8Rav8qG6XjaJQmSzNqgc1k63ipiEnobNpAoxNJVzRkdoUEANj9KyBEjLt4hL99RMoa8iJXwwwM'), + ), + ).toBeVisible(); + + // now, testing contacts list + await device.pressBack(); + await device.pressBack(); + await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap(); + await element(by.id('WalletDetails')).tap(); + await element(by.id('WalletDetailsScroll')).swipe('up', 'fast', 1); // in case emu screen is small and it doesnt fit + await element(by.text('Contacts')).tap(); + + await expect(element(by.text('Add Contact'))).toBeVisible(); + await expect(element(by.id('ContactListItem0'))).not.toBeVisible(); + await element(by.text('Add Contact')).tap(); + await element(by.type('android.widget.EditText')).replaceText('13HaCAB4jf7FYSZexJxoczyDDnutzZigjS'); + await sleep(1000); + await element(by.text('OK')).tap(); + await element(by.text('Add Contact')).tap(); + await element(by.type('android.widget.EditText')).replaceText( + 'sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv', + ); + await element(by.text('OK')).tap(); + + await expect(element(by.id('ContactListItem0'))).toBeVisible(); + await expect(element(by.id('ContactListItem1'))).toBeVisible(); + + await element(by.text('Add Contact')).tap(); + await element(by.type('android.widget.EditText')).replaceText( + 'PM8TJS2JxQ5ztXUpBBRnpTbcUXbUHy2T1abfrb3KkAAtMEGNbey4oumH7Hc578WgQJhPjBxteQ5GHHToTYHE3A1w6p7tU6KSoFmWBVbFGjKPisZDbP97', + ); + await element(by.text('OK')).tap(); + + await sup('On-chain transaction needed'); + await element(by.text('Cancel')).tap(); + // await sleep(15000); + + // testing renaming contact: + await element(by.id('ContactListItem0')).tap(); + await element(by.text('Rename contact')).tap(); + await element(by.type('android.widget.EditText')).replaceText('c0ntact'); + await element(by.text('OK')).tap(); + await expect(element(by.text('c0ntact'))).toBeVisible(); + + // now, doing a real transaction with our contacts + + await device.pressBack(); + await device.pressBack(); + await device.pressBack(); + await element(by.text('Imported HD SegWit (BIP84 Bech32 Native)')).tap(); + await element(by.id('SendButton')).tap(); + await element(by.id('advancedOptionsMenuButton')).tap(); + await element(by.text('Insert Contact')).tap(); + await element(by.id('ContactListItem0')).tap(); + await element(by.id('BitcoinAmountInput')).typeText('0.0001\n'); + + await element(by.id('advancedOptionsMenuButton')).tap(); + await element(by.text('Add Recipient')).tap(); + await element(by.id('advancedOptionsMenuButton')).tap(); + await element(by.text('Insert Contact')).tap(); + await element(by.id('ContactListItem1')).tap(); + await element(by.id('BitcoinAmountInput')).atIndex(1).typeText('0.0002\n'); + await sleep(1000); + // setting fee rate: + await element(by.id('chooseFee')).tap(); + await element(by.id('feeCustom')).tap(); + await element(by.type('android.widget.EditText')).typeText('1\n'); + await element(by.text('OK')).tap(); + await sleep(1000); + + await element(by.id('CreateTransactionButton')).tap(); + await element(by.id('TransactionDetailsButton')).tap(); + + const txhex1 = await extractTextFromElementById('TxhexInput'); + const tx1 = bitcoin.Transaction.fromHex(txhex1); + assert.strictEqual(tx1.outs.length, 3); + assert.strictEqual(tx1.outs[0].script.toString('hex'), '76a91419129d53e6319baf19dba059bead166df90ab8f588ac'); + assert.strictEqual(tx1.outs[0].value, 10000); + assert.strictEqual(tx1.outs[1].script.toString('hex'), '5120b81959cd9a4954cd525916cd636b4ffe9466600412ccd162653a0f464489f1a8'); + assert.strictEqual(tx1.outs[1].value, 20000); + + process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1'); + }); + it('can do basic wallet-details operations', async () => { const lockFile = '/tmp/travislock.' + hashIt('t_walletdetails'); if (process.env.TRAVIS) { From 0f2f6003d1fe5086763f65652315eb2a282dcfb0 Mon Sep 17 00:00:00 2001 From: overtorment Date: Sun, 11 Aug 2024 11:37:30 +0100 Subject: [PATCH 2/4] TST: e2e test for manage contacts & payment codes --- tests/e2e/bluewallet.spec.js | 2 +- tests/e2e/bluewallet2.spec.js | 31 +++++++++++++++---------------- tests/e2e/helperz.js | 9 +++++++++ 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/tests/e2e/bluewallet.spec.js b/tests/e2e/bluewallet.spec.js index 414146ad41..e29fafe039 100644 --- a/tests/e2e/bluewallet.spec.js +++ b/tests/e2e/bluewallet.spec.js @@ -583,7 +583,7 @@ describe('BlueWallet UI Tests - no wallets', () => { const feeRate = 3; await element(by.id('chooseFee')).tap(); await element(by.id('feeCustom')).tap(); - await element(by.type('android.widget.EditText')).typeText(feeRate + ''); + await element(by.type('android.widget.EditText')).typeText(feeRate + '\n'); await element(by.text('OK')).tap(); if (process.env.TRAVIS) await sleep(5000); diff --git a/tests/e2e/bluewallet2.spec.js b/tests/e2e/bluewallet2.spec.js index fb33a99672..ffd441e948 100644 --- a/tests/e2e/bluewallet2.spec.js +++ b/tests/e2e/bluewallet2.spec.js @@ -1,7 +1,7 @@ import assert from 'assert'; import * as bitcoin from 'bitcoinjs-lib'; -import { extractTextFromElementById, hashIt, helperImportWallet, sleep, sup, yo } from './helperz'; +import { extractTextFromElementById, getSwitchValue, hashIt, helperImportWallet, sleep, sup, yo } from './helperz'; let importedSuccessfully = false; @@ -52,7 +52,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { const feeRate = 2; await element(by.id('chooseFee')).tap(); await element(by.id('feeCustom')).tap(); - await element(by.type('android.widget.EditText')).typeText(feeRate + ''); + await element(by.type('android.widget.EditText')).typeText(feeRate + '\n'); await element(by.text('OK')).tap(); if (process.env.TRAVIS) await sleep(5000); @@ -203,7 +203,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { const feeRate = 2; await element(by.id('chooseFee')).tap(); await element(by.id('feeCustom')).tap(); - await element(by.type('android.widget.EditText')).replaceText(feeRate + ''); + await element(by.type('android.widget.EditText')).replaceText(feeRate + '\n'); await element(by.text('OK')).tap(); // lest add another two outputs @@ -275,7 +275,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { const feeRate = 2; await element(by.id('chooseFee')).tap(); await element(by.id('feeCustom')).tap(); - await element(by.type('android.widget.EditText')).typeText(feeRate + ''); + await element(by.type('android.widget.EditText')).typeText(feeRate + '\n'); await element(by.text('OK')).tap(); // first send MAX output @@ -369,7 +369,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { process.env.TRAVIS && require('fs').writeFileSync(lockFile, '1'); }); - it.only('payment code on receive screen', async () => { + it('payment codes & manage contacts', async () => { const lockFile = '/tmp/travislock.' + hashIt('t_manage_contacts'); if (process.env.TRAVIS) { if (require('fs').existsSync(lockFile)) return console.warn('skipping as it previously passed on Travis'); @@ -378,7 +378,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - // if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); + if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); @@ -387,16 +387,16 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { await element(by.id('WalletDetails')).tap(); // switch on BIP47 slider if its not switched - try { - await expect(element(by.id('BIP47Switch'))).toHaveToggleValue(true); - } catch (_) { + if (!(await getSwitchValue('BIP47Switch'))) { + await expect(element(by.text('Contacts'))).not.toBeVisible(); await element(by.id('BIP47Switch')).tap(); await expect(element(by.text('Contacts'))).toBeVisible(); + await element(by.text('Save')).tap(); // automatically goes back 1 screen + await element(by.text('OK')).tap(); + } else { + await device.pressBack(); } - await element(by.text('Save')).tap(); - await element(by.text('OK')).tap(); - // go to receive screen and check that payment code is there await element(by.id('ReceiveButton')).tap(); @@ -445,7 +445,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { await sup('On-chain transaction needed'); await element(by.text('Cancel')).tap(); - // await sleep(15000); // testing renaming contact: await element(by.id('ContactListItem0')).tap(); @@ -567,7 +566,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { const feeRate = 2; await element(by.id('chooseFee')).tap(); await element(by.id('feeCustom')).tap(); - await element(by.type('android.widget.EditText')).typeText(feeRate + ''); + await element(by.type('android.widget.EditText')).typeText(feeRate + '\n'); await element(by.text('OK')).tap(); if (process.env.TRAVIS) await sleep(5000); @@ -640,7 +639,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { // setting fee rate: await element(by.id('chooseFee')).tap(); await element(by.id('feeCustom')).tap(); - await element(by.type('android.widget.EditText')).typeText('1'); + await element(by.type('android.widget.EditText')).typeText('1\n'); await element(by.text('OK')).tap(); if (process.env.TRAVIS) await sleep(5000); await element(by.id('CreateTransactionButton')).tap(); @@ -669,7 +668,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { // setting fee rate: await element(by.id('chooseFee')).tap(); await element(by.id('feeCustom')).tap(); - await element(by.type('android.widget.EditText')).typeText('1'); + await element(by.type('android.widget.EditText')).typeText('1\n'); await element(by.text('OK')).tap(); if (process.env.TRAVIS) await sleep(5000); await element(by.id('CreateTransactionButton')).tap(); diff --git a/tests/e2e/helperz.js b/tests/e2e/helperz.js index bf63a8b277..58e811a168 100644 --- a/tests/e2e/helperz.js +++ b/tests/e2e/helperz.js @@ -12,6 +12,15 @@ export function sup(text, timeout = 33000) { .withTimeout(timeout); } +export async function getSwitchValue(switchId) { + try { + await expect(element(by.id(switchId))).toHaveToggleValue(true); + return true; + } catch (_) { + return false; + } +} + export async function helperImportWallet(importText, walletType, expectedWalletLabel, expectedBalance, passphrase) { await yo('WalletsList'); From ba6bcab616762cb16b9c40b85b38cabe1a679dd5 Mon Sep 17 00:00:00 2001 From: overtorment Date: Sun, 11 Aug 2024 21:02:59 +0100 Subject: [PATCH 3/4] TST: e2e test for manage contacts & payment codes --- package.json | 4 ++-- tests/e2e/bluewallet2.spec.js | 11 +---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 5a3fb01e27..3c8a5c09f0 100644 --- a/package.json +++ b/package.json @@ -63,10 +63,10 @@ "test": "npm run tslint && npm run lint && npm run unit && npm run jest", "jest": "jest tests/integration/*", "e2e:debug-build": "detox build -c android.debug", - "e2e:debug-test": "detox test -c android.debug -d 200000 -l info --reuse", + "e2e:debug-test": "detox test -c android.debug -d 200000 --loglevel error --reuse", "e2e:debug": "(test -f android/app/build/outputs/apk/debug/app-debug.apk && test -f android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk) || npm run e2e:debug-build; npm run e2e:debug-test", "e2e:release-build": "detox build -c android.release", - "e2e:release-test": "detox test -c android.release", + "e2e:release-test": "detox test -c android.release --loglevel error", "tslint": "tsc", "lint": " npm run tslint && node scripts/find-unused-loc.js && eslint --ext .js,.ts,.tsx '*.@(js|ts|tsx)' screen 'blue_modules/*.@(js|ts|tsx)' class models loc tests components navigation typings", "lint:fix": "npm run lint -- --fix", diff --git a/tests/e2e/bluewallet2.spec.js b/tests/e2e/bluewallet2.spec.js index ffd441e948..0eb92cf81a 100644 --- a/tests/e2e/bluewallet2.spec.js +++ b/tests/e2e/bluewallet2.spec.js @@ -21,7 +21,6 @@ beforeAll(async () => { console.log('before all - importing bip48...'); await helperImportWallet(process.env.HD_MNEMONIC_BIP84, 'HDsegwitBech32', 'Imported HD SegWit (BIP84 Bech32 Native)', '0.00105526'); console.log('...imported!'); - importedSuccessfully = true; await device.pressBack(); await sleep(15000); }, 1200_000); @@ -36,7 +35,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); @@ -187,7 +185,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); @@ -203,7 +200,7 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { const feeRate = 2; await element(by.id('chooseFee')).tap(); await element(by.id('feeCustom')).tap(); - await element(by.type('android.widget.EditText')).replaceText(feeRate + '\n'); + await element(by.type('android.widget.EditText')).typeText(feeRate + '\n'); await element(by.text('OK')).tap(); // lest add another two outputs @@ -262,7 +259,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); @@ -333,7 +329,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); @@ -378,7 +373,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); @@ -502,7 +496,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); @@ -553,7 +546,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); @@ -591,7 +583,6 @@ describe('BlueWallet UI Tests - import BIP84 wallet', () => { console.error('process.env.HD_MNEMONIC_BIP84 not set, skipped'); return; } - if (!importedSuccessfully) throw new Error('BIP84 was not imported during the setup'); await device.launchApp({ newInstance: true }); // go inside the wallet From 4650717222abf7422faf0299e001458387a0053e Mon Sep 17 00:00:00 2001 From: overtorment Date: Sun, 11 Aug 2024 21:16:45 +0100 Subject: [PATCH 4/4] TST: e2e test for manage contacts & payment codes --- tests/e2e/bluewallet2.spec.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/e2e/bluewallet2.spec.js b/tests/e2e/bluewallet2.spec.js index 0eb92cf81a..662fb2d178 100644 --- a/tests/e2e/bluewallet2.spec.js +++ b/tests/e2e/bluewallet2.spec.js @@ -3,8 +3,6 @@ import * as bitcoin from 'bitcoinjs-lib'; import { extractTextFromElementById, getSwitchValue, hashIt, helperImportWallet, sleep, sup, yo } from './helperz'; -let importedSuccessfully = false; - /** * in this suite each test requires that there is one specific wallet present, thus, we import it * before anything else.