Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 40 additions & 10 deletions integration_test/payjoin_test.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import 'dart:async';

import 'package:bb_mobile/core/fees/domain/fees_entity.dart';
import 'package:bb_mobile/core/payjoin/data/datasources/local_payjoin_datasource.dart';
import 'package:bb_mobile/core/payjoin/domain/entity/payjoin.dart';
import 'package:bb_mobile/core/payjoin/domain/repositories/payjoin_repository.dart';
import 'package:bb_mobile/core/payjoin/domain/usecases/receive_with_payjoin_usecase.dart';
import 'package:bb_mobile/core/payjoin/domain/usecases/send_with_payjoin_usecase.dart';
import 'package:bb_mobile/core/seed/data/models/seed_model.dart';
import 'package:bb_mobile/core/seed/data/repository/seed_repository.dart';
import 'package:bb_mobile/core/settings/domain/settings_entity.dart';
import 'package:bb_mobile/core/utils/constants.dart';
import 'package:bb_mobile/core/wallet/data/repositories/wallet_address_repository.dart';
Expand All @@ -16,7 +17,6 @@ import 'package:bb_mobile/features/send/domain/usecases/prepare_bitcoin_send_use
import 'package:bb_mobile/features/settings/domain/usecases/set_environment_usecase.dart';
import 'package:bb_mobile/locator.dart';
import 'package:bb_mobile/main.dart';
import 'dart:io' show Platform;

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart' show TestWidgetsFlutterBinding;
Expand All @@ -30,39 +30,69 @@ Future<void> main({bool isInitialized = false}) async {
late Wallet senderWallet;

final walletRepository = locator<WalletRepository>();
final seedRepository = locator<SeedRepository>();
final addressRepository = locator<WalletAddressRepository>();
final utxoRepository = locator<WalletUtxoRepository>();
final payjoinRepository = locator<PayjoinRepository>();
final localPayjoinDatasource = locator<LocalPayjoinDatasource>();
final receiveWithPayjoinUsecase = locator<ReceiveWithPayjoinUsecase>();
final sendWithPayjoinUsecase = locator<SendWithPayjoinUsecase>();
final prepareBitcoinSendUsecase = locator<PrepareBitcoinSendUsecase>();

final receiverMnemonic = Platform.environment['TEST_ALICE_MNEMONIC'];
final senderMnemonic = Platform.environment['TEST_BOB_MNEMONIC'];
const receiverMnemonic = String.fromEnvironment('TEST_ALICE_MNEMONIC');
const senderMnemonic = String.fromEnvironment('TEST_BOB_MNEMONIC');

if (receiverMnemonic == null || receiverMnemonic.isEmpty) {
if (receiverMnemonic.isEmpty) {
throw Exception('TEST_ALICE_MNEMONIC environment variable is not set');
}
if (senderMnemonic == null || senderMnemonic.isEmpty) {
if (senderMnemonic.isEmpty) {
throw Exception('TEST_BOB_MNEMONIC environment variable is not set');
}

setUpAll(() async {
await locator<SetEnvironmentUsecase>().execute(Environment.testnet);

final receiverSeedModel = SeedModel.mnemonic(
// Drain any persisted payjoin state so the test starts clean. Ongoing
// payjoins left behind by a previous (possibly crashed) run keep their
// inputs frozen via getUtxosFrozenByOngoingPayjoins(), which would starve
// the sender wallet. _resumePayjoins in PayjoinRepositoryImpl's
// constructor runs unawaited and writes its own updates concurrently, so
// we expire + recheck until the ongoing set stays empty for several polls.
const pollInterval = Duration(milliseconds: 500);
const requiredStableChecks = 3;
const maxIterations = 40;
var stableChecks = 0;
for (var i = 0; i < maxIterations; i++) {
final ongoing = await localPayjoinDatasource.fetchAll(
onlyUnfinished: true,
);
if (ongoing.isEmpty) {
stableChecks++;
if (stableChecks >= requiredStableChecks) break;
} else {
stableChecks = 0;
for (final payjoin in ongoing) {
await localPayjoinDatasource.update(
payjoin.copyWith(isExpired: true),
);
}
}
await Future.delayed(pollInterval);
}

final receiverSeed = await seedRepository.createFromMnemonic(
mnemonicWords: receiverMnemonic.split(' '),
);
final senderSeedModel = SeedModel.mnemonic(
final senderSeed = await seedRepository.createFromMnemonic(
mnemonicWords: senderMnemonic.split(' '),
);
receiverWallet = await walletRepository.createWallet(
seed: receiverSeedModel.toEntity(),
seed: receiverSeed,
network: Network.bitcoinTestnet,
scriptType: ScriptType.bip84,
);
senderWallet = await walletRepository.createWallet(
seed: senderSeedModel.toEntity(),
seed: senderSeed,
network: Network.bitcoinTestnet,
scriptType: ScriptType.bip84,
);
Expand Down
62 changes: 32 additions & 30 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,9 @@ PODS:
- Flutter
- package_info_plus (0.4.5):
- Flutter
- payjoin_flutter (0.20.0)
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- permission_handler_apple (9.3.0):
- Flutter
- PromisesObjC (2.4.0)
Expand Down Expand Up @@ -175,7 +177,7 @@ DEPENDENCIES:
- lwk (from `.symlinks/plugins/lwk/ios`)
- no_screenshot (from `.symlinks/plugins/no_screenshot/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- payjoin_flutter (from `.symlinks/plugins/payjoin_flutter/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
Expand Down Expand Up @@ -239,8 +241,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/no_screenshot/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
payjoin_flutter:
:path: ".symlinks/plugins/payjoin_flutter/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
sentry_flutter:
Expand All @@ -267,46 +269,46 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73
AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f
ark_wallet: cb7a2af0c3a711d488709b7b91b6e639cfd441b1
ark_wallet: f985745c06c7cf93f368c61218c51ac56b46c71e
boltz: 6388ec2412f3753b63a9e65c97f87ea26f43bddc
camera_avfoundation: 5675ca25298b6f81fa0a325188e7df62cc217741
dart_bbqr: bfd89cc8a74538d94ef6d87d11e4a2ad55578e7d
camera_avfoundation: 281867ff09f1da66f031a184ecfbc6f2e625c9f5
dart_bbqr: 10143a83ef3919f9ac06974e3bbe23cac4abc39b
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
flutter_nfc_kit: e1b71583eafd2c9650bc86844a7f2d185fb414f6
flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23
flutter_secure_storage_legacy: 2b1517bd98433d760370884d3e2cc3ed8eeb2538
flutter_zxing: e8bcc43bd3056c70c271b732ed94e7a16fd62f93
google_sign_in_ios: b48bb9af78576358a168361173155596c845f0b9
flutter_native_splash: df59bb2e1421aa0282cb2e95618af4dcb0c56c29
flutter_nfc_kit: 3985c93f749b9cb4747479205c2f10bd2f877a11
flutter_secure_storage_darwin: 557817588b80e60213cbecb573c45c76b788018d
flutter_secure_storage_legacy: a315f1c83d88e9490f44a269454281a2c9b2c160
flutter_zxing: d527c3ff9c7f3606dd29a7ec8c4055f7daa088c5
google_sign_in_ios: 7411fab6948df90490dc4620ecbcabdc3ca04017
GoogleSignIn: ce8c89bb9b37fb624b92e7514cc67335d1e277e4
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
image_picker_ios: 4f2f91b01abdb52842a8e277617df877e40f905b
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
lwk: 22e06bc5664247d6b2dac91cfe209b63b70dd580
no_screenshot: 5e345998c43ffcad5d6834f249590483fcc037bd
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
payjoin_flutter: 6397d7b698cdad6453be4949ab6aca1863f6c5e5
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
no_screenshot: e91f3e7a771bf761b087c575028bb1b24a7ca33d
package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
path_provider_foundation: 0b743cbb62d8e47eab856f09262bb8c1ddcfe6ba
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
SDWebImage: e9fc87c1aab89a8ab1bbd74eba378c6f53be8abf
Sentry: 958d9619ceccf6abb8c4736003fa336dac1a80a7
sentry_flutter: bdfd7a7b8931c4ecefa37fde9e44a15cd0af30b1
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
sentry_flutter: 9bde8d71f013f0e807c424017de923f0ee489e9a
share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
shared_preferences_foundation: 5086985c1d43c5ba4d5e69a4e8083a389e2909e6
sqlite3: a51c07cf16e023d6c48abd5e5791a61a47354921
sqlite3_flutter_libs: b3e120efe9a82017e5552a620f696589ed4f62ab
sqlite3_flutter_libs: f9114e4bbe1f2e03dd543373c53d23245982ca13
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
tor: 767208930250ef7be241963b75568c55c0a81890
universal_ble: 45519b2aeafe62761e2c6309f8927edb5288b914
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
webview_cookie_manager: d63a76cabdf42a7ea3d92768ac67d4853a1367f8
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
workmanager_apple: 904529ae31e97fc5be632cf628507652294a0778
tor: 662a9f5b980b5c86decb8ba611de9bcd4c8286eb
universal_ble: 65e1257dffc557cc7991a93d253beeddc7c1dc92
url_launcher_ios: bb13df5870e8c4234ca12609d04010a21be43dfa
webview_cookie_manager: eaf920722b493bd0f7611b5484771ca53fed03f7
webview_flutter_wkwebview: 29eb20d43355b48fe7d07113835b9128f84e3af4
workmanager_apple: 7bac258335c310689a641e2d66e88d4845d372e9

PODFILE CHECKSUM: b9aa080c2a42d4d61d216015adddd3850778d844

Expand Down
Loading