//! Test Data Management //! //! Manages test fixtures, user personas, and data isolation for UX testing use serde::{Serialize, Deserialize}; use std::path::PathBuf; use std::collections::HashMap; /// Test user persona for different user types #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TestPersona { pub email: String, pub password: String, pub name: String, pub role: UserRole, pub profile: UserProfile, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum UserRole { Consumer, Farmer, AppProvider, ServiceProvider, Admin, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct UserProfile { pub country: String, pub timezone: String, pub currency_preference: String, pub wallet_balance: f64, } /// Test marketplace data #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TestMarketplaceData { pub products: Vec, pub services: Vec, pub nodes: Vec, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TestProduct { pub id: String, pub name: String, pub category: String, pub price: f64, pub currency: String, pub description: String, pub provider_email: String, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TestService { pub id: String, pub name: String, pub description: String, pub price: f64, pub provider_email: String, pub status: String, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TestNode { pub id: String, pub farmer_email: String, pub location: String, pub specs: NodeSpecs, pub available: bool, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct NodeSpecs { pub cpu_cores: u32, pub ram_gb: u32, pub storage_gb: u32, pub price_per_hour: f64, } /// Test data manager for UX testing #[derive(Clone)] pub struct TestDataManager { test_data_dir: PathBuf, personas: HashMap, marketplace_data: TestMarketplaceData, } impl TestDataManager { /// Create a new test data manager pub fn new(test_data_dir: &PathBuf) -> Result> { let personas = Self::create_test_personas(); let marketplace_data = Self::create_test_marketplace_data(&personas); let manager = Self { test_data_dir: test_data_dir.clone(), personas, marketplace_data, }; manager.setup_test_data()?; Ok(manager) } /// Create test user personas fn create_test_personas() -> HashMap { let mut personas = HashMap::new(); personas.insert(UserRole::Consumer, TestPersona { email: "user1@example.com".to_string(), password: "testpass123".to_string(), name: "Test Consumer".to_string(), role: UserRole::Consumer, profile: UserProfile { country: "United States".to_string(), timezone: "America/New_York".to_string(), currency_preference: "USD".to_string(), wallet_balance: 100.0, }, }); personas.insert(UserRole::Farmer, TestPersona { email: "farmer1@example.com".to_string(), password: "testpass123".to_string(), name: "Test Farmer".to_string(), role: UserRole::Farmer, profile: UserProfile { country: "Canada".to_string(), timezone: "America/Toronto".to_string(), currency_preference: "CAD".to_string(), wallet_balance: 500.0, }, }); personas.insert(UserRole::AppProvider, TestPersona { email: "appdev1@example.com".to_string(), password: "testpass123".to_string(), name: "Test App Developer".to_string(), role: UserRole::AppProvider, profile: UserProfile { country: "Germany".to_string(), timezone: "Europe/Berlin".to_string(), currency_preference: "EUR".to_string(), wallet_balance: 200.0, }, }); personas.insert(UserRole::ServiceProvider, TestPersona { email: "service1@example.com".to_string(), password: "testpass123".to_string(), name: "Test Service Provider".to_string(), role: UserRole::ServiceProvider, profile: UserProfile { country: "United Kingdom".to_string(), timezone: "Europe/London".to_string(), currency_preference: "TFC".to_string(), wallet_balance: 300.0, }, }); personas } /// Create test marketplace data fn create_test_marketplace_data(personas: &HashMap) -> TestMarketplaceData { let farmer_email = personas.get(&UserRole::Farmer).unwrap().email.clone(); let application_provider_email = personas.get(&UserRole::AppProvider).unwrap().email.clone(); let service_provider_email = personas.get(&UserRole::ServiceProvider).unwrap().email.clone(); TestMarketplaceData { products: vec![ TestProduct { id: "test-vm-1".to_string(), name: "Test VM Small".to_string(), category: "compute".to_string(), price: 10.0, currency: "TFC".to_string(), description: "Small virtual machine for testing".to_string(), provider_email: farmer_email.clone(), }, TestProduct { id: "test-app-1".to_string(), name: "Test Application".to_string(), category: "applications".to_string(), price: 25.0, currency: "TFC".to_string(), description: "Test application for UX testing".to_string(), provider_email: application_provider_email.clone(), }, ], services: vec![ TestService { id: "test-service-1".to_string(), name: "Test Consulting Service".to_string(), description: "Professional consulting service for testing".to_string(), price: 100.0, provider_email: service_provider_email.clone(), status: "available".to_string(), }, ], nodes: vec![ TestNode { id: "test-node-1".to_string(), farmer_email: farmer_email.clone(), location: "New York, USA".to_string(), specs: NodeSpecs { cpu_cores: 8, ram_gb: 16, storage_gb: 500, price_per_hour: 2.0, }, available: true, }, ], } } /// Setup test data files fn setup_test_data(&self) -> Result<(), Box> { // Create test data directory std::fs::create_dir_all(&self.test_data_dir)?; // Create user data files for each persona for persona in self.personas.values() { self.create_user_data_file(persona)?; } // Save marketplace data let marketplace_file = self.test_data_dir.join("marketplace_data.json"); let marketplace_json = serde_json::to_string_pretty(&self.marketplace_data)?; std::fs::write(marketplace_file, marketplace_json)?; Ok(()) } /// Create user data file for a persona fn create_user_data_file(&self, persona: &TestPersona) -> Result<(), Box> { let encoded_email = persona.email.replace("@", "_at_").replace(".", "_dot_"); let user_file = self.test_data_dir.join(format!("{}.json", encoded_email)); let user_data = serde_json::json!({ "email": persona.email, "name": persona.name, "profile": persona.profile, "role": persona.role, "wallet": { "balance": persona.profile.wallet_balance, "currency": persona.profile.currency_preference, "transactions": [] }, "cart": { "items": [], "total": 0.0 }, "orders": [], "settings": { "notifications": { "security_alerts": true, "billing_notifications": true, "system_alerts": true, "newsletter": false, "dashboard_notifications": true }, "ssh_keys": [] } }); let user_json = serde_json::to_string_pretty(&user_data)?; std::fs::write(user_file, user_json)?; Ok(()) } /// Get test persona by role pub fn get_persona(&self, role: &UserRole) -> Option<&TestPersona> { self.personas.get(role) } /// Get all test personas pub fn get_all_personas(&self) -> &HashMap { &self.personas } /// Get test marketplace data pub fn get_marketplace_data(&self) -> &TestMarketplaceData { &self.marketplace_data } /// Reset test data to clean state pub fn reset_test_data(&self) -> Result<(), Box> { // Remove all user data files if self.test_data_dir.exists() { std::fs::remove_dir_all(&self.test_data_dir)?; } // Recreate test data self.setup_test_data()?; Ok(()) } /// Cleanup test data pub fn cleanup(&self) -> Result<(), Box> { if self.test_data_dir.exists() { std::fs::remove_dir_all(&self.test_data_dir)?; } Ok(()) } /// Get test user credentials pub fn get_test_credentials(&self, role: &UserRole) -> Option<(String, String)> { self.personas.get(role).map(|p| (p.email.clone(), p.password.clone())) } }