From 2c51672b2d9dc089b420d3aa7cc787e124f28b27 Mon Sep 17 00:00:00 2001 From: Gaurav Chaudhary Date: Fri, 10 Jul 2026 22:45:49 +0530 Subject: [PATCH] test: smoke test Dart full-scan binding call path Add a narrow Esplora-gated integration test that exercises the generated full-scan request/update path from Dart: startFullScan().build(), EsploraClient.fullScan(), and wallet.applyUpdate(). Success is no-throw completion through the binding path; scan semantics are not asserted. Closes #106 --- test/integration/full_scan_smoke_test.dart | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 test/integration/full_scan_smoke_test.dart diff --git a/test/integration/full_scan_smoke_test.dart b/test/integration/full_scan_smoke_test.dart new file mode 100644 index 0000000..fc660c4 --- /dev/null +++ b/test/integration/full_scan_smoke_test.dart @@ -0,0 +1,85 @@ +// @Tags(['integration']) + +import 'dart:async'; +import 'dart:io'; + +import 'package:bdk_dart/bdk.dart'; +import 'package:test/test.dart'; + +import '../test_constants.dart'; +import 'integration_helpers.dart'; + +Future _deleteDirectoryWithRetry(Directory dir) async { + for (var attempt = 0; attempt < 10; attempt++) { + try { + if (dir.existsSync()) { + await dir.delete(recursive: true); + } + return; + } on PathAccessException { + await Future.delayed(const Duration(milliseconds: 100)); + } + } + if (dir.existsSync()) { + await dir.delete(recursive: true); + } +} + +String _createTempSqlitePath(String prefix) { + final tempDir = Directory.systemTemp.createTempSync(prefix); + addTearDown(() => _deleteDirectoryWithRetry(tempDir)); + return '${tempDir.path}/wallet.sqlite'; +} + +void main() { + group('Full scan binding smoke', () { + test( + 'full scan request, backend call, and apply update succeed', + () { + final disposers = []; + final sqlitePath = _createTempSqlitePath('bdk_dart_full_scan_smoke_'); + + try { + final descriptor = buildBip84Descriptor(Network.testnet); + addDisposer(disposers, descriptor.dispose); + + final changeDescriptor = buildBip84ChangeDescriptor(Network.testnet); + addDisposer(disposers, changeDescriptor.dispose); + + final persister = Persister.newSqlite(path: sqlitePath); + addDisposer(disposers, persister.dispose); + + final wallet = Wallet( + descriptor: descriptor, + changeDescriptor: changeDescriptor, + network: Network.testnet, + persister: persister, + lookahead: defaultLookahead, + ); + addDisposer(disposers, wallet.dispose); + + final requestBuilder = wallet.startFullScan(); + addDisposer(disposers, requestBuilder.dispose); + + final request = requestBuilder.build(); + addDisposer(disposers, request.dispose); + + final client = buildEsploraClientFromEnv(); + addDisposer(disposers, client.dispose); + + final update = client.fullScan( + request: request, + stopGap: defaultLookahead, + parallelRequests: 4, + ); + addDisposer(disposers, update.dispose); + + wallet.applyUpdate(update: update); + } finally { + disposeAll(disposers); + } + }, + skip: integrationSkipReason(requiredEnv: [esploraUrlEnv]), + ); + }); +}