Skip to content

Commit 6502bb6

Browse files
committed
test: add offline wallet smoke tests
1 parent 509c5fa commit 6502bb6

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

bdk-ffi/src/tests/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ mod descriptor;
33
mod error;
44
mod keys;
55
mod tx_builder;
6+
mod wallet;

bdk-ffi/src/tests/wallet.rs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
use crate::bitcoin::Network;
2+
use crate::descriptor::Descriptor;
3+
use crate::store::Persister;
4+
use crate::wallet::Wallet;
5+
6+
use bdk_wallet::KeychainKind;
7+
8+
use std::sync::Arc;
9+
10+
const EXTERNAL_DESCRIPTOR: &str = "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/1h/0/*)";
11+
const INTERNAL_DESCRIPTOR: &str = "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/1h/1/*)";
12+
const TWO_PATH_DESCRIPTOR: &str = "wpkh([9a6a2580/84'/1'/0']tpubDDnGNapGEY6AZAdQbfRJgMg9fvz8pUBrLwvyvUqEgcUfgzM6zc2eVK4vY9x9L5FJWdX8WumXuLEDV5zDZnTfbn87vLe9XceCFwTu9so9Kks/<0;1>/*)";
13+
const EXPECTED_FIRST_ADDRESS: &str = "tb1qhjys9wxlfykmte7ftryptx975uqgd6kcm6a7z4";
14+
15+
fn external_descriptor() -> Arc<Descriptor> {
16+
Arc::new(Descriptor::new(EXTERNAL_DESCRIPTOR.to_string(), Network::Signet).unwrap())
17+
}
18+
19+
fn internal_descriptor() -> Arc<Descriptor> {
20+
Arc::new(Descriptor::new(INTERNAL_DESCRIPTOR.to_string(), Network::Signet).unwrap())
21+
}
22+
23+
fn two_path_descriptor() -> Arc<Descriptor> {
24+
Arc::new(Descriptor::new(TWO_PATH_DESCRIPTOR.to_string(), Network::Signet).unwrap())
25+
}
26+
27+
fn build_wallet() -> Wallet {
28+
Wallet::new(
29+
external_descriptor(),
30+
internal_descriptor(),
31+
Network::Signet,
32+
Arc::new(Persister::new_in_memory().unwrap()),
33+
25,
34+
)
35+
.unwrap()
36+
}
37+
38+
#[test]
39+
fn test_create_wallet() {
40+
let wallet = build_wallet();
41+
42+
assert_eq!(wallet.network(), Network::Signet);
43+
assert_eq!(wallet.balance().total.to_sat(), 0u64);
44+
assert!(wallet.list_unspent().is_empty());
45+
assert_eq!(wallet.derivation_index(KeychainKind::External), None);
46+
assert_eq!(wallet.next_derivation_index(KeychainKind::External), 0);
47+
}
48+
49+
#[test]
50+
fn test_reveal_next_address() {
51+
let wallet = build_wallet();
52+
53+
let address_info = wallet.reveal_next_address(KeychainKind::External);
54+
55+
assert_eq!(address_info.index, 0);
56+
assert_eq!(address_info.keychain, KeychainKind::External);
57+
assert_eq!(address_info.address.to_string(), EXPECTED_FIRST_ADDRESS);
58+
}
59+
60+
#[test]
61+
fn test_create_single_wallet() {
62+
let wallet = Wallet::create_single(
63+
external_descriptor(),
64+
Network::Signet,
65+
Arc::new(Persister::new_in_memory().unwrap()),
66+
25,
67+
)
68+
.unwrap();
69+
70+
assert_eq!(wallet.derivation_index(KeychainKind::External), None);
71+
72+
let address_info = wallet.reveal_next_address(KeychainKind::External);
73+
74+
assert_eq!(address_info.index, 0);
75+
assert_eq!(address_info.keychain, KeychainKind::External);
76+
assert_eq!(address_info.address.to_string(), EXPECTED_FIRST_ADDRESS);
77+
assert_eq!(wallet.derivation_index(KeychainKind::External), Some(0));
78+
assert_eq!(wallet.next_derivation_index(KeychainKind::External), 1);
79+
}
80+
81+
#[test]
82+
fn test_create_two_path_wallet() {
83+
let wallet = Wallet::create_from_two_path_descriptor(
84+
two_path_descriptor(),
85+
Network::Signet,
86+
Arc::new(Persister::new_in_memory().unwrap()),
87+
25,
88+
)
89+
.unwrap();
90+
91+
assert_eq!(wallet.derivation_index(KeychainKind::External), None);
92+
assert_eq!(wallet.derivation_index(KeychainKind::Internal), None);
93+
94+
let external_address = wallet.reveal_next_address(KeychainKind::External);
95+
let internal_address = wallet.reveal_next_address(KeychainKind::Internal);
96+
97+
assert_eq!(external_address.index, 0);
98+
assert_eq!(external_address.keychain, KeychainKind::External);
99+
assert_eq!(internal_address.index, 0);
100+
assert_eq!(internal_address.keychain, KeychainKind::Internal);
101+
assert_ne!(
102+
external_address.address.to_string(),
103+
internal_address.address.to_string()
104+
);
105+
assert_eq!(wallet.derivation_index(KeychainKind::External), Some(0));
106+
assert_eq!(wallet.derivation_index(KeychainKind::Internal), Some(0));
107+
}

0 commit comments

Comments
 (0)