use datafold::fold_db_core::orchestration::queue_manager::QueueManager;
use datafold::fold_db_core::FoldDB;
use tempfile::TempDir;
#[tokio::test]
async fn test_transform_queue_deduplication_by_mutation_id() {
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");
let orchestrator = fold_db
.transform_orchestrator()
.expect("Transform orchestrator should be available");
let queue_manager = orchestrator.get_queue_manager();
let transform_id = "TestTransform_word";
let mutation_id = "mutation-123";
let result1 = queue_manager
.add_item(transform_id, mutation_id)
.expect("Failed to add first item");
assert!(
result1,
"First addition should return true (item was added)"
);
let result2 = queue_manager
.add_item(transform_id, mutation_id)
.expect("Failed to attempt second addition");
assert!(
!result2,
"Second addition should return false (item was deduplicated)"
);
let result3 = queue_manager
.add_item(transform_id, mutation_id)
.expect("Failed to attempt third addition");
assert!(
!result3,
"Third addition should return false (item was deduplicated)"
);
let queued_transforms = queue_manager
.list_queued_transforms()
.expect("Failed to list queued transforms");
assert_eq!(
queued_transforms.len(),
1,
"Should have exactly 1 item in queue"
);
assert_eq!(
queued_transforms[0], transform_id,
"Queued transform should match"
);
let mutation_id_2 = "mutation-456";
let mutation_id_3 = "mutation-789";
let result4 = queue_manager
.add_item(transform_id, mutation_id_2)
.expect("Failed to add item with different mutation_id");
assert!(
result4,
"Addition with different mutation_id should return true"
);
let result5 = queue_manager
.add_item(transform_id, mutation_id_3)
.expect("Failed to add item with third mutation_id");
assert!(
result5,
"Addition with third mutation_id should return true"
);
let queued_transforms_after = queue_manager
.list_queued_transforms()
.expect("Failed to list queued transforms after multiple additions");
assert_eq!(
queued_transforms_after.len(),
3,
"Should have exactly 3 items in queue"
);
for transform in &queued_transforms_after {
assert_eq!(
transform, transform_id,
"All queued items should have same transform_id"
);
}
let transform_id_2 = "TestTransform_content";
let transform_id_3 = "TestTransform_author";
let shared_mutation_id = "shared-mutation-999";
let result6 = queue_manager
.add_item(transform_id_2, shared_mutation_id)
.expect("Failed to add second transform with shared mutation_id");
assert!(result6, "Addition of second transform should return true");
let result7 = queue_manager
.add_item(transform_id_3, shared_mutation_id)
.expect("Failed to add third transform with shared mutation_id");
assert!(result7, "Addition of third transform should return true");
let final_queued_transforms = queue_manager
.list_queued_transforms()
.expect("Failed to list final queued transforms");
assert_eq!(
final_queued_transforms.len(),
5,
"Should have exactly 5 items in queue"
);
assert!(final_queued_transforms.contains(&transform_id.to_string()));
assert!(final_queued_transforms.contains(&transform_id_2.to_string()));
assert!(final_queued_transforms.contains(&transform_id_3.to_string()));
let duplicate_result1 = queue_manager
.add_item(transform_id, mutation_id)
.expect("Failed to attempt duplicate addition");
assert!(
!duplicate_result1,
"Duplicate addition should still be deduplicated"
);
let duplicate_result2 = queue_manager
.add_item(transform_id_2, shared_mutation_id)
.expect("Failed to attempt duplicate addition");
assert!(
!duplicate_result2,
"Duplicate addition should still be deduplicated"
);
let final_size = queue_manager
.list_queued_transforms()
.expect("Failed to list queued transforms for final check");
assert_eq!(
final_size.len(),
5,
"Queue size should remain unchanged after duplicate attempts"
);
println!("✅ All transform queue deduplication tests passed!");
println!("📊 Final queue state: {:?}", final_size);
}
#[test]
fn test_transform_queue_deduplication_empty_state() {
let queue_manager = QueueManager::new_empty();
let transform_id = "EmptyStateTransform";
let mutation_id = "mutation-empty-1";
let result = queue_manager
.add_item(transform_id, mutation_id)
.expect("Failed to add item to empty queue");
assert!(result, "First addition to empty queue should return true");
let queued_transforms = queue_manager
.list_queued_transforms()
.expect("Failed to list queued transforms");
assert_eq!(
queued_transforms.len(),
1,
"Empty queue should have 1 item after addition"
);
let duplicate_result = queue_manager
.add_item(transform_id, mutation_id)
.expect("Failed to attempt duplicate addition");
assert!(!duplicate_result, "Duplicate addition should return false");
let final_queued_transforms = queue_manager
.list_queued_transforms()
.expect("Failed to list final queued transforms");
assert_eq!(
final_queued_transforms.len(),
1,
"Queue size should remain 1 after duplicate"
);
println!("✅ Empty state deduplication test passed!");
}
#[test]
fn test_transform_queue_key_generation() {
let queue_manager = QueueManager::new_empty();
let transform_id = "KeyTestTransform";
let mutation_id = "key-test-mutation";
let result1 = queue_manager
.add_item(transform_id, mutation_id)
.expect("Failed to add first item");
assert!(result1, "First addition should succeed");
let result2 = queue_manager
.add_item(transform_id, mutation_id)
.expect("Failed to attempt duplicate addition");
assert!(!result2, "Duplicate addition should be deduplicated");
let different_mutation = "different-mutation";
let result3 = queue_manager
.add_item(transform_id, different_mutation)
.expect("Failed to add with different mutation");
assert!(result3, "Different mutation should create new entry");
let different_transform = "DifferentTransform";
let result4 = queue_manager
.add_item(different_transform, mutation_id)
.expect("Failed to add with different transform");
assert!(result4, "Different transform should create new entry");
let queued_transforms = queue_manager
.list_queued_transforms()
.expect("Failed to list queued transforms");
assert_eq!(queued_transforms.len(), 3, "Should have 3 unique entries");
assert!(queued_transforms.contains(&transform_id.to_string()));
assert!(queued_transforms.contains(&different_transform.to_string()));
println!("✅ Key generation test passed!");
println!("📋 Final queue contents: {:?}", queued_transforms);
}
#[test]
fn test_transform_queue_deduplication_concurrent_simulation() {
let queue_manager = QueueManager::new_empty();
let transform_id = "ConcurrentTestTransform";
let mutation_id = "concurrent-mutation-123";
let mut results = Vec::new();
for i in 0..10 {
let result = queue_manager
.add_item(transform_id, mutation_id)
.unwrap_or_else(|_| panic!("Failed to add item in iteration {}", i));
results.push(result);
}
assert!(results[0], "First addition should succeed");
for (i, result) in results.iter().enumerate().skip(1) {
assert!(!(*result), "Addition {} should be deduplicated", i + 1);
}
let queued_transforms = queue_manager
.list_queued_transforms()
.expect("Failed to list queued transforms");
assert_eq!(
queued_transforms.len(),
1,
"Should have exactly 1 item despite multiple additions"
);
assert_eq!(
queued_transforms[0], transform_id,
"Queued transform should match"
);
println!("✅ Concurrent simulation test passed!");
println!("📊 Results: {:?}", results);
}