use reinhardt_conf::settings::audit::{
AuditBackend, AuditEvent, ChangeRecord, EventType, backends::MemoryAuditBackend,
};
use rstest::*;
use std::{collections::HashMap, sync::Arc};
#[fixture]
pub async fn audit_logger_with_test_data() -> Arc<MemoryAuditBackend> {
let backend = MemoryAuditBackend::new();
for i in 0..10000 {
let user = format!("user_{}", i % 100);
let model_name = format!("Model_{}", i % 10);
let object_id = i.to_string();
let event_type = if i % 2 == 0 {
EventType::ConfigCreate
} else {
EventType::ConfigUpdate
};
let mut changes = HashMap::new();
changes.insert(
"model".to_string(),
ChangeRecord {
old_value: None,
new_value: Some(serde_json::json!({
"name": model_name,
"id": object_id,
})),
},
);
let event = AuditEvent::new(event_type, Some(user), changes);
backend.log_event(event).await.expect("Failed to log event");
}
Arc::new(backend)
}
#[derive(Clone, Debug)]
pub struct TestAuditLogEntry {
pub user_id: String,
pub model_name: String,
pub object_id: String,
pub action: String,
pub changes: Option<serde_json::Value>,
pub timestamp: chrono::DateTime<chrono::Utc>,
}
pub fn generate_test_audit_entry(
index: usize,
user_count: usize,
model_count: usize,
) -> TestAuditLogEntry {
TestAuditLogEntry {
user_id: format!("user_{}", index % user_count),
model_name: format!("Model_{}", index % model_count),
object_id: index.to_string(),
action: if index.is_multiple_of(2) {
"Create".to_string()
} else {
"Update".to_string()
},
changes: None,
timestamp: chrono::Utc::now(),
}
}
pub fn generate_test_audit_entries(
count: usize,
user_count: usize,
model_count: usize,
) -> Vec<TestAuditLogEntry> {
(0..count)
.map(|i| generate_test_audit_entry(i, user_count, model_count))
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generate_test_audit_entry() {
let entry = generate_test_audit_entry(0, 100, 10);
assert_eq!(entry.user_id, "user_0");
assert_eq!(entry.model_name, "Model_0");
assert_eq!(entry.action, "Create");
let entry = generate_test_audit_entry(1, 100, 10);
assert_eq!(entry.user_id, "user_1");
assert_eq!(entry.model_name, "Model_1");
assert_eq!(entry.action, "Update");
let entry = generate_test_audit_entry(150, 100, 10);
assert_eq!(entry.user_id, "user_50");
assert_eq!(entry.model_name, "Model_0");
}
#[test]
fn test_generate_test_audit_entries() {
let entries = generate_test_audit_entries(10000, 100, 10);
assert_eq!(entries.len(), 10000);
let user_50_entries: Vec<_> = entries.iter().filter(|e| e.user_id == "user_50").collect();
assert_eq!(user_50_entries.len(), 100);
let model_5_entries: Vec<_> = entries
.iter()
.filter(|e| e.model_name == "Model_5")
.collect();
assert_eq!(model_5_entries.len(), 1000);
}
}