use ri::queue::{RiQueueMessage, RiQueue, RiQueueConfig, QueueBackendType, RiQueueManager, RiQueueModule};
use ri::queue::backends::RiMemoryQueue;
#[test]
fn test_queue_message_new() {
let payload = b"test_payload".to_vec();
let message = RiQueueMessage::new(payload.clone());
assert!(!message.id.is_empty());
assert_eq!(message.payload, payload);
assert!(message.headers.is_empty());
assert_eq!(message.retry_count, 0);
assert_eq!(message.max_retries, 3);
}
#[test]
fn test_queue_message_with_headers() {
let payload = b"test_payload".to_vec();
let mut headers = std::collections::HashMap::new();
headers.insert("key1".to_string(), "value1".to_string());
headers.insert("key2".to_string(), "value2".to_string());
let message = RiQueueMessage::new(payload.clone())
.with_headers(headers.clone());
assert_eq!(message.headers, headers);
}
#[test]
fn test_queue_message_with_max_retries() {
let payload = b"test_payload".to_vec();
let message = RiQueueMessage::new(payload.clone())
.with_max_retries(5);
assert_eq!(message.max_retries, 5);
}
#[test]
fn test_queue_message_retry() {
let payload = b"test_payload".to_vec();
let mut message = RiQueueMessage::new(payload.clone())
.with_max_retries(3);
assert_eq!(message.retry_count, 0);
assert!(message.can_retry());
message.increment_retry();
assert_eq!(message.retry_count, 1);
assert!(message.can_retry());
message.increment_retry();
message.increment_retry();
assert_eq!(message.retry_count, 3);
assert!(!message.can_retry());
}
#[tokio::test]
async fn test_memory_queue_create_producer() {
let queue = RiMemoryQueue::new("test_queue");
let producer = queue.create_producer().await.unwrap();
let message = RiQueueMessage::new(b"test_payload".to_vec());
producer.send(message).await.unwrap();
}
#[tokio::test]
async fn test_memory_queue_create_consumer() {
let queue = RiMemoryQueue::new("test_queue");
let consumer = queue.create_consumer("test_consumer_group").await.unwrap();
let result = consumer.receive().await.unwrap();
assert!(result.is_none()); }
#[tokio::test]
async fn test_memory_queue_send_receive() {
let queue = RiMemoryQueue::new("test_queue");
let producer = queue.create_producer().await.unwrap();
let consumer = queue.create_consumer("test_consumer_group").await.unwrap();
let payload = b"test_payload".to_vec();
let message = RiQueueMessage::new(payload.clone());
producer.send(message.clone()).await.unwrap();
let received = consumer.receive().await.unwrap();
assert!(received.is_some());
if let Some(received_message) = received {
assert_eq!(received_message.payload, payload);
consumer.ack(&received_message.id).await.unwrap();
}
}
#[tokio::test]
async fn test_memory_queue_send_batch() {
let queue = RiMemoryQueue::new("test_queue");
let producer = queue.create_producer().await.unwrap();
let messages = vec![
RiQueueMessage::new(b"payload1".to_vec()),
RiQueueMessage::new(b"payload2".to_vec()),
RiQueueMessage::new(b"payload3".to_vec()),
];
producer.send_batch(messages).await.unwrap();
let stats = queue.get_stats().await.unwrap();
assert_eq!(stats.message_count, 3);
}
#[tokio::test]
async fn test_memory_queue_get_stats() {
let queue = RiMemoryQueue::new("test_queue");
let stats = queue.get_stats().await.unwrap();
assert_eq!(stats.queue_name, "test_queue");
assert_eq!(stats.message_count, 0);
assert_eq!(stats.consumer_count, 0);
assert_eq!(stats.producer_count, 1);
}
#[tokio::test]
async fn test_memory_queue_purge() {
let queue = RiMemoryQueue::new("test_queue");
let producer = queue.create_producer().await.unwrap();
let message = RiQueueMessage::new(b"test_payload".to_vec());
producer.send(message).await.unwrap();
let stats_before = queue.get_stats().await.unwrap();
assert_eq!(stats_before.message_count, 1);
queue.purge().await.unwrap();
let stats_after = queue.get_stats().await.unwrap();
assert_eq!(stats_after.message_count, 0);
}
#[tokio::test]
async fn test_memory_queue_delete() {
let queue = RiMemoryQueue::new("test_queue");
let producer = queue.create_producer().await.unwrap();
let message = RiQueueMessage::new(b"test_payload".to_vec());
producer.send(message).await.unwrap();
queue.delete().await.unwrap();
let stats = queue.get_stats().await.unwrap();
assert_eq!(stats.message_count, 0);
}
#[tokio::test]
async fn test_memory_queue_consumer_pause_resume() {
let queue = RiMemoryQueue::new("test_queue");
let producer = queue.create_producer().await.unwrap();
let consumer = queue.create_consumer("test_consumer_group").await.unwrap();
let message = RiQueueMessage::new(b"test_payload".to_vec());
producer.send(message).await.unwrap();
consumer.pause().await.unwrap();
let result = consumer.receive().await.unwrap();
assert!(result.is_none());
consumer.resume().await.unwrap();
let result = consumer.receive().await.unwrap();
assert!(result.is_some());
}
#[tokio::test]
async fn test_queue_manager_new() {
let config = RiQueueConfig::default();
let queue_manager = RiQueueManager::new(config).await.unwrap();
queue_manager.init().await.unwrap();
queue_manager.shutdown().await.unwrap();
}
#[tokio::test]
async fn test_queue_manager_create_queue() {
let config = RiQueueConfig::default();
let queue_manager = RiQueueManager::new(config).await.unwrap();
let queue = queue_manager.create_queue("test_queue").await.unwrap();
let producer = queue.create_producer().await.unwrap();
let message = RiQueueMessage::new(b"test_payload".to_vec());
producer.send(message).await.unwrap();
}
#[tokio::test]
async fn test_queue_manager_get_queue() {
let config = RiQueueConfig::default();
let queue_manager = RiQueueManager::new(config).await.unwrap();
queue_manager.create_queue("test_queue").await.unwrap();
let queue = queue_manager.get_queue("test_queue").await;
assert!(queue.is_some());
let non_existent_queue = queue_manager.get_queue("non_existent_queue").await;
assert!(non_existent_queue.is_none());
}
#[tokio::test]
async fn test_queue_manager_list_queues() {
let config = RiQueueConfig::default();
let queue_manager = RiQueueManager::new(config).await.unwrap();
let queues = queue_manager.list_queues().await;
assert!(queues.is_empty());
queue_manager.create_queue("test_queue1").await.unwrap();
queue_manager.create_queue("test_queue2").await.unwrap();
queue_manager.create_queue("test_queue3").await.unwrap();
let queues = queue_manager.list_queues().await;
assert_eq!(queues.len(), 3);
assert!(queues.contains(&"test_queue1".to_string()));
assert!(queues.contains(&"test_queue2".to_string()));
assert!(queues.contains(&"test_queue3".to_string()));
}
#[tokio::test]
async fn test_queue_manager_delete_queue() {
let config = RiQueueConfig::default();
let queue_manager = RiQueueManager::new(config).await.unwrap();
queue_manager.create_queue("test_queue").await.unwrap();
queue_manager.delete_queue("test_queue").await.unwrap();
let queues = queue_manager.list_queues().await;
assert!(!queues.contains(&"test_queue".to_string()));
}
#[tokio::test]
async fn test_queue_module_new() {
let config = RiQueueConfig::default();
let queue_module = RiQueueModule::new(config).await.unwrap();
let queue_manager = queue_module.queue_manager();
queue_manager.create_queue("test_queue").await.unwrap();
}
#[tokio::test]
async fn test_queue_config_default() {
let config = RiQueueConfig::default();
assert!(config.enabled);
assert_eq!(config.backend_type, QueueBackendType::Memory);
assert_eq!(config.connection_string, "memory://localhost");
assert_eq!(config.max_connections, 10);
assert_eq!(config.message_max_size, 1024 * 1024);
assert_eq!(config.consumer_timeout_ms, 30000);
assert_eq!(config.producer_timeout_ms, 5000);
assert_eq!(config.retry_policy.max_retries, 3);
assert_eq!(config.retry_policy.initial_delay_ms, 1000);
assert_eq!(config.retry_policy.max_delay_ms, 60000);
assert_eq!(config.retry_policy.backoff_multiplier, 2.0);
assert!(config.dead_letter_config.is_none());
}
#[tokio::test]
async fn test_queue_backend_type_from_str() {
assert_eq!("memory".parse::<QueueBackendType>().unwrap(), QueueBackendType::Memory);
assert_eq!("rabbitmq".parse::<QueueBackendType>().unwrap(), QueueBackendType::RabbitMQ);
assert_eq!("kafka".parse::<QueueBackendType>().unwrap(), QueueBackendType::Kafka);
assert_eq!("redis".parse::<QueueBackendType>().unwrap(), QueueBackendType::Redis);
assert!("invalid".parse::<QueueBackendType>().is_err());
}