#[cfg(test)]
mod tests {
use crate::consistency::ConsistencyStore;
use crate::domains::Domain;
use crate::mock_generator::{MockDataGenerator, MockGeneratorConfig};
use crate::persona::{PersonaProfile, PersonaRegistry};
use crate::persona_templates::PersonaTemplateRegistry;
use crate::schema::SchemaDefinition;
use serde_json::json;
#[test]
fn test_same_user_id_consistency() {
let store = ConsistencyStore::with_default_domain(Domain::Finance);
let user_id = "user123";
let amount1 = store.generate_consistent_value(user_id, "amount", None).unwrap();
let amount2 = store.generate_consistent_value(user_id, "amount", None).unwrap();
let amount3 = store.generate_consistent_value(user_id, "amount", None).unwrap();
assert!(amount1.is_string() || amount1.is_number());
assert!(amount2.is_string() || amount2.is_number());
assert!(amount3.is_string() || amount3.is_number());
let persona = store.get_entity_persona(user_id, None);
assert_eq!(persona.id, user_id);
assert_eq!(persona.domain, Domain::Finance);
}
#[test]
fn test_different_user_ids_different_patterns() {
let store = ConsistencyStore::with_default_domain(Domain::Finance);
let user1_id = "user123";
let user2_id = "user456";
let user1_persona = store.get_entity_persona(user1_id, None);
let user2_persona = store.get_entity_persona(user2_id, None);
assert_ne!(user1_persona.seed, user2_persona.seed);
assert_ne!(user1_persona.id, user2_persona.id);
}
#[test]
fn test_finance_persona_banking_data() {
let store = ConsistencyStore::with_default_domain(Domain::Finance);
let user_id = "banking_user_001";
let account_number =
store.generate_consistent_value(user_id, "account_number", None).unwrap();
let routing_number =
store.generate_consistent_value(user_id, "routing_number", None).unwrap();
let amount = store.generate_consistent_value(user_id, "amount", None).unwrap();
let currency = store.generate_consistent_value(user_id, "currency", None).unwrap();
let transaction_id =
store.generate_consistent_value(user_id, "transaction_id", None).unwrap();
if let Some(acc_str) = account_number.as_str() {
assert!(acc_str.starts_with("ACC"), "Account number should start with ACC");
}
assert!(routing_number.is_string(), "Routing number should be a string");
assert!(amount.is_number() || amount.is_string(), "Amount should be a number or string");
if let Some(currency_str) = currency.as_str() {
let valid_currencies = ["USD", "EUR", "GBP", "JPY", "CNY"];
assert!(
valid_currencies.contains(¤cy_str),
"Currency should be one of: {:?}",
valid_currencies
);
}
if let Some(txn_str) = transaction_id.as_str() {
assert!(txn_str.starts_with("TXN"), "Transaction ID should start with TXN");
}
}
#[test]
fn test_persona_traits_influence_generation() {
let _registry = PersonaRegistry::new();
let mut high_spender = PersonaProfile::new("high_spender".to_string(), Domain::Finance);
high_spender.set_trait("spending_level".to_string(), "high".to_string());
let mut conservative =
PersonaProfile::new("conservative_spender".to_string(), Domain::Finance);
conservative.set_trait("spending_level".to_string(), "conservative".to_string());
let generator = crate::persona::PersonaGenerator::new(Domain::Finance);
let high_amount = generator.generate_for_persona(&high_spender, "amount").unwrap();
let conservative_amount = generator.generate_for_persona(&conservative, "amount").unwrap();
assert!(high_amount.is_string() || high_amount.is_number());
assert!(conservative_amount.is_string() || conservative_amount.is_number());
if let (Some(high_val), Some(conservative_val)) =
(high_amount.as_f64(), conservative_amount.as_f64())
{
assert!(high_val >= 0.0);
assert!(conservative_val >= 0.0);
}
}
#[test]
fn test_persona_templates_generate_traits() {
let template_registry = PersonaTemplateRegistry::new();
let mut persona = PersonaProfile::new("template_user".to_string(), Domain::Finance);
template_registry.apply_template_to_persona(&mut persona).unwrap();
assert!(persona.get_trait("account_type").is_some());
assert!(persona.get_trait("spending_level").is_some());
assert!(persona.get_trait("transaction_frequency").is_some());
assert!(persona.get_trait("preferred_currency").is_some());
let account_type = persona.get_trait("account_type").unwrap();
let valid_account_types = ["checking", "savings", "premium", "business"];
assert!(
valid_account_types.contains(&account_type.as_str()),
"Account type should be one of: {:?}",
valid_account_types
);
let spending_level = persona.get_trait("spending_level").unwrap();
let valid_spending_levels = ["conservative", "moderate", "high"];
assert!(
valid_spending_levels.contains(&spending_level.as_str()),
"Spending level should be one of: {:?}",
valid_spending_levels
);
}
#[test]
fn test_ecommerce_persona_data() {
let store = ConsistencyStore::with_default_domain(Domain::Ecommerce);
let customer_id = "customer_001";
let order_id = store.generate_consistent_value(customer_id, "order_id", None).unwrap();
let product_id = store.generate_consistent_value(customer_id, "product_id", None).unwrap();
let price = store.generate_consistent_value(customer_id, "price", None).unwrap();
let order_status =
store.generate_consistent_value(customer_id, "order_status", None).unwrap();
if let Some(order_str) = order_id.as_str() {
assert!(order_str.starts_with("ORD-"), "Order ID should start with ORD-");
}
if let Some(product_str) = product_id.as_str() {
assert!(product_str.starts_with("SKU"), "Product ID should start with SKU");
}
assert!(price.is_number(), "Price should be a number");
if let Some(status_str) = order_status.as_str() {
let valid_statuses = ["pending", "processing", "shipped", "delivered"];
assert!(
valid_statuses.contains(&status_str),
"Order status should be one of: {:?}",
valid_statuses
);
}
}
#[test]
fn test_healthcare_persona_data() {
let store = ConsistencyStore::with_default_domain(Domain::Healthcare);
let patient_id = "patient_001";
let patient_id_field =
store.generate_consistent_value(patient_id, "patient_id", None).unwrap();
let mrn = store.generate_consistent_value(patient_id, "mrn", None).unwrap();
let blood_pressure =
store.generate_consistent_value(patient_id, "blood_pressure", None).unwrap();
let heart_rate = store.generate_consistent_value(patient_id, "heart_rate", None).unwrap();
if let Some(patient_str) = patient_id_field.as_str() {
assert!(patient_str.starts_with("P"), "Patient ID should start with P");
}
if let Some(mrn_str) = mrn.as_str() {
assert!(mrn_str.starts_with("MRN"), "MRN should start with MRN");
}
if let Some(bp_str) = blood_pressure.as_str() {
assert!(bp_str.contains("/"), "Blood pressure should be in format 'XXX/YYY'");
}
if let Some(hr) = heart_rate.as_u64() {
assert!((60..=100).contains(&hr), "Heart rate should be between 60 and 100");
}
}
#[test]
fn test_mock_generator_with_persona() {
let config = MockGeneratorConfig::new();
let mut generator = MockDataGenerator::with_persona_support(config, Some(Domain::Finance));
let mut schema = SchemaDefinition::new("TestSchema".to_string());
schema
.fields
.push(crate::schema::FieldDefinition::new("user_id".to_string(), "string".to_string()));
schema
.fields
.push(crate::schema::FieldDefinition::new("amount".to_string(), "string".to_string()));
schema.fields.push(crate::schema::FieldDefinition::new(
"currency".to_string(),
"string".to_string(),
));
let user_id = "test_user_123";
let result = generator.generate_with_persona(user_id, Domain::Finance, &schema).unwrap();
assert!(result.is_object());
let obj = result.as_object().unwrap();
assert!(obj.contains_key("user_id"));
assert!(obj.contains_key("amount"));
assert!(obj.contains_key("currency"));
let _result2 = generator.generate_with_persona(user_id, Domain::Finance, &schema).unwrap();
let persona1 = generator
.consistency_store()
.unwrap()
.get_entity_persona(user_id, Some(Domain::Finance));
let persona2 = generator
.consistency_store()
.unwrap()
.get_entity_persona(user_id, Some(Domain::Finance));
assert_eq!(persona1.seed, persona2.seed);
}
#[test]
fn test_multi_domain_consistency() {
let finance_store = ConsistencyStore::with_default_domain(Domain::Finance);
let finance_user = finance_store.get_entity_persona("user123", None);
assert_eq!(finance_user.domain, Domain::Finance);
let ecommerce_store = ConsistencyStore::with_default_domain(Domain::Ecommerce);
let ecommerce_user = ecommerce_store.get_entity_persona("user123", None);
assert_eq!(ecommerce_user.domain, Domain::Ecommerce);
assert_ne!(finance_user.seed, ecommerce_user.seed);
}
#[test]
fn test_persona_registry_persistence() {
let registry = PersonaRegistry::new();
let persona1 = registry.get_or_create_persona("user1".to_string(), Domain::Finance);
let _persona2 = registry.get_or_create_persona("user2".to_string(), Domain::Ecommerce);
let _persona3 = registry.get_or_create_persona("user3".to_string(), Domain::Healthcare);
assert_eq!(registry.count(), 3);
let retrieved1 = registry.get_persona("user1").unwrap();
assert_eq!(retrieved1.id, persona1.id);
assert_eq!(retrieved1.seed, persona1.seed);
let mut traits = std::collections::HashMap::new();
traits.insert("spending_level".to_string(), "high".to_string());
registry.update_persona("user1", traits).unwrap();
let updated = registry.get_persona("user1").unwrap();
assert_eq!(updated.get_trait("spending_level"), Some(&"high".to_string()));
}
#[test]
fn test_entity_id_extraction() {
use crate::consistency::EntityIdExtractor;
use serde_json::json;
assert_eq!(EntityIdExtractor::from_field_name("user_id"), Some("user_id".to_string()));
assert_eq!(EntityIdExtractor::from_field_name("deviceId"), Some("deviceId".to_string()));
assert_eq!(EntityIdExtractor::from_path_id_only("/users/12345"), Some("12345".to_string()));
assert_eq!(
EntityIdExtractor::from_path_id_only("/devices/abc-123"),
Some("abc-123".to_string())
);
let json = json!({
"user_id": "user123",
"name": "John Doe"
});
assert_eq!(EntityIdExtractor::from_json_value(&json), Some("user123".to_string()));
let id = EntityIdExtractor::from_multiple_sources(
Some("user_id"),
Some("/api/users/123"),
Some(&json),
);
assert_eq!(id, Some("user_id".to_string()));
}
}