Skip to content

Commit c3265e2

Browse files
committed
test(bdk): add tests for wallet constructor methods
1 parent 96f1d94 commit c3265e2

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

crates/bdk/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ dev-getrandom-wasm = ["getrandom/js"]
4747
lazy_static = "1.4"
4848
env_logger = "0.7"
4949
assert_matches = "1.5.0"
50+
tempfile = "3"
51+
bdk_file_store = { path = "../file_store" }
5052

5153
[package.metadata.docs.rs]
5254
all-features = true

crates/bdk/tests/wallet.rs

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::str::FromStr;
2+
13
use assert_matches::assert_matches;
24
use bdk::descriptor::calc_checksum;
35
use bdk::psbt::PsbtUtils;
@@ -17,7 +19,6 @@ use bitcoin::{
1719
};
1820
use bitcoin::{psbt, Network};
1921
use bitcoin::{BlockHash, Txid};
20-
use core::str::FromStr;
2122

2223
mod common;
2324
use common::*;
@@ -60,6 +61,101 @@ fn receive_output_in_latest_block(wallet: &mut Wallet, value: u64) -> OutPoint {
6061
// OP_PUSH.
6162
const P2WPKH_FAKE_WITNESS_SIZE: usize = 106;
6263

64+
const DB_MAGIC: &[u8] = &[0x21, 0x24, 0x48];
65+
66+
#[test]
67+
fn load_recovers_wallet() {
68+
let temp_dir = tempfile::tempdir().expect("must create tempdir");
69+
let file_path = temp_dir.path().join("store.db");
70+
71+
// create new wallet
72+
let wallet_keychains = {
73+
let db = bdk_file_store::Store::create_new(DB_MAGIC, &file_path).expect("must create db");
74+
let wallet =
75+
Wallet::new(get_test_wpkh(), None, db, Network::Testnet).expect("must init wallet");
76+
wallet.keychains().clone()
77+
};
78+
79+
// recover wallet
80+
{
81+
let db = bdk_file_store::Store::open(DB_MAGIC, &file_path).expect("must recover db");
82+
let wallet = Wallet::load(get_test_wpkh(), None, db).expect("must recover wallet");
83+
assert_eq!(wallet.network(), Network::Testnet);
84+
assert_eq!(wallet.spk_index().keychains(), &wallet_keychains);
85+
}
86+
}
87+
88+
#[test]
89+
fn new_or_load() {
90+
let temp_dir = tempfile::tempdir().expect("must create tempdir");
91+
let file_path = temp_dir.path().join("store.db");
92+
93+
// init wallet when non-existant
94+
let wallet_keychains = {
95+
let db = bdk_file_store::Store::open_or_create_new(DB_MAGIC, &file_path)
96+
.expect("must create db");
97+
let wallet = Wallet::new_or_load(get_test_wpkh(), None, db, Network::Testnet)
98+
.expect("must init wallet");
99+
wallet.keychains().clone()
100+
};
101+
102+
// wrong network
103+
{
104+
let db =
105+
bdk_file_store::Store::open_or_create_new(DB_MAGIC, &file_path).expect("must open db");
106+
let err = Wallet::new_or_load(get_test_wpkh(), None, db, Network::Bitcoin)
107+
.expect_err("wrong network");
108+
assert!(
109+
matches!(
110+
err,
111+
bdk::wallet::NewOrLoadError::LoadedNetworkDoesNotMatch {
112+
got: Some(Network::Testnet),
113+
expected: Network::Bitcoin
114+
}
115+
),
116+
"err: {}",
117+
err,
118+
);
119+
}
120+
121+
// wrong genesis hash
122+
{
123+
let exp_blockhash = BlockHash::all_zeros();
124+
let got_blockhash =
125+
bitcoin::blockdata::constants::genesis_block(Network::Testnet).block_hash();
126+
127+
let db =
128+
bdk_file_store::Store::open_or_create_new(DB_MAGIC, &file_path).expect("must open db");
129+
let err = Wallet::new_or_load_with_genesis_hash(
130+
get_test_wpkh(),
131+
None,
132+
db,
133+
Network::Testnet,
134+
exp_blockhash,
135+
)
136+
.expect_err("wrong genesis hash");
137+
assert!(
138+
matches!(
139+
err,
140+
bdk::wallet::NewOrLoadError::LoadedGenesisDoesNotMatch { got, expected }
141+
if got == Some(got_blockhash) && expected == exp_blockhash
142+
),
143+
"err: {}",
144+
err,
145+
);
146+
}
147+
148+
// all parameters match
149+
{
150+
let db =
151+
bdk_file_store::Store::open_or_create_new(DB_MAGIC, &file_path).expect("must open db");
152+
let wallet = Wallet::new_or_load(get_test_wpkh(), None, db, Network::Testnet)
153+
.expect("must recover wallet");
154+
assert_eq!(wallet.network(), Network::Testnet);
155+
assert_eq!(wallet.keychains(), &wallet_keychains);
156+
}
157+
}
158+
63159
#[test]
64160
fn test_descriptor_checksum() {
65161
let (wallet, _) = get_funded_wallet(get_test_wpkh());

0 commit comments

Comments
 (0)