Files
2025-09-01 21:37:01 -04:00

115 lines
3.5 KiB
Rust

//! 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<Self, Box<dyn std::error::Error>> {
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<dyn std::error::Error>> {
self.browser.quit().await?;
self.server.stop().await?;
self.data_manager.cleanup()?;
Ok(())
}
}