#[cfg(test)]
mod visual_regression_tests {
use leptos::prelude::*;
use wasm_bindgen_test::*;
use web_sys;
use crate::visual_testing::{VisualTestRunner, VisualTestResult, VisualRegression};
use crate::default::{Button, Input, Card, CardHeader, CardTitle, CardContent};
wasm_bindgen_test_configure!(run_in_browser);
#[wasm_bindgen_test]
fn test_button_visual_regression() {
let mut runner = VisualTestRunner::new();
mount_to_body(|| {
view! {
}
});
// Capture screenshot
let screenshot = runner.capture_screenshot("button-test-container", "button_default_state")
.expect("Failed to capture screenshot");
// Create test result
let result = VisualTestResult {
test_name: "button_default_state".to_string(),
component_name: "Button".to_string(),
screenshot_data: screenshot.clone(),
timestamp: current_timestamp(),
viewport_width: 1920,
viewport_height: 1080,
pixel_difference: None,
visual_similarity: None,
};
runner.results.push(result);
// Compare with baseline (if exists)
let regression = runner.compare_with_baseline("button_default_state", &screenshot)
.expect("Failed to compare with baseline");
if let Some(regression) = regression {
panic!("Visual regression detected: {:?}", regression);
}
}
#[wasm_bindgen_test]
fn test_button_variants_visual_regression() {
let mut runner = VisualTestRunner::new();
let variants = vec!["default", "destructive", "outline", "secondary", "ghost", "link"];
for variant in variants {
mount_to_body(move || {
view! {
}
});
let test_name = format!("button_{}_variant", variant);
let screenshot = runner.capture_screenshot(&format!("button-{}-test", variant), &test_name)
.expect("Failed to capture screenshot");
let result = VisualTestResult {
test_name: test_name.clone(),
component_name: "Button".to_string(),
screenshot_data: screenshot.clone(),
timestamp: current_timestamp(),
viewport_width: 1920,
viewport_height: 1080,
pixel_difference: None,
visual_similarity: None,
};
runner.results.push(result);
// Compare with baseline
let regression = runner.compare_with_baseline(&test_name, &screenshot)
.expect("Failed to compare with baseline");
if let Some(regression) = regression {
panic!("Visual regression detected for {} variant: {:?}", variant, regression);
}
}
}
#[wasm_bindgen_test]
fn test_input_visual_regression() {
let mut runner = VisualTestRunner::new();
mount_to_body(|| {
view! {
}
});
let screenshot = runner.capture_screenshot("input-test-container", "input_default_state")
.expect("Failed to capture screenshot");
let result = VisualTestResult {
test_name: "input_default_state".to_string(),
component_name: "Input".to_string(),
screenshot_data: screenshot.clone(),
timestamp: current_timestamp(),
viewport_width: 1920,
viewport_height: 1080,
pixel_difference: None,
visual_similarity: None,
};
runner.results.push(result);
let regression = runner.compare_with_baseline("input_default_state", &screenshot)
.expect("Failed to compare with baseline");
if let Some(regression) = regression {
panic!("Visual regression detected: {:?}", regression);
}
}
#[wasm_bindgen_test]
fn test_card_visual_regression() {
let mut runner = VisualTestRunner::new();
mount_to_body(|| {
view! {
"Test Card"
"This is a test card for visual regression testing."
}
});
let screenshot = runner.capture_screenshot("card-test-container", "card_default_state")
.expect("Failed to capture screenshot");
let result = VisualTestResult {
test_name: "card_default_state".to_string(),
component_name: "Card".to_string(),
screenshot_data: screenshot.clone(),
timestamp: current_timestamp(),
viewport_width: 1920,
viewport_height: 1080,
pixel_difference: None,
visual_similarity: None,
};
runner.results.push(result);
let regression = runner.compare_with_baseline("card_default_state", &screenshot)
.expect("Failed to compare with baseline");
if let Some(regression) = regression {
panic!("Visual regression detected: {:?}", regression);
}
}
#[wasm_bindgen_test]
fn test_responsive_visual_regression() {
let mut runner = VisualTestRunner::new();
let viewports = vec![
(320, 568, "mobile"),
(768, 1024, "tablet"),
(1920, 1080, "desktop"),
];
for (width, height, device) in viewports {
mount_to_body(move || {
view! {
{format!("{} Card", device)}
{format!("Responsive test for {} viewport", device)}
}
});
let test_name = format!("responsive_{}_layout", device);
let screenshot = runner.capture_screenshot(&format!("responsive-test-{}", device), &test_name)
.expect("Failed to capture screenshot");
let result = VisualTestResult {
test_name: test_name.clone(),
component_name: "ResponsiveLayout".to_string(),
screenshot_data: screenshot.clone(),
timestamp: current_timestamp(),
viewport_width: width,
viewport_height: height,
pixel_difference: None,
visual_similarity: None,
};
runner.results.push(result);
let regression = runner.compare_with_baseline(&test_name, &screenshot)
.expect("Failed to compare with baseline");
if let Some(regression) = regression {
panic!("Visual regression detected for {} viewport: {:?}", device, regression);
}
}
}
#[wasm_bindgen_test]
fn test_dark_mode_visual_regression() {
let mut runner = VisualTestRunner::new();
let themes = vec!["light", "dark"];
for theme in themes {
mount_to_body(move || {
view! {
{format!("{} Theme Card", theme)}
{format!("Test card in {} theme", theme)}
}
});
let test_name = format!("theme_{}_mode", theme);
let screenshot = runner.capture_screenshot(&format!("theme-test-{}", theme), &test_name)
.expect("Failed to capture screenshot");
let result = VisualTestResult {
test_name: test_name.clone(),
component_name: "Theme".to_string(),
screenshot_data: screenshot.clone(),
timestamp: current_timestamp(),
viewport_width: 1920,
viewport_height: 1080,
pixel_difference: None,
visual_similarity: None,
};
runner.results.push(result);
let regression = runner.compare_with_baseline(&test_name, &screenshot)
.expect("Failed to compare with baseline");
if let Some(regression) = regression {
panic!("Visual regression detected for {} theme: {:?}", theme, regression);
}
}
}
fn current_timestamp() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs()
}
}