#[cfg(test)] mod visual_test_dashboard_tests { use leptos::prelude::*; use wasm_bindgen_test::*; use web_sys; use crate::visual_testing::{VisualTestRunner, VisualTestResult, VisualRegression}; wasm_bindgen_test_configure!(run_in_browser); #[wasm_bindgen_test] fn test_visual_test_dashboard() { let mut runner = VisualTestRunner::new(); let test_results = RwSignal::new(Vec::::new()); let regressions = RwSignal::new(Vec::::new()); let selected_test = RwSignal::new(None::); let show_baselines = RwSignal::new(false); // Add some test data let sample_result = VisualTestResult { test_name: "button_default_state".to_string(), component_name: "Button".to_string(), screenshot_data: "sample_screenshot_data".to_string(), timestamp: current_timestamp(), viewport_width: 1920, viewport_height: 1080, pixel_difference: Some(0.0), visual_similarity: Some(1.0), }; test_results.set(vec![sample_result]); mount_to_body(move || { view! {

"Visual Regression Test Dashboard"

"Test Results"

{for test_results.get().iter().map(|result| { let result = result.clone(); let selected_test = selected_test.clone(); view! {

{result.test_name.clone()}

{result.component_name.clone()}
Screenshot
"Similarity:" {format!("{:.2}%", result.visual_similarity.unwrap_or(0.0) * 100.0)}
"Viewport:" {format!("{}x{}", result.viewport_width, result.viewport_height)}
} })}

"Visual Regressions"

{for regressions.get().iter().map(|regression| { let regression = regression.clone(); view! {

{regression.test_name.clone()}

{regression.similarity_score}

"Baseline"

Baseline

"Current"

Current

"Diff"

Diff

{format!("Similarity: {:.2}% (Threshold: {:.2}%)", regression.similarity_score * 100.0, regression.threshold * 100.0)}

{format!("Pixel Differences: {}", regression.pixel_differences)}

} })}
{if show_baselines.get() { view! {

"Baselines"

"Baseline management interface would go here"

} } else { view! {
} }}
} }); let document = web_sys::window().unwrap().document().unwrap(); // Test dashboard functionality let refresh_button = document.query_selector("button").unwrap().unwrap() .unchecked_into::(); if refresh_button.text_content().unwrap().contains("Refresh Results") { refresh_button.click(); } // Verify dashboard sections let results_section = document.query_selector(".test-results-section").unwrap(); assert!(results_section.is_some(), "Test results section should be displayed"); let regressions_section = document.query_selector(".regressions-section").unwrap(); assert!(regressions_section.is_some(), "Regressions section should be displayed"); // Test result selection let result_cards = document.query_selector_all(".result-card").unwrap(); if result_cards.length() > 0 { let first_card = result_cards.item(0).unwrap(); first_card.click(); let selected_card = document.query_selector(".result-card.selected").unwrap(); assert!(selected_card.is_some(), "Result card should be selectable"); } } fn current_timestamp() -> u64 { std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap() .as_secs() } }