use datafold::fold_db_core::FoldDB;
use std::thread;
use std::time::Duration;
use tempfile::TempDir;
#[tokio::test]
async fn test_duplicate_transform_registration_prevention() {
use serde_json::json;
let temp_dir = TempDir::new().expect("Failed to create temp directory");
let test_db_path = temp_dir
.path()
.to_str()
.expect("Failed to convert path to string");
let fold_db = FoldDB::new(test_db_path)
.await
.expect("Failed to create FoldDB instance");
let transform_manager = fold_db.transform_manager();
let blogpost_schema_json = json!({
"name": "BlogPost",
"key": {
"range_field": "publish_date"
},
"fields": {
"title": {},
"content": {},
"author": {},
"publish_date": {},
"tags": {}
}
});
let blogpost_schema_str =
serde_json::to_string(&blogpost_schema_json).expect("Failed to serialize BlogPost schema");
fold_db
.schema_manager()
.load_schema_from_json(&blogpost_schema_str)
.await
.expect("Failed to load BlogPost schema");
let wordindex_schema_json = json!({
"name": "BlogPostWordIndex",
"key": {
"hash_field": "word",
"range_field": "publish_date"
},
"transform_fields": {
"word": "BlogPost.content.split_by_word()",
"publish_date": "BlogPost.publish_date",
"content": "BlogPost.content",
"author": "BlogPost.author",
"title": "BlogPost.title",
"tags": "BlogPost.tags"
}
});
let wordindex_schema_str = serde_json::to_string(&wordindex_schema_json)
.expect("Failed to serialize BlogPostWordIndex schema");
fold_db
.schema_manager()
.load_schema_from_json(&wordindex_schema_str)
.await
.expect("Failed to load BlogPostWordIndex schema");
thread::sleep(Duration::from_millis(100));
let registered_transforms = transform_manager
.list_transforms()
.expect("Failed to list transforms");
assert!(
registered_transforms.contains_key("BlogPostWordIndex"),
"Transform should be registered after first load"
);
assert_eq!(
registered_transforms.len(),
1,
"Should have exactly one transform registered after first load"
);
fold_db
.schema_manager()
.load_schema_from_json(&wordindex_schema_str)
.await
.expect("Failed to load BlogPostWordIndex schema again");
thread::sleep(Duration::from_millis(100));
let final_transforms = transform_manager
.list_transforms()
.expect("Failed to list final transforms");
assert_eq!(
final_transforms.len(),
1,
"Should still have exactly one transform registered (no duplicates)"
);
assert!(
final_transforms.contains_key("BlogPostWordIndex"),
"Transform should still be registered"
);
let transforms_for_content = transform_manager
.get_transforms_for_field("BlogPost", "content")
.expect("Failed to get transforms for content field");
assert!(
transforms_for_content.contains("BlogPostWordIndex"),
"BlogPost.content should still map to BlogPostWordIndex transform"
);
fold_db.close().expect("Failed to close FoldDB");
}
#[tokio::test]
async fn test_transform_registration_through_schema_loading() {
use serde_json::json;
let temp_dir = TempDir::new().expect("Failed to create temp directory");
let test_db_path = temp_dir
.path()
.to_str()
.expect("Failed to convert path to string");
let fold_db = FoldDB::new(test_db_path)
.await
.expect("Failed to create FoldDB instance");
let transform_manager = fold_db.transform_manager();
let blogpost_schema_json = json!({
"name": "BlogPost",
"key": {
"range_field": "publish_date"
},
"fields": {
"title": {},
"content": {},
"author": {},
"publish_date": {},
"tags": {}
}
});
let blogpost_schema_str =
serde_json::to_string(&blogpost_schema_json).expect("Failed to serialize BlogPost schema");
fold_db
.schema_manager()
.load_schema_from_json(&blogpost_schema_str)
.await
.expect("Failed to load BlogPost schema");
let wordindex_schema_json = json!({
"name": "BlogPostWordIndex",
"key": {
"hash_field": "word",
"range_field": "publish_date"
},
"transform_fields": {
"word": "BlogPost.content.split_by_word()",
"publish_date": "BlogPost.publish_date",
"content": "BlogPost.content",
"author": "BlogPost.author",
"title": "BlogPost.title",
"tags": "BlogPost.tags"
}
});
let wordindex_schema_str = serde_json::to_string(&wordindex_schema_json)
.expect("Failed to serialize BlogPostWordIndex schema");
fold_db
.schema_manager()
.load_schema_from_json(&wordindex_schema_str)
.await
.expect("Failed to load BlogPostWordIndex schema");
thread::sleep(Duration::from_millis(100));
let registered_transforms = transform_manager
.list_transforms()
.expect("Failed to list transforms");
assert!(
registered_transforms.contains_key("BlogPostWordIndex"),
"Transform should be registered after schema loading"
);
assert_eq!(
registered_transforms.len(),
1,
"Should have exactly one transform registered"
);
let expected_trigger_fields = vec!["content", "publish_date", "author", "title", "tags"];
for field in &expected_trigger_fields {
let transforms_for_field = transform_manager
.get_transforms_for_field("BlogPost", field)
.expect("Failed to get transforms for field");
assert!(
transforms_for_field.contains("BlogPostWordIndex"),
"Field '{}' should trigger BlogPostWordIndex transform",
field
);
}
fold_db.close().expect("Failed to close FoldDB");
}