use chaotic_semantic_memory::prelude::*;
use tempfile::NamedTempFile;
const NS: &str = "_default";
#[tokio::test]
async fn version_history_after_multiple_updates() {
let temp = NamedTempFile::new().unwrap();
let db_path = temp.path().to_str().unwrap().to_string();
let framework = ChaoticSemanticFramework::builder()
.with_local_db(db_path)
.with_version_retention(5)
.build()
.await
.unwrap();
framework
.inject_concept("version-multi", HVec10240::random())
.await
.unwrap();
for _ in 0..3 {
framework
.update_concept_vector("version-multi", HVec10240::random())
.await
.unwrap();
}
framework.persist().await.unwrap();
let history = framework
.concept_history("version-multi", 10)
.await
.unwrap();
let _ = history;
}
#[tokio::test]
async fn version_retention_prunes_old_versions() {
let temp = NamedTempFile::new().unwrap();
let db_path = temp.path().to_str().unwrap().to_string();
let framework = ChaoticSemanticFramework::builder()
.with_local_db(db_path)
.with_version_retention(2) .build()
.await
.unwrap();
framework
.inject_concept("version-prune", HVec10240::random())
.await
.unwrap();
for _ in 0..5 {
framework
.update_concept_vector("version-prune", HVec10240::random())
.await
.unwrap();
}
framework.persist().await.unwrap();
let history = framework
.concept_history("version-prune", 10)
.await
.unwrap();
assert!(history.len() <= 2 || history.is_empty());
}
#[tokio::test]
async fn version_history_empty_for_nonexistent_concept() {
let temp = NamedTempFile::new().unwrap();
let db_path = temp.path().to_str().unwrap().to_string();
let framework = ChaoticSemanticFramework::builder()
.with_local_db(db_path)
.build()
.await
.unwrap();
let history = framework
.concept_history("nonexistent-version", 10)
.await
.unwrap();
assert!(history.is_empty());
}
#[tokio::test]
async fn version_metadata_update_creates_version() {
let temp = NamedTempFile::new().unwrap();
let db_path = temp.path().to_str().unwrap().to_string();
let framework = ChaoticSemanticFramework::builder()
.with_local_db(db_path)
.build()
.await
.unwrap();
framework
.inject_concept("version-meta", HVec10240::random())
.await
.unwrap();
let meta = std::collections::HashMap::from([("updated".to_string(), serde_json::json!("yes"))]);
framework
.update_concept_metadata("version-meta", meta)
.await
.unwrap();
framework.persist().await.unwrap();
let concept = framework
.get_concept("version-meta")
.await
.unwrap()
.unwrap();
assert_eq!(
concept.metadata.get("updated"),
Some(&serde_json::json!("yes"))
);
}
#[tokio::test]
async fn version_persist_after_injection() {
let temp = NamedTempFile::new().unwrap();
let db_path = temp.path().to_str().unwrap().to_string();
let framework = ChaoticSemanticFramework::builder()
.with_local_db(&db_path)
.build()
.await
.unwrap();
framework
.inject_concept("persist-version", HVec10240::random())
.await
.unwrap();
framework.persist().await.unwrap();
let framework2 = ChaoticSemanticFramework::builder()
.with_local_db(&db_path)
.build()
.await
.unwrap();
let stats = framework2.stats().await.unwrap();
assert_eq!(stats.concept_count, 1);
}