]> Untitled Git - bdk/commitdiff
test(chain): test rusqlite persistence with `assert_persist_changesets`
authorcodingp110 <codingp110@gmail.com>
Sun, 18 Oct 2026 14:21:23 +0000 (01:21 +1100)
committer志宇 <hello@evanlinjin.me>
Sun, 18 Oct 2026 14:21:23 +0000 (01:21 +1100)
Co-Authored-By: 志宇 <hello@evanlinjin.me>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
crates/chain/Cargo.toml
crates/chain/tests/test_rusqlite_impl.rs [new file with mode: 0644]

index e474f99714e0625f3b0886edf7512f2c57ae4f2f..36ff3847db76b2b8b59e2adf678dd1f53bbf9854 100644 (file)
@@ -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 (file)
index 0000000..05a22ce
--- /dev/null
@@ -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<C>(
+        changesets: &[C],
+        init_tables: fn(&Transaction) -> rusqlite::Result<()>,
+        from_sqlite: fn(&Transaction) -> rusqlite::Result<C>,
+        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,
+    );
+}