diff --git a/bdk_demo/analysis_options.yaml b/bdk_demo/analysis_options.yaml index 0d29021..0d87f43 100644 --- a/bdk_demo/analysis_options.yaml +++ b/bdk_demo/analysis_options.yaml @@ -7,6 +7,11 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. +analyzer: + exclude: + - build/** + - android/** + - ios/** include: package:flutter_lints/flutter.yaml linter: diff --git a/bdk_demo/test/presentation/receive_page_test.dart b/bdk_demo/test/presentation/receive_page_test.dart index da34dd1..145857c 100644 --- a/bdk_demo/test/presentation/receive_page_test.dart +++ b/bdk_demo/test/presentation/receive_page_test.dart @@ -173,6 +173,9 @@ void main() { expect(find.text('No receive address yet'), findsOneWidget); expect(find.text('Generate New Address'), findsOneWidget); expect(find.byType(PrettyQrView), findsNothing); + + container.dispose(); + await tester.pump(); }); testWidgets('generates and renders receive address details', (tester) async { diff --git a/test/wallet_create_load_params_test.dart b/test/wallet_create_load_params_test.dart new file mode 100644 index 0000000..ace740d --- /dev/null +++ b/test/wallet_create_load_params_test.dart @@ -0,0 +1,179 @@ +import 'dart:io'; + +import 'package:bdk_dart/bdk.dart'; +import 'package:test/test.dart'; + +import 'test_constants.dart'; + +Future _deleteDirectoryWithRetry(Directory directory) async { + for (var attempt = 0; attempt < 10; attempt++) { + try { + if (directory.existsSync()) { + await directory.delete(recursive: true); + } + return; + } on PathAccessException { + await Future.delayed(const Duration(milliseconds: 100)); + } + } + + if (directory.existsSync()) { + await directory.delete(recursive: true); + } +} + +CreateParams _createParams() => + CreateParams(lookahead: defaultLookahead, useSpkCache: true); + +LoadParams _loadParams() => LoadParams( + checkNetwork: Network.testnet, + lookahead: defaultLookahead, + useSpkCache: false, +); + +void main() { + group('Wallet CreateParams / LoadParams constructors', () { + test('createWithParams wallet reloads through loadWithParams', () { + final tempDir = Directory.systemTemp.createTempSync( + 'bdk_dart_create_with_params_', + ); + addTearDown(() => _deleteDirectoryWithRetry(tempDir)); + + final dbPath = '${tempDir.path}/wallet.sqlite'; + final descriptor = buildBip84Descriptor(Network.testnet); + final changeDescriptor = buildBip84ChangeDescriptor(Network.testnet); + Persister? persister; + Wallet? wallet; + Address? revealedAddress; + Persister? reopenedPersister; + Wallet? reopenedWallet; + Address? peekedAddress; + + try { + persister = Persister.newSqlite(path: dbPath); + wallet = Wallet.createWithParams( + descriptor: descriptor, + changeDescriptor: changeDescriptor, + network: Network.testnet, + persister: persister, + params: _createParams(), + ); + + final revealed = wallet.revealNextAddress( + keychain: KeychainKind.external_, + ); + revealedAddress = revealed.address; + expect(revealedAddress.toString(), isNotEmpty); + expect(wallet.persist(persister: persister), isTrue); + + revealedAddress.dispose(); + revealedAddress = null; + wallet.dispose(); + wallet = null; + persister.dispose(); + persister = null; + + reopenedPersister = Persister.newSqlite(path: dbPath); + reopenedWallet = Wallet.loadWithParams( + descriptor: descriptor, + changeDescriptor: changeDescriptor, + persister: reopenedPersister, + params: _loadParams(), + ); + + expect(reopenedWallet.network(), equals(Network.testnet)); + expect( + reopenedWallet.derivationIndex(keychain: KeychainKind.external_), + equals(0), + ); + + final peeked = reopenedWallet.peekAddress( + keychain: KeychainKind.external_, + index: 0, + ); + peekedAddress = peeked.address; + expect(peekedAddress.toString(), isNotEmpty); + } finally { + peekedAddress?.dispose(); + reopenedWallet?.dispose(); + reopenedPersister?.dispose(); + revealedAddress?.dispose(); + wallet?.dispose(); + persister?.dispose(); + descriptor.dispose(); + changeDescriptor.dispose(); + } + }); + + test( + 'createSingleWithParams wallet reloads through loadSingleWithParams', + () { + final tempDir = Directory.systemTemp.createTempSync( + 'bdk_dart_create_single_with_params_', + ); + addTearDown(() => _deleteDirectoryWithRetry(tempDir)); + + final dbPath = '${tempDir.path}/wallet.sqlite'; + final descriptor = buildBip86Descriptor(Network.testnet); + Persister? persister; + Wallet? wallet; + Address? revealedAddress; + Persister? reopenedPersister; + Wallet? reopenedWallet; + Address? peekedAddress; + + try { + persister = Persister.newSqlite(path: dbPath); + wallet = Wallet.createSingleWithParams( + descriptor: descriptor, + network: Network.testnet, + persister: persister, + params: _createParams(), + ); + + final revealed = wallet.revealNextAddress( + keychain: KeychainKind.external_, + ); + revealedAddress = revealed.address; + expect(revealedAddress.toString(), isNotEmpty); + expect(wallet.persist(persister: persister), isTrue); + + revealedAddress.dispose(); + revealedAddress = null; + wallet.dispose(); + wallet = null; + persister.dispose(); + persister = null; + + reopenedPersister = Persister.newSqlite(path: dbPath); + reopenedWallet = Wallet.loadSingleWithParams( + descriptor: descriptor, + persister: reopenedPersister, + params: _loadParams(), + ); + + expect(reopenedWallet.network(), equals(Network.testnet)); + expect( + reopenedWallet.derivationIndex(keychain: KeychainKind.external_), + equals(0), + ); + + final peeked = reopenedWallet.peekAddress( + keychain: KeychainKind.external_, + index: 0, + ); + peekedAddress = peeked.address; + expect(peekedAddress.toString(), isNotEmpty); + } finally { + peekedAddress?.dispose(); + reopenedWallet?.dispose(); + reopenedPersister?.dispose(); + revealedAddress?.dispose(); + wallet?.dispose(); + persister?.dispose(); + descriptor.dispose(); + } + }, + ); + }); +}