//! Test Environment Management //! //! Handles isolated test environment setup including: //! - Test server instance //! - Browser automation //! - Test data management //! - API client for validation pub mod browser_manager; pub mod test_server; pub mod test_data_manager; pub mod api_client; pub use browser_manager::*; pub use test_server::*; pub use test_data_manager::*; pub use api_client::*; use std::path::PathBuf; use tokio::time::Duration; /// Configuration for UX test environment #[derive(Debug, Clone)] pub struct UXTestConfig { pub test_port: u16, pub headless: bool, pub timeout_seconds: u64, pub screenshot_on_failure: bool, pub browser_type: BrowserType, pub test_data_dir: PathBuf, pub screenshot_dir: PathBuf, } impl Default for UXTestConfig { fn default() -> Self { let test_mode = std::env::var("UX_TEST_MODE").unwrap_or_else(|_| "dev".to_string()); match test_mode.as_str() { "ci" => Self { test_port: 8081, headless: true, timeout_seconds: 30, screenshot_on_failure: true, browser_type: BrowserType::Chrome, test_data_dir: PathBuf::from("user_data_test"), screenshot_dir: PathBuf::from("tests/ux_suite/reports/screenshots"), }, "dev" => Self { test_port: 8081, headless: false, timeout_seconds: 60, screenshot_on_failure: true, browser_type: BrowserType::Chrome, test_data_dir: PathBuf::from("user_data_test"), screenshot_dir: PathBuf::from("tests/ux_suite/reports/screenshots"), }, _ => Self { test_port: 8081, headless: false, timeout_seconds: 60, screenshot_on_failure: true, browser_type: BrowserType::Chrome, test_data_dir: PathBuf::from("user_data_test"), screenshot_dir: PathBuf::from("tests/ux_suite/reports/screenshots"), } } } } /// Complete UX test environment pub struct UXTestEnvironment { pub config: UXTestConfig, pub browser: BrowserManager, pub server: TestServer, pub data_manager: TestDataManager, pub api_client: APITestClient, } impl UXTestEnvironment { /// Initialize a new test environment pub async fn new() -> Result> { let config = UXTestConfig::default(); // Create directories std::fs::create_dir_all(&config.test_data_dir)?; std::fs::create_dir_all(&config.screenshot_dir)?; // Initialize components let data_manager = TestDataManager::new(&config.test_data_dir)?; let server = TestServer::start(config.test_port).await?; let browser = BrowserManager::new(&config).await?; let api_client = APITestClient::new(config.test_port); Ok(Self { config, browser, server, data_manager, api_client, }) } /// Get a UX test helper for this environment pub fn ux_helper(&self) -> UXTestHelper { UXTestHelper::new(self) } /// Clean up test environment pub async fn cleanup(&mut self) -> Result<(), Box> { self.browser.quit().await?; self.server.stop().await?; self.data_manager.cleanup()?; Ok(()) } }