Files
projectmycelium/tests/tests_archive/ux_suite/flows/public_access.rs

317 lines
12 KiB
Rust

//! Public Access Tests
//!
//! Tests for functionality available without authentication:
//! - Information pages (/docs, /privacy, /terms, /about, /contact)
//! - Anonymous marketplace browsing
//! - Anonymous cart functionality
//! - Search and filtering
use crate::utils::*;
use crate::environment::*;
use tokio_test;
/// Test all public information pages are accessible
#[tokio::test]
#[serial_test::serial]
async fn test_public_information_pages() -> Result<(), Box<dyn std::error::Error>> {
let environment = TestFixtures::setup_test_environment().await?;
let mut helper = UXTestHelper::new(&environment);
log::info!("Testing public information pages");
// Test each information page
let pages = vec![
("/docs", "Documentation"),
("/privacy", "Privacy"),
("/terms", "Terms"),
("/about", "About"),
("/contact", "Contact"),
];
for (url, expected_title_part) in pages {
log::info!("Testing page: {}", url);
// Navigate to page
helper.browser.navigate_to(url).await?;
// Assert page loads successfully
helper.assert_page_loaded(expected_title_part).await?;
// Take screenshot
let page_name = url.trim_start_matches('/');
helper.take_screenshot(&format!("public_page_{}", page_name)).await?;
// Verify page contains expected content indicators
match url {
"/docs" => {
assert!(helper.browser.element_exists(".documentation, .docs-content, h1").await);
}
"/privacy" => {
assert!(helper.browser.element_exists(".privacy-policy, .legal-content, h1").await);
}
"/terms" => {
assert!(helper.browser.element_exists(".terms-conditions, .legal-content, h1").await);
}
"/about" => {
assert!(helper.browser.element_exists(".about-content, .marketplace-info, h1").await);
}
"/contact" => {
assert!(helper.browser.element_exists(".contact-info, .contact-form, h1").await);
}
_ => {}
}
}
log::info!("All public information pages test completed successfully");
Ok(())
}
/// Test anonymous marketplace browsing
#[tokio::test]
#[serial_test::serial]
async fn test_anonymous_marketplace_browsing() -> Result<(), Box<dyn std::error::Error>> {
let environment = TestFixtures::setup_test_environment().await?;
let mut helper = UXTestHelper::new(&environment);
log::info!("Testing anonymous marketplace browsing");
// Test main marketplace page
helper.browser.navigate_to("/marketplace").await?;
helper.assert_page_loaded("Marketplace").await?;
// Verify marketplace loads without authentication
assert!(helper.browser.element_exists(".marketplace, .product-grid, .category-nav").await);
helper.take_screenshot("marketplace_anonymous").await?;
// Test each marketplace category
let categories = vec![
("/marketplace/compute", "compute resources"),
("/marketplace/mycelium_nodes", "mycelium_nodes"),
("/marketplace/gateways", "gateways"),
("/marketplace/applications", "applications"),
("/marketplace/services", "services"),
];
for (url, category_name) in categories {
log::info!("Testing marketplace category: {}", category_name);
helper.browser.navigate_to(url).await?;
// Wait for category content to load
helper.browser.wait_for_element(".category-content, .product-list, .marketplace").await?;
// Verify category-specific elements exist
match url {
"/marketplace/compute" => {
// Should show VM/slice options
helper.browser.wait_for_element(".compute-resources, .vm-options, .slice-list").await.ok();
}
"/marketplace/3nodes" => {
// Should show node listings
helper.browser.wait_for_element(".node-listings, .server-list, .mycelium-node-grid").await.ok();
}
"/marketplace/gateways" => {
// Should show gateway services
helper.browser.wait_for_element(".gateway-services, .mycelium-gateways").await.ok();
}
"/marketplace/applications" => {
// Should show app listings
helper.browser.wait_for_element(".app-grid, .application-list, .published-apps").await.ok();
}
"/marketplace/services" => {
// Should show service listings
helper.browser.wait_for_element(".service-list, .professional-services").await.ok();
}
_ => {}
}
let category_clean = category_name.replace(" ", "_");
helper.take_screenshot(&format!("marketplace_{}", category_clean)).await?;
}
log::info!("Anonymous marketplace browsing test completed successfully");
Ok(())
}
/// Test anonymous cart functionality
#[tokio::test]
#[serial_test::serial]
async fn test_anonymous_cart_functionality() -> Result<(), Box<dyn std::error::Error>> {
let environment = TestFixtures::setup_test_environment().await?;
let mut helper = UXTestHelper::new(&environment);
log::info!("Testing anonymous cart functionality");
// Navigate to marketplace
helper.browser.navigate_to("/marketplace").await?;
// Try to add item to cart (if products are available)
if helper.browser.element_exists(".add-to-cart, .product-card").await {
// Click first add to cart button found
helper.browser.click(".add-to-cart, .product-card .btn-primary").await?;
// Should show some indication of cart update
helper.browser.wait_for_element(".cart-updated, .notification, .alert").await.ok();
}
// Navigate to anonymous cart
helper.navigate_to_cart().await?;
helper.assert_page_loaded("Cart").await?;
// Verify cart page shows for non-authenticated users
assert!(helper.browser.element_exists(".cart, .cart-content, .shopping-cart").await);
helper.take_screenshot("anonymous_cart").await?;
// Check for login prompt when trying to checkout
if helper.browser.element_exists(".checkout-btn, .proceed-checkout").await {
helper.browser.click(".checkout-btn, .proceed-checkout").await?;
// Should redirect to login or show login prompt
helper.browser.wait_for_element(".login-form, .auth-required, .login-prompt").await.ok();
helper.take_screenshot("checkout_login_prompt").await?;
}
log::info!("Anonymous cart functionality test completed successfully");
Ok(())
}
/// Test marketplace search and filtering
#[tokio::test]
#[serial_test::serial]
async fn test_marketplace_search_and_filtering() -> Result<(), Box<dyn std::error::Error>> {
let environment = TestFixtures::setup_test_environment().await?;
let mut helper = UXTestHelper::new(&environment);
log::info!("Testing marketplace search and filtering");
// Navigate to marketplace
helper.browser.navigate_to("/marketplace").await?;
// Test search functionality
if helper.browser.element_exists(".search-input, input[type='search']").await {
helper.browser.type_text(".search-input, input[type='search']", "test").await?;
// Submit search or wait for auto-search
if helper.browser.element_exists(".search-btn, .search-submit").await {
helper.browser.click(".search-btn, .search-submit").await?;
}
// Wait for search results
helper.browser.wait_for_element(".search-results, .product-grid, .filtered-results").await.ok();
helper.take_screenshot("marketplace_search_results").await?;
}
// Test category filtering
if helper.browser.element_exists(".category-filter, .filter-category").await {
let filters = helper.browser.find_elements(".category-filter option, .filter-btn").await.ok();
if let Some(filters) = filters {
if filters.len() > 1 {
// Click first filter option
filters[1].click().await.ok();
// Wait for filtered results
helper.browser.wait_for_element(".filtered-results, .category-products").await.ok();
helper.take_screenshot("marketplace_filtered_results").await?;
}
}
}
// Test price filtering if available
if helper.browser.element_exists(".price-filter, .price-range").await {
helper.take_screenshot("marketplace_price_filter").await?;
}
log::info!("Marketplace search and filtering test completed successfully");
Ok(())
}
/// Test product details pages
#[tokio::test]
#[serial_test::serial]
async fn test_product_details_pages() -> Result<(), Box<dyn std::error::Error>> {
let environment = TestFixtures::setup_test_environment().await?;
let mut helper = UXTestHelper::new(&environment);
log::info!("Testing product details pages");
// Navigate to marketplace
helper.browser.navigate_to("/marketplace").await?;
// Find and click on a product (if available)
if helper.browser.element_exists(".product-card, .product-item").await {
helper.browser.click(".product-card, .product-item").await?;
// Wait for product details page
helper.browser.wait_for_element(".product-details, .product-info, .item-details").await.ok();
// Verify product details elements
let expected_elements = vec![
".product-name, .item-title",
".product-price, .price-info",
".product-description, .item-description",
];
for element in expected_elements {
if helper.browser.element_exists(element).await {
log::info!("Found product detail element: {}", element);
}
}
helper.take_screenshot("product_details_page").await?;
// Test product action buttons (without authentication)
if helper.browser.element_exists(".add-to-cart").await {
log::info!("Add to cart button available on product details");
}
if helper.browser.element_exists(".buy-now").await {
log::info!("Buy now button available on product details");
}
}
log::info!("Product details pages test completed successfully");
Ok(())
}
/// Test marketplace accessibility and responsiveness
#[tokio::test]
#[serial_test::serial]
async fn test_marketplace_accessibility() -> Result<(), Box<dyn std::error::Error>> {
let environment = TestFixtures::setup_test_environment().await?;
let mut helper = UXTestHelper::new(&environment);
log::info!("Testing marketplace accessibility and responsiveness");
// Navigate to marketplace
helper.browser.navigate_to("/marketplace").await?;
// Test different viewport sizes
let viewport_sizes = vec![
(1920, 1080), // Desktop
(768, 1024), // Tablet
(375, 667), // Mobile
];
for (width, height) in viewport_sizes {
log::info!("Testing viewport size: {}x{}", width, height);
// Set viewport size
helper.browser.driver.set_window_size(width, height).await?;
// Wait for layout to adjust
helper.wait(std::time::Duration::from_millis(500)).await;
// Take screenshot for visual verification
helper.take_screenshot(&format!("marketplace_{}x{}", width, height)).await?;
// Verify key elements are still accessible
assert!(helper.browser.element_exists("body").await);
}
// Reset to default size
helper.browser.driver.set_window_size(1920, 1080).await?;
log::info!("Marketplace accessibility test completed successfully");
Ok(())
}