#[cfg(test)] mod ecommerce_workflow_tests { use leptos::prelude::*; use wasm_bindgen_test::*; use web_sys; use crate::default::{Button, Input, Card, CardHeader, CardTitle, CardContent, Badge, Separator}; wasm_bindgen_test_configure!(run_in_browser); #[derive(Debug, Clone, PartialEq)] struct Product { id: u32, name: String, price: f64, quantity: u32, in_stock: bool, } #[derive(Debug, Clone, PartialEq)] struct CartItem { product: Product, quantity: u32, } #[wasm_bindgen_test] fn test_ecommerce_shopping_cart_workflow() { let products = vec![ Product { id: 1, name: "Laptop".to_string(), price: 999.99, quantity: 5, in_stock: true }, Product { id: 2, name: "Mouse".to_string(), price: 29.99, quantity: 10, in_stock: true }, Product { id: 3, name: "Keyboard".to_string(), price: 79.99, quantity: 0, in_stock: false }, ]; let cart_items = RwSignal::new(Vec::::new()); let total_price = RwSignal::new(0.0); let search_query = RwSignal::new(String::new()); let selected_category = RwSignal::new("all".to_string()); mount_to_body(move || { let filtered_products = products.iter() .filter(|p| { let query = search_query.get(); let category = selected_category.get(); (query.is_empty() || p.name.to_lowercase().contains(&query.to_lowercase())) && (category == "all" || (category == "in_stock" && p.in_stock)) }) .collect::>(); view! {
{for filtered_products.iter().map(|product| { let product = product.clone(); let cart_items = cart_items.clone(); let total_price = total_price.clone(); view! { {product.name.clone()}

{format!("${:.2}", product.price)}

{format!("Stock: {}", product.quantity)}

} })}

"Shopping Cart"

{for cart_items.get().iter().map(|item| { let item = item.clone(); let cart_items = cart_items.clone(); let total_price = total_price.clone(); view! {
{item.product.name.clone()} {format!("${:.2}", item.product.price)} {format!("Qty: {}", item.quantity)}
} })}
{format!("Total: ${:.2}", total_price.get())}
} }); let document = web_sys::window().unwrap().document().unwrap(); // Test search functionality let search_input = document.query_selector("input[placeholder='Search products...']").unwrap().unwrap() .unchecked_into::(); search_input.set_value("laptop"); let input_event = web_sys::InputEvent::new("input").unwrap(); search_input.dispatch_event(&input_event).unwrap(); // Test adding to cart let add_buttons = document.query_selector_all("button").unwrap(); for i in 0..add_buttons.length() { let button = add_buttons.item(i).unwrap().unchecked_into::(); if button.text_content().unwrap().contains("Add to Cart") { button.click(); break; } } // Verify cart has items let cart_items = document.query_selector_all(".cart-item").unwrap(); assert!(cart_items.length() > 0, "Cart should have items after adding product"); // Test total calculation let total_element = document.query_selector(".cart-total strong").unwrap().unwrap(); let total_text = total_element.text_content().unwrap(); assert!(total_text.contains("$"), "Total should display price"); } #[wasm_bindgen_test] fn test_ecommerce_checkout_workflow() { let cart_items = RwSignal::new(vec![ CartItem { product: Product { id: 1, name: "Laptop".to_string(), price: 999.99, quantity: 1, in_stock: true }, quantity: 1, } ]); let customer_info = RwSignal::new(("".to_string(), "".to_string(), "".to_string())); let payment_method = RwSignal::new("credit_card".to_string()); let order_placed = RwSignal::new(false); mount_to_body(move || { view! {

"Checkout"

"Customer Information"

"Payment Method"

"Order Summary"

{for cart_items.get().iter().map(|item| { view! {
{item.product.name.clone()} {format!("${:.2}", item.product.price * item.quantity as f64)}
} })}
{if order_placed.get() { view! {

"Order Placed Successfully!"

"Thank you for your purchase."

} } else { view! {
} }}
} }); let document = web_sys::window().unwrap().document().unwrap(); // Test payment method selection let paypal_button = document.query_selector("button").unwrap().unwrap() .unchecked_into::(); if paypal_button.text_content().unwrap().contains("PayPal") { paypal_button.click(); } // Test order placement let place_order_btn = document.query_selector(".place-order-btn").unwrap().unwrap() .unchecked_into::(); place_order_btn.click(); // Verify order confirmation let confirmation = document.query_selector(".order-confirmation").unwrap(); assert!(confirmation.is_some(), "Order confirmation should appear after placing order"); } }