Skip to content

Commit

Permalink
test: Attempting automation for testing (#1734)
Browse files Browse the repository at this point in the history
* feat: Integration tests setup and tests for Disclaimer, Welcome and Setup Pin Code pages

* feat: Integration test flow from start to restoring a wallet successfully done

* test: Dashboard view test and linking to flow

* feat: Testing the Exchange flow section, selecting sending and receiving currencies

* test: Successfully create an exchange section

* feat: Implement flow up to sending section

* test: Complete Exchange flow

* fix dependency issue

* test: Final cleanups

* feat: Add CI to run automated integration tests withan android emulator

* feat: Adjust Automated integration test CI to run on ubuntu 20.04-a

* fix: Move integration test CI into PR test build CI

* ci: Add automated test ci which is a streamlined replica of pr test build ci

* ci: Re-add step to access branch name

* ci: Add KVM

* ci: Add filepath to trigger the test run from

* ci: Add required key

* ci: Add required key

* ci: Add missing secret key

* ci: Add missing secret key

* ci: Add nano secrets to workflow

* ci: Switch step to free space on runner

* ci: Remove timeout from workflow

* ci: Confirm impact that removing copy_monero_deps would have on entire workflow time

* ci: Update CI and temporarily remove cache related to emulator

* ci: Remove dynamic java version

* ci: Temporarily switch CI

* ci: Switch to 11.x jdk

* ci: Temporarily switch CI

* ci: Revert ubuntu version

* ci: Add more api levels

* ci: Add more target options

* ci: Settled on stable emulator matrix options

* ci: Add more target options

* ci: Modify flow

* ci: Streamline api levels to 28 and 29

* ci: One more trial

* ci: Switch to flutter drive

* ci: Reduce options

* ci: Remove haven from test

* ci: Check for solana in list

* ci: Adjust amounts and currencies for exchange flow

* ci: Set write response on failure to true

* ci: Split ci to funds and non funds related tests

* test: Test for Send flow scenario and minor restructuring for test folders and files

* chore: cleanup

* ci: Pause CI for now

* ci: Pause CI for now

* ci: Pause CI for now

* test: Restore wallets integration automated tests

* Fix: Add keys back to currency amount textfield widget

* fix: Switch variable name

* fix: remove automation for now

* tests: Automated tests for Create wallets flow

* tests: Further optimize common flows

* tests: Add missing await for call

* tests: Confirm Seeds Display Properly WIP

* tests: Confirm Seeds Display Correctly Automated Tests

* fix: Add missing pubspec params for bitcoin and bitcoin_cash

* feat: Automated Tests for Transaction History Flow

* fix: Add missing pubspec parameter

* feat: Automated Integration Tests for Transaction History flow

* test: Updating send page robot and also syncing branch with main

* test: Modifying tests to flow with wallet grouping implementation

* fix: Issue with transaction history test

* fix: Modifications to the PR and add automated confirmation for checking that all wallet types are restored or created correctly

* test: Attempting automation for testing

* test: Attempting automation for testing

* test: Print out working directory

* test: See if I can cut down time by removing the build step

* test: More logs

* test: Pubspec was not generated, checking if this fixes it

* test: Pubspec was not generated, checking if this fixes it

* test: Pubspec was not generated, checking if this fixes it

* test: Pubspec was not generated, checking if this fixes it

* test: Pubspec was not generated, checking if this fixes it

* test: Pubspec was not generated, checking if this fixes it

* test: Another trial

* test: Another trial

* test: Another trial

* test: Another trial

* test: Another trial

* test: Another trial

* fix: Adjust config file

* test: Add commands to generate files and set codebase up as new

* test: try another route

* test: try another route - 2

* test: try another route

* test: try another route - 2

* test: Uncomment KVM and optimizations-a

* test: Try with sudo permissions-a

* test: Try again

* test: Pause build and rename steps, see how faster it resolves

* test: Try using working directory

* test: Check details of current working directory

* test: Switch test run command from flutter drive to flutter test

* test: Adding secrets to CI workflow

* fix: add working directory to emulator and reactivate build step

* test: Add verbosity

* test: Check tat emulator is present and ready to connect

* test: Try a direct test to see if it'll trigger properly

* test: Try the flutter drive command

* test: Try uninstalling before running

* test: Create an aggregator test file as the entry point for all tests

* test: Try without awaiting each test

* test: Another trial at getting combined tests running

* test: Use a test runner script that'll be responsible for running all available integration tests

* test: Add command to make integration test runner file an executable

* test: Fix failing exchange flow test

* test: fix failing exchange flow test

* test: Fix issue with send flow test

* test: Fix issue with confirm seeds flow test

* test: Modify create and restore flows to reflect modified onboarding flow

* chore: Remove package declaration in AndroidManifestBase file to fix issue of it being deprecated

* test: Bump up flutter version

* fix: Add meld keys

* chore: Remove package name declarations from AndroidManifests

* better write close function definition
comment integration tests workflow for now

---------

Co-authored-by: OmarHatem <[email protected]>
  • Loading branch information
Blazebrain and OmarHatem28 authored Dec 13, 2024
1 parent e21cf71 commit 3ad0422
Show file tree
Hide file tree
Showing 22 changed files with 446 additions and 38 deletions.
298 changes: 298 additions & 0 deletions .github/workflows/automated_integration_test.yml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .github/workflows/pr_test_build_android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ jobs:
echo "const tronGridApiKey = '${{ secrets.TRON_GRID_API_KEY }}';" >> cw_tron/lib/.secrets.g.dart
echo "const tronNowNodesApiKey = '${{ secrets.TRON_NOW_NODES_API_KEY }}';" >> cw_tron/lib/.secrets.g.dart
echo "const meldTestApiKey = '${{ secrets.MELD_TEST_API_KEY }}';" >> lib/.secrets.g.dart
echo "const meldTestPublicKey = '${{ secrets.MELD_TEST_PUBLIC_KEY}}';" >> lib/.secrets.g.dar
echo "const meldTestPublicKey = '${{ secrets.MELD_TEST_PUBLIC_KEY}}';" >> lib/.secrets.g.dart
echo "const letsExchangeBearerToken = '${{ secrets.LETS_EXCHANGE_TOKEN }}';" >> lib/.secrets.g.dart
echo "const letsExchangeAffiliateId = '${{ secrets.LETS_EXCHANGE_AFFILIATE_ID }}';" >> lib/.secrets.g.dart
echo "const stealthExBearerToken = '${{ secrets.STEALTH_EX_BEARER_TOKEN }}';" >> lib/.secrets.g.dart
Expand Down
2 changes: 1 addition & 1 deletion cw_bitcoin/lib/electrum_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1346,7 +1346,7 @@ abstract class ElectrumWalletBase
}

