use proptest::prelude::*;
use std::collections::HashMap;
use synadb::model_registry::ModelRegistry;
use tempfile::tempdir;
proptest! {
#![proptest_config(ProptestConfig::with_cases(50))]
#[test]
fn prop_model_checksum_verified_on_load(
data in prop::collection::vec(any::<u8>(), 100..10000),
) {
let dir = tempdir().unwrap();
let db_path = dir.path().join("models.db");
let mut registry = ModelRegistry::new(&db_path).unwrap();
let version = registry.save_model(
"test_model",
&data,
HashMap::new(),
).unwrap();
let (loaded_data, loaded_version) = registry.load_model(
"test_model",
Some(version.version),
).unwrap();
prop_assert_eq!(data, loaded_data, "Loaded data should match original");
prop_assert_eq!(version.checksum, loaded_version.checksum, "Checksums should match");
}
#[test]
fn prop_different_data_different_checksum(
data1 in prop::collection::vec(any::<u8>(), 100..1000),
data2 in prop::collection::vec(any::<u8>(), 100..1000),
) {
prop_assume!(data1 != data2);
let dir = tempdir().unwrap();
let db_path = dir.path().join("models.db");
let mut registry = ModelRegistry::new(&db_path).unwrap();
let v1 = registry.save_model("model", &data1, HashMap::new()).unwrap();
let v2 = registry.save_model("model", &data2, HashMap::new()).unwrap();
prop_assert_ne!(v1.checksum, v2.checksum,
"Different data should produce different checksums");
}
#[test]
fn prop_identical_data_identical_checksum(
data in prop::collection::vec(any::<u8>(), 100..5000),
) {
let dir = tempdir().unwrap();
let db_path = dir.path().join("models.db");
let mut registry = ModelRegistry::new(&db_path).unwrap();
let v1 = registry.save_model("model", &data, HashMap::new()).unwrap();
let v2 = registry.save_model("model", &data, HashMap::new()).unwrap();
prop_assert_eq!(v1.checksum, v2.checksum,
"Identical data should produce identical checksums");
}
#[test]
fn prop_checksum_persists_across_reopen(
data in prop::collection::vec(any::<u8>(), 100..5000),
) {
let dir = tempdir().unwrap();
let db_path = dir.path().join("models.db");
let original_checksum: String;
let original_version: u32;
{
let mut registry = ModelRegistry::new(&db_path).unwrap();
let version = registry.save_model("test_model", &data, HashMap::new()).unwrap();
original_checksum = version.checksum.clone();
original_version = version.version;
}
{
let mut registry = ModelRegistry::new(&db_path).unwrap();
let (loaded_data, loaded_version) = registry.load_model(
"test_model",
Some(original_version),
).unwrap();
prop_assert_eq!(data, loaded_data, "Data should match after reopen");
prop_assert_eq!(original_checksum, loaded_version.checksum,
"Checksum should match after reopen");
}
}
}