use v_storage::*;
use v_individual_model::onto::individual::Individual;
#[test]
fn test_cross_storage_compatibility() {
let data_sets = vec![
("memory1", "value1"),
("memory2", "value2"),
("memory3", "value3"),
];
let dynamic_storage = VStorage::builder().memory().build().unwrap();
let mut dynamic_storage = VStorage::new(dynamic_storage);
let mut generic_storage = VMemoryStorage::new(memory_storage::MemoryStorage::new());
let mut enum_storage = VStorageEnum::memory();
for (key, value) in &data_sets {
assert!(dynamic_storage.put_value(StorageId::Individuals, key, value).is_ok());
assert!(generic_storage.put_value(StorageId::Individuals, key, value).is_ok());
assert!(enum_storage.put_value(StorageId::Individuals, key, value).is_ok());
}
for (key, expected_value) in &data_sets {
let dynamic_result = dynamic_storage.get_value(StorageId::Individuals, key);
let generic_result = generic_storage.get_value(StorageId::Individuals, key);
let enum_result = enum_storage.get_value(StorageId::Individuals, key);
assert!(dynamic_result.is_ok(), "Dynamic storage failed for key: {}", key);
assert!(generic_result.is_ok(), "Generic storage failed for key: {}", key);
assert!(enum_result.is_ok(), "Enum storage failed for key: {}", key);
if let (StorageResult::Ok(val1), StorageResult::Ok(val2), StorageResult::Ok(val3)) =
(dynamic_result, generic_result, enum_result) {
assert_eq!(val1, *expected_value);
assert_eq!(val2, *expected_value);
assert_eq!(val3, *expected_value);
}
}
}
#[test]
fn test_storage_factory_pattern() {
let builder_storage = StorageBuilder::new()
.memory()
.build();
assert!(builder_storage.is_ok(), "Builder pattern failed");
let mut provider_storage = StorageProvider::memory();
#[allow(deprecated)]
{
assert!(!provider_storage.get_v(StorageId::Individuals, "nonexistent").is_some());
}
let config_storage = VStorage::from_config(StorageConfig::Memory);
assert!(config_storage.is_ok(), "Config pattern failed");
let generic_memory = StorageBuilder::new()
.memory()
.build_memory_generic();
assert!(generic_memory.is_ok(), "Generic memory builder failed");
}
#[test]
fn test_all_storage_types_operations() {
let storage_types = vec![
StorageId::Individuals,
StorageId::Tickets,
StorageId::Az,
];
let mut storage = VStorageEnum::memory();
for storage_type in storage_types {
let key = format!("test_key_{:?}", storage_type);
let value = format!("test_value_{:?}", storage_type);
assert!(storage.put_value(storage_type.clone(), &key, &value).is_ok());
let get_result = storage.get_value(storage_type.clone(), &key);
assert!(get_result.is_ok(), "Get failed for storage type: {:?}", storage_type);
if let StorageResult::Ok(retrieved_value) = get_result {
assert_eq!(retrieved_value, value);
}
let count_result = storage.count(storage_type.clone());
assert!(count_result.is_ok(), "Count failed for storage type: {:?}", storage_type);
let raw_data = value.as_bytes().to_vec();
let raw_key = format!("{}_raw", key);
assert!(storage.put_raw_value(storage_type.clone(), &raw_key, raw_data.clone()).is_ok());
let raw_get_result = storage.get_raw_value(storage_type.clone(), &raw_key);
assert!(raw_get_result.is_ok(), "Raw get failed for storage type: {:?}", storage_type);
if let StorageResult::Ok(retrieved_raw) = raw_get_result {
assert_eq!(retrieved_raw, raw_data);
}
assert!(storage.remove_value(storage_type.clone(), &key).is_ok());
let removed_get_result = storage.get_value(storage_type, &key);
assert_eq!(removed_get_result, StorageResult::NotFound, "Key should be removed");
}
}
#[test]
fn test_individual_workflow() {
let mut storage = VMemoryStorage::new(memory_storage::MemoryStorage::new());
let mut individual = Individual::default();
let test_cases = vec![
(
"simple_individual",
r#"{"@": "test:simple", "rdf:type": [{"type": "Uri", "data": "test:Person"}]}"#
),
(
"complex_individual",
r#"{"@": "test:complex", "rdf:type": [{"type": "Uri", "data": "test:Organization"}], "rdfs:label": [{"type": "String", "data": "Test Organization"}]}"#
),
];
for (id, data) in test_cases {
let put_result = storage.put_value(StorageId::Individuals, id, data);
assert!(put_result.is_ok(), "Failed to put individual: {}", id);
let get_individual_result = storage.get_individual_from_storage(StorageId::Individuals, id, &mut individual);
assert!(get_individual_result == StorageResult::Ok(()) || get_individual_result == StorageResult::UnprocessableEntity,
"Unexpected result for individual {}: {:?}", id, get_individual_result);
let get_string_result = storage.get_value(StorageId::Individuals, id);
assert!(get_string_result.is_ok(), "Failed to get individual as string: {}", id);
if let StorageResult::Ok(retrieved_data) = get_string_result {
assert_eq!(retrieved_data, data);
}
}
let invalid_data = "this is not json";
assert!(storage.put_value(StorageId::Individuals, "invalid", invalid_data).is_ok());
let invalid_individual_result = storage.get_individual_from_storage(StorageId::Individuals, "invalid", &mut individual);
assert_eq!(invalid_individual_result, StorageResult::UnprocessableEntity, "Invalid data should return UnprocessableEntity");
}
#[test]
fn test_error_conditions() {
let mut empty_storage = VStorageEnum::default();
let mut individual = Individual::default();
assert_eq!(empty_storage.get_value(StorageId::Individuals, "any"), StorageResult::NotReady);
assert_eq!(empty_storage.put_value(StorageId::Individuals, "any", "value"), StorageResult::NotReady);
assert_eq!(empty_storage.remove_value(StorageId::Individuals, "any"), StorageResult::NotReady);
assert_eq!(empty_storage.count(StorageId::Individuals), StorageResult::NotReady);
assert_eq!(empty_storage.get_individual(StorageId::Individuals, "any", &mut individual), StorageResult::NotReady);
let mut memory_storage = VStorageEnum::memory();
assert_eq!(memory_storage.get_value(StorageId::Individuals, "nonexistent"), StorageResult::NotFound);
assert_eq!(memory_storage.remove_value(StorageId::Individuals, "nonexistent"), StorageResult::NotFound);
assert_eq!(memory_storage.get_individual(StorageId::Individuals, "nonexistent", &mut individual), StorageResult::NotFound);
assert!(memory_storage.put_value(StorageId::Individuals, "", "empty_key").is_ok());
assert!(memory_storage.put_value(StorageId::Individuals, "empty_value", "").is_ok());
let empty_key_result = memory_storage.get_value(StorageId::Individuals, "");
assert!(empty_key_result.is_ok());
let empty_value_result = memory_storage.get_value(StorageId::Individuals, "empty_value");
assert!(empty_value_result.is_ok());
if let StorageResult::Ok(value) = empty_value_result {
assert_eq!(value, "");
}
}
#[test]
fn test_backward_compatibility_integration() {
let storage = VStorage::builder().memory().build().unwrap();
let mut storage = VStorage::new(storage);
assert!(storage.put_value(StorageId::Individuals, "new_api_key", "new_api_value").is_ok());
#[allow(deprecated)]
{
let old_result = storage.get_v(StorageId::Individuals, "new_api_key");
assert_eq!(old_result, Some("new_api_value".to_string()));
assert!(storage.put_kv(StorageId::Individuals, "old_api_key", "old_api_value"));
let new_result = storage.get_value(StorageId::Individuals, "old_api_key");
assert!(new_result.is_ok());
if let StorageResult::Ok(value) = new_result {
assert_eq!(value, "old_api_value");
}
}
}
#[test]
fn test_memory_storage_individual_operations() {
let mut storage = MemoryStorage::new();
let mut individual = Individual::default();
assert_eq!(storage.get_individual(StorageId::Individuals, "non-existent", &mut individual), StorageResult::NotFound);
let valid_data = r#"{"@":"individual","@id":"test:individual","v-s:hasValue":[{"data":"test_value","type":"_string"}]}"#;
assert!(storage.put_value(StorageId::Individuals, "test:individual", valid_data).is_ok());
let get_individual_result = storage.get_individual(StorageId::Individuals, "test:individual", &mut individual);
assert!(get_individual_result == StorageResult::Ok(()) || get_individual_result == StorageResult::UnprocessableEntity,
"Expected Ok or UnprocessableEntity, got: {:?}", get_individual_result);
let invalid_data = "invalid json data";
assert!(storage.put_value(StorageId::Individuals, "test:invalid", invalid_data).is_ok());
let invalid_individual_result = storage.get_individual(StorageId::Individuals, "test:invalid", &mut individual);
assert_eq!(invalid_individual_result, StorageResult::UnprocessableEntity, "Invalid data should return UnprocessableEntity");
}
#[test]
fn test_empty_storage_behavior() {
let mut empty_storage = VStorage::none();
let mut individual = Individual::default();
assert_eq!(empty_storage.get_individual("any", &mut individual), StorageResult::NotReady);
let mut memory_storage = VStorage::new(Box::new(MemoryStorage::new()));
assert_eq!(memory_storage.get_individual("nonexistent", &mut individual), StorageResult::NotFound);
}