@override
Future<void> close({required bool shouldCleanup}) async {
Future<void> close({bool shouldCleanup = false}) async {
try {
await _receiveStream?.cancel();
await electrumClient.close();
Expand Down
2 changes: 1 addition & 1 deletion cw_bitcoin/lib/litecoin_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1191,7 +1191,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
}

@override
Future<void> close({required bool shouldCleanup}) async {
Future<void> close({bool shouldCleanup = false}) async {
_utxoStream?.cancel();
_feeRatesTimer?.cancel();
_syncTimer?.cancel();
Expand Down
2 changes: 1 addition & 1 deletion cw_core/lib/wallet_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ abstract class WalletBase<BalanceType extends Balance, HistoryType extends Trans

Future<void> rescan({required int height});

Future<void> close({required bool shouldCleanup});
Future<void> close({bool shouldCleanup = false});

Future<void> changePassword(String password);

Expand Down
2 changes: 1 addition & 1 deletion cw_evm/lib/evm_chain_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ abstract class EVMChainWalletBase
}

@override
Future<void> close({required bool shouldCleanup}) async {
Future<void> close({bool shouldCleanup = false}) async {
_client.stop();
_transactionsUpdateTimer?.cancel();
_updateFeesTimer?.cancel();
Expand Down
2 changes: 1 addition & 1 deletion cw_haven/lib/haven_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ abstract class HavenWalletBase
Future<void>? updateBalance() => null;

@override
Future<void> close({required bool shouldCleanup}) async {
Future<void> close({bool shouldCleanup = false}) async {
_listener?.stop();
_onAccountChangeReaction?.reaction.dispose();
_autoSaveTimer?.cancel();
Expand Down
2 changes: 1 addition & 1 deletion cw_monero/lib/monero_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
Future<void>? updateBalance() => null;

@override
Future<void> close({required bool shouldCleanup}) async {
Future<void> close({bool shouldCleanup = false}) async {
_listener?.stop();
_onAccountChangeReaction?.reaction.dispose();
_onTxHistoryChangeReaction?.reaction.dispose();
Expand Down
2 changes: 1 addition & 1 deletion cw_nano/lib/nano_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ abstract class NanoWalletBase
Future<void> changePassword(String password) => throw UnimplementedError("changePassword");

@override
Future<void> close({required bool shouldCleanup}) async {
Future<void> close({bool shouldCleanup = false}) async {
_client.stop();
_receiveTimer?.cancel();
}
Expand Down
2 changes: 1 addition & 1 deletion cw_solana/lib/solana_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ abstract class SolanaWalletBase
Future<void> changePassword(String password) => throw UnimplementedError("changePassword");

@override
Future<void> close({required bool shouldCleanup}) async {
Future<void> close({bool shouldCleanup = false}) async {
_client.stop();
_transactionsUpdateTimer?.cancel();
}
Expand Down
2 changes: 1 addition & 1 deletion cw_tron/lib/tron_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ abstract class TronWalletBase
Future<void> changePassword(String password) => throw UnimplementedError("changePassword");

@override
Future<void> close({required bool shouldCleanup}) async => _transactionsUpdateTimer?.cancel();
Future<void> close({bool shouldCleanup = false}) async => _transactionsUpdateTimer?.cancel();

@action
@override
Expand Down
2 changes: 1 addition & 1 deletion cw_wownero/lib/wownero_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ abstract class WowneroWalletBase
Future<void>? updateBalance() => null;

@override
Future<void> close({required bool shouldCleanup}) async {
Future<void> close({bool shouldCleanup = false}) async {
_listener?.stop();
_onAccountChangeReaction?.reaction.dispose();
_onTxHistoryChangeReaction?.reaction.dispose();
Expand Down
6 changes: 3 additions & 3 deletions integration_test/components/common_test_constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import 'package:cw_core/wallet_type.dart';
class CommonTestConstants {
static final pin = [0, 8, 0, 1];
static final String sendTestAmount = '0.00008';
static final String exchangeTestAmount = '8';
static final String exchangeTestAmount = '0.01';
static final WalletType testWalletType = WalletType.solana;
static final String testWalletName = 'Integrated Testing Wallet';
static final CryptoCurrency testReceiveCurrency = CryptoCurrency.sol;
static final CryptoCurrency testDepositCurrency = CryptoCurrency.usdtSol;
static final CryptoCurrency testReceiveCurrency = CryptoCurrency.usdtSol;
static final CryptoCurrency testDepositCurrency = CryptoCurrency.sol;
static final String testWalletAddress = '5v9gTW1yWPffhnbNKuvtL2frevAf4HpBMw8oYnfqUjhm';
}
13 changes: 10 additions & 3 deletions integration_test/components/common_test_flows.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:flutter_test/flutter_test.dart';

import 'package:cake_wallet/main.dart' as app;

import '../robots/create_pin_welcome_page_robot.dart';
import '../robots/dashboard_page_robot.dart';
import '../robots/disclaimer_page_robot.dart';
import '../robots/new_wallet_page_robot.dart';
Expand Down Expand Up @@ -37,6 +38,7 @@ class CommonTestFlows {
_walletListPageRobot = WalletListPageRobot(_tester),
_newWalletTypePageRobot = NewWalletTypePageRobot(_tester),
_restoreOptionsPageRobot = RestoreOptionsPageRobot(_tester),
_createPinWelcomePageRobot = CreatePinWelcomePageRobot(_tester),
_restoreFromSeedOrKeysPageRobot = RestoreFromSeedOrKeysPageRobot(_tester),
_walletGroupDescriptionPageRobot = WalletGroupDescriptionPageRobot(_tester);

Expand All @@ -53,6 +55,7 @@ class CommonTestFlows {
final WalletListPageRobot _walletListPageRobot;
final NewWalletTypePageRobot _newWalletTypePageRobot;
final RestoreOptionsPageRobot _restoreOptionsPageRobot;
final CreatePinWelcomePageRobot _createPinWelcomePageRobot;
final RestoreFromSeedOrKeysPageRobot _restoreFromSeedOrKeysPageRobot;
final WalletGroupDescriptionPageRobot _walletGroupDescriptionPageRobot;

Expand Down Expand Up @@ -190,23 +193,27 @@ class CommonTestFlows {
WalletType walletTypeToCreate,
List<int> pin,
) async {
await _welcomePageRobot.navigateToCreateNewWalletPage();
await _createPinWelcomePageRobot.tapSetAPinButton();

await setupPinCodeForWallet(pin);

await _welcomePageRobot.navigateToCreateNewWalletPage();

await _selectWalletTypeForWallet(walletTypeToCreate);
}

Future<void> _welcomeToRestoreFromSeedsOrKeysPath(
WalletType walletTypeToRestore,
List<int> pin,
) async {
await _createPinWelcomePageRobot.tapSetAPinButton();

await setupPinCodeForWallet(pin);

await _welcomePageRobot.navigateToRestoreWalletPage();

await _restoreOptionsPageRobot.navigateToRestoreFromSeedsOrKeysPage();

await setupPinCodeForWallet(pin);

await _selectWalletTypeForWallet(walletTypeToRestore);
}

Expand Down
53 changes: 53 additions & 0 deletions integration_test/robots/create_pin_welcome_page_robot.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/screens/welcome/create_pin_welcome_page.dart';
import 'package:cake_wallet/wallet_type_utils.dart';
import 'package:flutter_test/flutter_test.dart';

import '../components/common_test_cases.dart';

class CreatePinWelcomePageRobot {
CreatePinWelcomePageRobot(this.tester) : commonTestCases = CommonTestCases(tester);

final WidgetTester tester;
late CommonTestCases commonTestCases;

Future<void> isCreatePinWelcomePage() async {
await commonTestCases.isSpecificPage<CreatePinWelcomePage>();
}

void hasTitle() {
String title;
if (isMoneroOnly) {
title = S.current.monero_com;
}

if (isHaven) {
title = S.current.haven_app;
}

title = S.current.cake_wallet;

commonTestCases.hasText(title);
}

void hasDescription() {
String description;
if (isMoneroOnly) {
description = S.current.monero_com_wallet_text;
}

if (isHaven) {
description = S.current.haven_app_wallet_text;
}

description = S.current.new_first_wallet_text;

commonTestCases.hasText(description);
}

Future<void> tapSetAPinButton() async {
await commonTestCases.tapItemByKey('create_pin_welcome_page_create_a_pin_button_key');

await commonTestCases.defaultSleepTime();
}
}
14 changes: 5 additions & 9 deletions integration_test/robots/exchange_page_robot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,8 @@ class ExchangePageRobot {
return;
}

await commonTestCases.dragUntilVisible(
'picker_items_index_${depositCurrency.name}_button_key',
'picker_scrollbar_key',
);
await commonTestCases.enterText(depositCurrency.name, 'search_bar_widget_key');

await commonTestCases.defaultSleepTime();

await commonTestCases.tapItemByKey('picker_items_index_${depositCurrency.name}_button_key');
Expand All @@ -149,10 +147,8 @@ class ExchangePageRobot {
return;
}

await commonTestCases.dragUntilVisible(
'picker_items_index_${receiveCurrency.name}_button_key',
'picker_scrollbar_key',
);
await commonTestCases.enterText(receiveCurrency.name, 'search_bar_widget_key');

await commonTestCases.defaultSleepTime();

await commonTestCases.tapItemByKey('picker_items_index_${receiveCurrency.name}_button_key');
Expand Down Expand Up @@ -318,7 +314,7 @@ class ExchangePageRobot {

Future<void> handleErrors(String initialAmount) async {
await tester.pumpAndSettle();

await _handleMinLimitError(initialAmount);

await _handleMaxLimitError(initialAmount);
Expand Down
11 changes: 5 additions & 6 deletions integration_test/robots/send_page_robot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,11 @@ class SendPageRobot {
return;
}

await commonTestCases.dragUntilVisible(
'picker_items_index_${receiveCurrency.name}_button_key',
'picker_scrollbar_key',
);
await commonTestCases.enterText(receiveCurrency.title, 'search_bar_widget_key');

await commonTestCases.defaultSleepTime();

await commonTestCases.tapItemByKey('picker_items_index_${receiveCurrency.name}_button_key');
await commonTestCases.tapItemByKey('picker_items_index_${receiveCurrency.fullName}_button_key');
}

Future<void> enterReceiveAddress(String receiveAddress) async {
Expand Down Expand Up @@ -210,6 +208,7 @@ class SendPageRobot {
_handleAuthPage();
}
}
await tester.pump();
}

Future<void> handleSendResult() async {
Expand Down Expand Up @@ -366,4 +365,4 @@ class SendPageRobot {
Future<void> _onIgnoreButtonOnSentDialogPressed() async {
await commonTestCases.tapItemByKey('send_page_sent_dialog_ignore_button_key');
}
}
}
18 changes: 13 additions & 5 deletions integration_test/robots/wallet_keys_robot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ class WalletKeysAndSeedPageRobot {
bool hasPrivateKey = appStore.wallet!.privateKey != null;

if (walletType == WalletType.monero) {
final moneroWallet = appStore.wallet as MoneroWallet;
final moneroWallet = appStore.wallet as MoneroWalletBase;
final lang = PolyseedLang.getByPhrase(moneroWallet.seed);
final legacySeed = moneroWallet.seedLegacy(lang.nameEnglish);

_confirmMoneroWalletCredentials(
await _confirmMoneroWalletCredentials(
appStore,
walletName,
moneroWallet.seed,
Expand All @@ -59,7 +59,7 @@ class WalletKeysAndSeedPageRobot {
final lang = PolyseedLang.getByPhrase(wowneroWallet.seed);
final legacySeed = wowneroWallet.seedLegacy(lang.nameEnglish);

_confirmMoneroWalletCredentials(
await _confirmMoneroWalletCredentials(
appStore,
walletName,
wowneroWallet.seed,
Expand Down Expand Up @@ -105,12 +105,12 @@ class WalletKeysAndSeedPageRobot {
await commonTestCases.defaultSleepTime(seconds: 5);
}

void _confirmMoneroWalletCredentials(
Future<void> _confirmMoneroWalletCredentials(
AppStore appStore,
String walletName,
String seed,
String legacySeed,
) {
) async {
final keys = appStore.wallet!.keys as MoneroWalletKeys;

final hasPublicSpendKey = commonTestCases.isKeyPresent(
Expand Down Expand Up @@ -145,10 +145,18 @@ class WalletKeysAndSeedPageRobot {
tester.printToConsole('$walletName wallet has private view key properly displayed');
}
if (hasSeeds) {
await commonTestCases.dragUntilVisible(
'${walletName}_wallet_seed_item_key',
'wallet_keys_page_credentials_list_view_key',
);
commonTestCases.hasText(seed);
tester.printToConsole('$walletName wallet has seeds properly displayed');
}
if (hasSeedLegacy) {
await commonTestCases.dragUntilVisible(
'${walletName}_wallet_seed_legacy_item_key',
'wallet_keys_page_credentials_list_view_key',
);
commonTestCases.hasText(legacySeed);
tester.printToConsole('$walletName wallet has legacy seeds properly displayed');
}
Expand Down
2 changes: 1 addition & 1 deletion integration_test/test_suites/confirm_seeds_flow_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ Future<void> _confirmSeedsFlowForWalletType(
walletKeysAndSeedPageRobot.hasTitle();
walletKeysAndSeedPageRobot.hasShareWarning();

walletKeysAndSeedPageRobot.confirmWalletCredentials(walletType);
await walletKeysAndSeedPageRobot.confirmWalletCredentials(walletType);

await walletKeysAndSeedPageRobot.backToDashboard();
}
Loading

0 comments on commit 3ad0422

Please sign in to comment.