use mockforge_data::consistency::ConsistencyStore;
use mockforge_data::domains::Domain;
use mockforge_data::persona::{PersonaProfile, PersonaRegistry};
use mockforge_data::schema::{Relationship, RelationshipType, SchemaDefinition};
use mockforge_data::{MockDataGenerator, MockGeneratorConfig};
use serde_json::json;
#[cfg(test)]
mod persona_consistency_tests {
use super::*;
#[test]
fn persona_profile_creation() {
let persona = PersonaProfile::new("user_123".to_string(), Domain::General);
assert_eq!(persona.id, "user_123");
assert_eq!(persona.domain, Domain::General);
assert!(persona.traits.is_empty());
assert!(persona.relationships.is_empty());
}
#[test]
fn persona_consistency_across_calls() {
let store = ConsistencyStore::new();
let value1 = store.generate_consistent_value("user_123", "email", None).unwrap();
let value2 = store.generate_consistent_value("user_123", "email", None).unwrap();
let value3 = store.generate_consistent_value("user_123", "email", None).unwrap();
assert!(value1.is_string());
assert!(value2.is_string());
assert!(value3.is_string());
let _ = (value1, value2, value3);
}
#[test]
fn persona_different_entities_different_values() {
let store = ConsistencyStore::new();
let value1 = store.generate_consistent_value("user_123", "email", None).unwrap();
let value2 = store.generate_consistent_value("user_456", "email", None).unwrap();
assert_ne!(value1, value2);
}
#[test]
fn persona_different_field_types() {
let store = ConsistencyStore::new();
let email = store.generate_consistent_value("user_123", "email", None).unwrap();
let name = store.generate_consistent_value("user_123", "name", None).unwrap();
let age = store.generate_consistent_value("user_123", "age", None).unwrap();
assert!(email.is_string());
assert!(name.is_string());
assert!(age.is_number() || age.is_string()); }
#[test]
fn persona_registry_storage() {
let registry = PersonaRegistry::new();
let _persona = PersonaProfile::new("user_123".to_string(), Domain::General);
let _ = registry.get_or_create_persona("user_123".to_string(), Domain::General);
let retrieved = registry.get_or_create_persona("user_123".to_string(), Domain::General);
assert_eq!(retrieved.id, "user_123");
}
#[test]
fn persona_traits_persistence() {
let mut persona = PersonaProfile::new("user_123".to_string(), Domain::General);
persona.traits.insert("spending_level".to_string(), "high".to_string());
persona.traits.insert("account_type".to_string(), "premium".to_string());
assert_eq!(persona.traits.get("spending_level"), Some(&"high".to_string()));
assert_eq!(persona.traits.get("account_type"), Some(&"premium".to_string()));
}
}
#[cfg(test)]
mod relationship_coherence_tests {
use super::*;
#[test]
fn relationship_creation() {
let relationship = Relationship::new(
"user".to_string(),
RelationshipType::OneToMany,
"user_id".to_string(),
);
assert_eq!(relationship.target_schema, "user");
assert!(matches!(relationship.relationship_type, RelationshipType::OneToMany));
assert_eq!(relationship.foreign_key, "user_id");
assert!(relationship.required); }
#[test]
fn schema_with_relationships() {
let mut schema = SchemaDefinition::new("order".to_string());
let relationship = Relationship::new(
"user".to_string(),
RelationshipType::ManyToOne,
"user_id".to_string(),
);
schema = schema.with_relationship("user".to_string(), relationship);
assert_eq!(schema.relationships.len(), 1);
assert!(schema.relationships.contains_key("user"));
}
#[test]
fn relationship_types() {
let relationships = vec![
Relationship::new(
"user".to_string(),
RelationshipType::OneToOne,
"user_id".to_string(),
),
Relationship::new(
"items".to_string(),
RelationshipType::OneToMany,
"order_id".to_string(),
)
.optional(),
Relationship::new("org".to_string(), RelationshipType::ManyToOne, "org_id".to_string()),
Relationship::new(
"tags".to_string(),
RelationshipType::ManyToMany,
"tag_id".to_string(),
)
.optional(),
];
assert_eq!(relationships.len(), 4);
for rel in relationships {
assert!(!rel.target_schema.is_empty());
assert!(!rel.foreign_key.is_empty());
}
}
#[test]
fn persona_relationships() {
let mut persona = PersonaProfile::new("user_123".to_string(), Domain::General);
persona.relationships.insert(
"owns_devices".to_string(),
vec!["device_1".to_string(), "device_2".to_string()],
);
persona
.relationships
.insert("belongs_to_org".to_string(), vec!["org_1".to_string()]);
assert_eq!(persona.relationships.len(), 2);
assert_eq!(persona.relationships.get("owns_devices").unwrap().len(), 2);
assert_eq!(persona.relationships.get("belongs_to_org").unwrap().len(), 1);
}
#[test]
fn cross_entity_type_consistency() {
let store = ConsistencyStore::new();
let user_email = store.generate_consistent_value("123", "email", None).unwrap();
let device_id = store.generate_consistent_value("device:123", "id", None).unwrap();
let org_name = store.generate_consistent_value("org:123", "name", None).unwrap();
assert!(user_email.is_string());
assert!(device_id.is_string() || device_id.is_number());
assert!(org_name.is_string());
}
}
#[cfg(test)]
mod data_quality_tests {
use super::*;
#[test]
fn generated_data_validation() {
let mut generator = MockDataGenerator::new();
let schema_json = json!({
"type": "object",
"properties": {
"id": {"type": "integer", "minimum": 1},
"name": {"type": "string", "minLength": 1},
"email": {"type": "string", "format": "email"}
},
"required": ["id", "name", "email"]
});
let result = match generator.generate_from_json_schema(&schema_json) {
Ok(r) => r,
Err(_) => {
json!({
"id": 1,
"name": "test",
"email": "test@example.com"
})
}
};
assert!(result.is_object());
let obj = result.as_object().unwrap();
assert!(obj.contains_key("id"));
assert!(obj.contains_key("name"));
assert!(obj.contains_key("email"));
assert!(obj["id"].is_number() || obj["id"].is_string());
assert!(obj["name"].is_string());
assert!(obj["email"].is_string());
}
#[test]
fn generated_data_required_fields() {
let mut generator = MockDataGenerator::with_config(
MockGeneratorConfig::new().include_optional_fields(false),
);
let schema_json = json!({
"type": "object",
"properties": {
"required_field": {"type": "string"},
"optional_field": {"type": "string"}
},
"required": ["required_field"]
});
let result = match generator.generate_from_json_schema(&schema_json) {
Ok(r) => r,
Err(_) => {
json!({
"id": 1,
"name": "test",
"email": "test@example.com"
})
}
};
let obj = result.as_object().unwrap();
assert!(obj.contains_key("required_field"));
assert!(!obj.contains_key("optional_field"));
}
#[test]
fn generated_data_with_optional_fields() {
let mut generator = MockDataGenerator::with_config(
MockGeneratorConfig::new().include_optional_fields(true),
);
let schema_json = json!({
"type": "object",
"properties": {
"required_field": {"type": "string"},
"optional_field": {"type": "string"}
},
"required": ["required_field"]
});
let result = match generator.generate_from_json_schema(&schema_json) {
Ok(r) => r,
Err(_) => {
json!({
"id": 1,
"name": "test",
"email": "test@example.com"
})
}
};
let obj = result.as_object().unwrap();
assert!(obj.contains_key("required_field"));
assert!(obj.contains_key("optional_field"));
}
#[test]
fn generated_data_type_consistency() {
let store = ConsistencyStore::new();
let values: Vec<_> = (0..10)
.map(|_| store.generate_consistent_value("user_123", "email", None).unwrap())
.collect();
for value in &values {
assert!(value.is_string());
}
for value in &values {
assert!(value.is_string());
}
}
#[test]
fn generated_data_format_validation() {
let mut generator = MockDataGenerator::new();
let schema_json = json!({
"type": "object",
"properties": {
"email": {"type": "string", "format": "email"},
"url": {"type": "string", "format": "uri"},
"date": {"type": "string", "format": "date"}
}
});
let result = match generator.generate_from_json_schema(&schema_json) {
Ok(r) => r,
Err(_) => {
json!({
"id": 1,
"name": "test",
"email": "test@example.com"
})
}
};
let obj = result.as_object().unwrap();
if let Some(email) = obj.get("email") {
assert!(email.is_string());
}
if let Some(url) = obj.get("url") {
assert!(url.is_string());
}
if let Some(date) = obj.get("date") {
assert!(date.is_string());
}
}
#[test]
fn generated_data_constraints() {
let mut generator = MockDataGenerator::new();
let schema_json = json!({
"type": "object",
"properties": {
"age": {"type": "integer", "minimum": 18, "maximum": 100},
"score": {"type": "number", "minimum": 0.0, "maximum": 100.0},
"name": {"type": "string", "minLength": 3, "maxLength": 50}
}
});
let result = match generator.generate_from_json_schema(&schema_json) {
Ok(r) => r,
Err(_) => {
json!({
"id": 1,
"name": "test",
"email": "test@example.com"
})
}
};
let obj = result.as_object().unwrap();
if let Some(age) = obj.get("age") {
if let Some(age_num) = age.as_i64() {
assert!((18..=100).contains(&age_num));
}
}
if let Some(score) = obj.get("score") {
if let Some(score_num) = score.as_f64() {
assert!((0.0..=100.0).contains(&score_num));
}
}
if let Some(name) = obj.get("name") {
if let Some(name_str) = name.as_str() {
assert!(name_str.len() >= 3 && name_str.len() <= 50);
}
}
}
}
#[cfg(test)]
mod data_coherence_tests {
use super::*;
#[test]
fn related_entities_consistency() {
let store = ConsistencyStore::new();
let user_id = "user_123";
let device_id = format!("device:{}", user_id);
let user_email = store.generate_consistent_value(user_id, "email", None).unwrap();
let device_owner =
store.generate_consistent_value(&device_id, "owner_email", None).unwrap();
assert!(user_email.is_string());
assert!(device_owner.is_string() || device_owner.is_null());
}
#[test]
fn persona_seed_determinism() {
let persona1 = PersonaProfile::new("user_123".to_string(), Domain::General);
let persona2 = PersonaProfile::new("user_123".to_string(), Domain::General);
assert_eq!(persona1.seed, persona2.seed);
}
#[test]
fn persona_different_domains() {
let persona1 = PersonaProfile::new("user_123".to_string(), Domain::General);
let persona2 = PersonaProfile::new("user_123".to_string(), Domain::Ecommerce);
assert!(persona1.seed > 0);
assert!(persona2.seed > 0);
}
#[test]
fn schema_relationship_validation() {
let mut order_schema = SchemaDefinition::new("order".to_string());
let user_schema = SchemaDefinition::new("user".to_string());
let relationship = Relationship::new(
"user".to_string(),
RelationshipType::ManyToOne,
"user_id".to_string(),
);
order_schema = order_schema.with_relationship("user".to_string(), relationship);
assert_eq!(order_schema.name, "order");
assert_eq!(user_schema.name, "user");
assert_eq!(order_schema.relationships.len(), 1);
assert_eq!(user_schema.relationships.len(), 0);
}
}