futriix/tests/cfg test mod unit tests.rs
2025-07-21 18:05:54 +00:00

159 lines
5.9 KiB
Rust

#[cfg(test)]
mod unit_tests {
use super::*;
use serde_json::json;
use std::sync::Arc;
use parking_lot::RwLock;
use std::collections::HashMap;
#[test]
fn test_index_operations() {
let indexes = Arc::new(RwLock::new(HashMap::new()));
let key = "test_key".to_string();
let value = json!({"name": "test", "age": 30});
// Создание индекса
let create_cmd = Command::CreateIndex {
field: "name".to_string(),
};
let server = create_test_server();
let response = server.process_command_internal(create_cmd);
assert!(matches!(response, Response::Success(None)));
// Проверка что индекс создан
{
let indexes = server.indexes.read();
assert!(indexes.contains_key("name"));
}
// Вставка данных для индексации
let insert_cmd = Command::Insert {
key: key.clone(),
value: value.clone(),
};
let response = server.process_command_internal(insert_cmd);
assert!(matches!(response, Response::Success(None)));
// Проверка что данные проиндексированы
{
let indexes = server.indexes.read();
let name_index = indexes.get("name").unwrap();
assert!(name_index.contains_key(&json!("test")));
assert_eq!(name_index[&json!("test")], vec!["test_key"]);
}
// Удаление индекса
let drop_cmd = Command::DropIndex {
field: "name".to_string(),
};
let response = server.process_command_internal(drop_cmd);
assert!(matches!(response, Response::Success(None)));
// Проверка что индекс удален
{
let indexes = server.indexes.read();
assert!(!indexes.contains_key("name"));
}
}
#[test]
fn test_backup_operations() {
let server = create_test_server();
let temp_path = "test_backup.json";
// Вставка тестовых данных
let insert_cmd = Command::Insert {
key: "backup_key".to_string(),
value: json!({"backup": "test"}),
};
let response = server.process_command_internal(insert_cmd);
assert!(matches!(response, Response::Success(None)));
// Создание бэкапа
let backup_cmd = Command::BackupCreate {
path: temp_path.to_string(),
};
let response = server.process_command_internal(backup_cmd);
assert!(matches!(response, Response::BackupStatus { success: true, .. }));
// Очистка базы
let delete_cmd = Command::Delete {
key: "backup_key".to_string(),
};
let response = server.process_command_internal(delete_cmd);
assert!(matches!(response, Response::Success(None)));
// Восстановление из бэкапа
let restore_cmd = Command::BackupRestore {
path: temp_path.to_string(),
};
let response = server.process_command_internal(restore_cmd);
assert!(matches!(response, Response::BackupStatus { success: true, .. }));
// Проверка что данные восстановились
let get_cmd = Command::Get {
key: "backup_key".to_string(),
version: None,
};
let response = server.process_command_internal(get_cmd);
assert!(matches!(response, Response::Success(Some(_))));
if let Response::Success(Some(value)) = response {
assert_eq!(value, json!({"backup": "test"}));
}
// Удаление временного файла
std::fs::remove_file(temp_path).unwrap();
}
#[test]
fn test_replication_commands() {
let server = create_test_server();
// Проверка статуса репликации
let status_cmd = Command::ReplicationStatus;
let response = server.process_command_internal(status_cmd);
assert!(matches!(response, Response::ReplicationStatus { .. }));
// Добавление пира
let add_peer_cmd = Command::ReplicationAddPeer {
addr: "127.0.0.1:8081".to_string(),
};
let response = server.process_command_internal(add_peer_cmd);
assert!(matches!(response, Response::Success(None)));
// Проверка что пир добавился
if let Response::ReplicationStatus { peers, .. } = server.process_command_internal(Command::ReplicationStatus) {
assert!(peers.contains(&"127.0.0.1:8081".to_string()));
}
// Удаление пира
let remove_peer_cmd = Command::ReplicationRemovePeer {
addr: "127.0.0.1:8081".to_string(),
};
let response = server.process_command_internal(remove_peer_cmd);
assert!(matches!(response, Response::Success(None)));
// Проверка что пир удалился
if let Response::ReplicationStatus { peers, .. } = server.process_command_internal(Command::ReplicationStatus) {
assert!(!peers.contains(&"127.0.0.1:8081".to_string()));
}
}
fn create_test_server() -> FutriixServer {
FutriixServer {
db: Arc::new(RwLock::new(HashMap::new())),
time_series_db: Arc::new(RwLock::new(HashMap::new())),
command_queue: Arc::new(SegQueue::new()),
transactions: Arc::new(RwLock::new(HashMap::new())),
indexes: Arc::new(RwLock::new(HashMap::new())),
replication_enabled: false,
peer_nodes: Vec::new(),
sync_interval: 1000,
last_sync_timestamp: Arc::new(RwLock::new(0)),
command_history: Arc::new(RwLock::new(Vec::new())),
next_tx_id: Arc::new(RwLock::new(1)),
}
}
}