use std::path::PathBuf;
use dig_coinstore::config::{
default_storage_backend_for_features, CoinStoreConfig, StorageBackend, DEFAULT_LMDB_MAP_SIZE,
DEFAULT_MAX_QUERY_RESULTS, DEFAULT_MAX_SNAPSHOTS, DEFAULT_ROCKSDB_MAX_OPEN_FILES,
DEFAULT_ROCKSDB_WRITE_BUFFER_SIZE,
};
mod helpers;
#[test]
fn vv_req_api_003_defaults_match_spec_table() {
let c = CoinStoreConfig::default();
assert_eq!(c.storage_path, PathBuf::from("./coinstate"));
assert_eq!(c.max_snapshots, DEFAULT_MAX_SNAPSHOTS);
assert_eq!(c.max_query_results, DEFAULT_MAX_QUERY_RESULTS);
assert_eq!(c.lmdb_map_size, DEFAULT_LMDB_MAP_SIZE);
assert_eq!(
c.rocksdb_write_buffer_size,
DEFAULT_ROCKSDB_WRITE_BUFFER_SIZE
);
assert_eq!(c.rocksdb_max_open_files, DEFAULT_ROCKSDB_MAX_OPEN_FILES);
assert!(c.bloom_filter, "SPEC default enables RocksDB bloom filters");
assert_eq!(c.backend, default_storage_backend_for_features());
}
#[test]
fn vv_req_api_003_default_backend_follows_feature_matrix() {
let c = CoinStoreConfig::default();
#[cfg(all(feature = "lmdb-storage", feature = "rocksdb-storage"))]
assert_eq!(
c.backend,
StorageBackend::Lmdb,
"dual features → LMDB preferred"
);
#[cfg(all(feature = "lmdb-storage", not(feature = "rocksdb-storage")))]
assert_eq!(c.backend, StorageBackend::Lmdb);
#[cfg(all(not(feature = "lmdb-storage"), feature = "rocksdb-storage"))]
assert_eq!(c.backend, StorageBackend::RocksDb);
#[cfg(all(not(feature = "lmdb-storage"), not(feature = "rocksdb-storage")))]
assert_eq!(c.backend, StorageBackend::RocksDb);
}
#[test]
fn vv_req_api_003_builder_chaining_sets_all_fields() {
let built = CoinStoreConfig::default()
.with_backend(StorageBackend::RocksDb)
.with_storage_path("/tmp/chain_test")
.with_max_snapshots(42)
.with_max_query_results(12345)
.with_lmdb_map_size(1_048_576)
.with_rocksdb_write_buffer_size(2_097_152)
.with_rocksdb_max_open_files(512)
.with_bloom_filter(false);
let expected = CoinStoreConfig {
backend: StorageBackend::RocksDb,
storage_path: PathBuf::from("/tmp/chain_test"),
max_snapshots: 42,
max_query_results: 12345,
lmdb_map_size: 1_048_576,
rocksdb_write_buffer_size: 2_097_152,
rocksdb_max_open_files: 512,
bloom_filter: false,
};
assert_eq!(built, expected);
}
#[test]
fn vv_req_api_003_builder_preserves_unset_fields() {
let tweaked = CoinStoreConfig::default().with_max_snapshots(99);
let base = CoinStoreConfig::default();
assert_eq!(tweaked.max_snapshots, 99);
assert_eq!(tweaked.backend, base.backend);
assert_eq!(tweaked.storage_path, base.storage_path);
assert_eq!(tweaked.max_query_results, base.max_query_results);
assert_eq!(tweaked.lmdb_map_size, base.lmdb_map_size);
assert_eq!(
tweaked.rocksdb_write_buffer_size,
base.rocksdb_write_buffer_size
);
assert_eq!(tweaked.rocksdb_max_open_files, base.rocksdb_max_open_files);
assert_eq!(tweaked.bloom_filter, base.bloom_filter);
}
#[test]
fn vv_req_api_003_config_clone_round_trip() {
let a = CoinStoreConfig::default()
.with_max_query_results(777)
.with_storage_path("snapshot_clone");
let b = a.clone();
assert_eq!(a, b);
}
#[test]
fn vv_req_api_003_storage_backend_variants_constructible() {
let _l = StorageBackend::Lmdb;
let _r = StorageBackend::RocksDb;
}
#[test]
fn vv_req_api_003_default_with_path_matches_default_plus_path() {
let p = PathBuf::from("custom/coinstate_data");
let a = CoinStoreConfig::default_with_path(&p);
let b = CoinStoreConfig::default().with_storage_path(p.clone());
assert_eq!(a, b);
}
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_003_coin_store_exposes_effective_config() {
use dig_coinstore::coin_store::CoinStore;
let dir = helpers::temp_dir();
let cfg = CoinStoreConfig::default_with_path(dir.path())
.with_max_snapshots(1234)
.with_max_query_results(999)
.with_backend(StorageBackend::RocksDb);
let store = CoinStore::with_config(cfg.clone()).expect("open");
assert_eq!(store.config(), &cfg);
}
#[cfg(feature = "rocksdb-storage")]
#[test]
fn vv_req_api_003_rocksdb_backend_opens_via_config() {
use dig_coinstore::coin_store::CoinStore;
let dir = helpers::temp_dir();
let cfg = CoinStoreConfig::default_with_path(dir.path()).with_backend(StorageBackend::RocksDb);
let res = CoinStore::with_config(cfg);
assert!(res.is_ok(), "RocksDB open failed: {:?}", res.err());
}
#[cfg(feature = "lmdb-storage")]
#[test]
fn vv_req_api_003_lmdb_backend_opens_via_config() {
use dig_coinstore::coin_store::CoinStore;
let dir = helpers::temp_dir();
let cfg = CoinStoreConfig::default_with_path(dir.path()).with_backend(StorageBackend::Lmdb);
let res = CoinStore::with_config(cfg);
assert!(res.is_ok(), "LMDB open failed: {:?}", res.err());
}