From: codingp110 Date: Sun, 18 Oct 2026 14:21:23 +0000 (+1100) Subject: test(chain): test rusqlite persistence with `assert_persist_changesets` X-Git-Url: http://internal-gitweb-vhost/-script/src/example_cli/scripts/-script-interface/FromScriptException.UnrecognizedScript.html?a=commitdiff_plain;h=206f9d01a40f5e4509bfcce57da219a7246727a1;p=bdk test(chain): test rusqlite persistence with `assert_persist_changesets` Co-Authored-By: 志宇 Co-Authored-By: Claude Opus 5.5 --- diff --git a/crates/chain/Cargo.toml b/crates/chain/Cargo.toml index e474f997..36ff3847 100644 --- a/crates/chain/Cargo.toml +++ b/crates/chain/Cargo.toml @@ -27,8 +27,9 @@ rusqlite = { version = "0.31.0", features = ["bundled"], optional = true } [dev-dependencies] rand = "0.8" proptest = "1.2.0" -bdk_testenv = { path = "../testenv" } +bdk_testenv = { path = "../testenv" } # `miniscript` is active by default criterion = { version = "0.7" } +tempfile = "3" [features] default = ["std", "miniscript"] diff --git a/crates/chain/tests/test_rusqlite_impl.rs b/crates/chain/tests/test_rusqlite_impl.rs new file mode 100644 index 00000000..05a22ce5 --- /dev/null +++ b/crates/chain/tests/test_rusqlite_impl.rs @@ -0,0 +1,62 @@ +#![cfg(feature = "rusqlite")] +#[cfg(feature = "miniscript")] +use bdk_chain::keychain_txout; +use bdk_chain::{local_chain, tx_graph, Merge}; +use bdk_testenv::persist_test_utils::*; +use core::fmt::Debug; +use rusqlite::Transaction; + +#[test] +fn changesets_are_persisted() { + #[track_caller] + fn assert_sqlite_persists( + changesets: &[C], + init_tables: fn(&Transaction) -> rusqlite::Result<()>, + from_sqlite: fn(&Transaction) -> rusqlite::Result, + persist_to_sqlite: fn(&C, &Transaction) -> rusqlite::Result<()>, + ) where + C: Debug + PartialEq + Default + Merge + Clone, + { + let temp_dir = tempfile::tempdir().unwrap(); + assert_persist_changesets( + || { + let mut db = rusqlite::Connection::open(temp_dir.path().join("wallet.sqlite"))?; + let db_tx = db.transaction()?; + init_tables(&db_tx)?; + db_tx.commit()?; + Ok(db) + }, + |db| { + let db_tx = db.transaction()?; + Ok(from_sqlite(&db_tx)?) + }, + |db, changeset| { + let db_tx = db.transaction()?; + persist_to_sqlite(changeset, &db_tx)?; + db_tx.commit()?; + Ok(()) + }, + changesets, + ); + } + + assert_sqlite_persists( + &tx_graph_changesets(), + tx_graph::ChangeSet::init_sqlite_tables, + tx_graph::ChangeSet::from_sqlite, + tx_graph::ChangeSet::persist_to_sqlite, + ); + #[cfg(feature = "miniscript")] + assert_sqlite_persists( + &keychain_txout_changesets(), + keychain_txout::ChangeSet::init_sqlite_tables, + keychain_txout::ChangeSet::from_sqlite, + keychain_txout::ChangeSet::persist_to_sqlite, + ); + assert_sqlite_persists( + &local_chain_changesets(), + local_chain::ChangeSet::init_sqlite_tables, + local_chain::ChangeSet::from_sqlite, + local_chain::ChangeSet::persist_to_sqlite, + ); +}