webpage_quality_analyzer 1.0.2

High-performance webpage quality analyzer with 115 comprehensive metrics - Rust library with WASM, C++, and Python bindings
Documentation
use serde::Deserialize;
use std::fs;
use webpage_quality_analyzer::{analyze_with_profile, Analyzer};

#[derive(Debug, Deserialize)]
struct WebpageEntry {
    url: String,
    content: String,
}

#[tokio::test]
#[ignore = "Requires external data file: batch_20250903_151632_99.json"]
async fn test_compare_live_vs_cached_html() {
    println!("🔍 Comparing live fetch vs cached HTML scoring...\n");

    let test_url = "https://www.aljazeera.com/tag/nuclear-energy/#featured-news-container";

    // Read the cached HTML from JSON
    let json_path = "/home/gyashu/projects/webpage-quality-analyser/batch_20250903_151632_99.json";
    let json_content = fs::read_to_string(json_path).expect("Failed to read JSON file");
    let webpage_entries: Vec<WebpageEntry> =
        serde_json::from_str(&json_content).expect("Failed to parse JSON");

    let cached_entry = webpage_entries
        .iter()
        .find(|e| e.url.contains("nuclear-energy"))
        .expect("Failed to find nuclear energy URL in batch");

    println!("📋 Testing URL: {}\n", test_url);

    // Test 1: Using CACHED HTML (like batch test does)
    println!("🗂️  TEST 1: Using CACHED HTML from JSON file");
    println!("   HTML size: {} bytes", cached_entry.content.len());

    let cached_result = analyze_with_profile(
        &cached_entry.url,
        Some(&cached_entry.content),
        "content_article",
    )
    .await;

    match &cached_result {
        Ok(report) => {
            println!("   ✅ Score: {:.2}", report.score);
            println!(
                "   📝 Word Count: {}",
                report.metrics.html_analysis.content.word_count
            );
            println!(
                "   📄 Paragraphs: {}",
                report.metrics.html_analysis.structure.paragraph_count
            );
            println!(
                "   📊 Sentences: {}",
                report.metrics.html_analysis.content.sentence_count
            );
            println!("   🏆 Verdict: {:?}", report.verdict);
        }
        Err(e) => {
            println!("   ❌ Error: {}", e);
        }
    }

    // Test 2: FETCHING LIVE from URL (like single URL test does)
    println!("\n🌐 TEST 2: FETCHING LIVE HTML from URL");

    let analyzer: Analyzer = Analyzer::builder()
        .with_profile_name("content_article")
        .expect("Failed to set profile")
        .build()
        .expect("Failed to build analyzer");

    let live_result = analyzer.run(test_url, None).await;

    match &live_result {
        Ok(report) => {
            println!("   ✅ Score: {:.2}", report.score);
            println!(
                "   📝 Word Count: {}",
                report.metrics.html_analysis.content.word_count
            );
            println!(
                "   📄 Paragraphs: {}",
                report.metrics.html_analysis.structure.paragraph_count
            );
            println!(
                "   📊 Sentences: {}",
                report.metrics.html_analysis.content.sentence_count
            );
            println!("   🏆 Verdict: {:?}", report.verdict);
        }
        Err(e) => {
            println!("   ❌ Error: {}", e);
        }
    }

    // Compare results
    if let (Ok(cached_report), Ok(live_report)) = (&cached_result, &live_result) {
        println!("\n📊 === COMPARISON ===");
        let score_diff = (live_report.score - cached_report.score).abs();
        println!("   Score difference: {:.2} points", score_diff);

        if score_diff > 10.0 {
            println!("\n⚠️  WARNING: Large score difference detected!");
            println!("   This indicates the cached HTML differs significantly from live content.");
            println!("\n   Possible reasons:");
            println!("   1. Website content changed since HTML was cached");
            println!("   2. Different HTML structure (JavaScript rendering, dynamic content)");
            println!("   3. Cached HTML may be incomplete or truncated");

            // Detailed comparison
            println!("\n   📋 Detailed Metrics Comparison:");
            println!("   ┌─────────────────────┬──────────┬──────────┬──────────┐");
            println!("   │ Metric              │ Cached   │ Live     │ Diff     │");
            println!("   ├─────────────────────┼──────────┼──────────┼──────────┤");
            println!(
                "   │ Score               │ {:<8.2}{:<8.2}{:<8.2}",
                cached_report.score, live_report.score, score_diff
            );
            println!(
                "   │ Word Count          │ {:<8}{:<8}{:<8}",
                cached_report.metrics.html_analysis.content.word_count,
                live_report.metrics.html_analysis.content.word_count,
                (live_report.metrics.html_analysis.content.word_count as i32
                    - cached_report.metrics.html_analysis.content.word_count as i32)
                    .abs()
            );
            println!(
                "   │ Paragraphs          │ {:<8}{:<8}{:<8}",
                cached_report
                    .metrics
                    .html_analysis
                    .structure
                    .paragraph_count,
                live_report.metrics.html_analysis.structure.paragraph_count,
                (live_report.metrics.html_analysis.structure.paragraph_count as i32
                    - cached_report
                        .metrics
                        .html_analysis
                        .structure
                        .paragraph_count as i32)
                    .abs()
            );
            println!(
                "   │ Sentences           │ {:<8}{:<8}{:<8}",
                cached_report.metrics.html_analysis.content.sentence_count,
                live_report.metrics.html_analysis.content.sentence_count,
                (live_report.metrics.html_analysis.content.sentence_count as i32
                    - cached_report.metrics.html_analysis.content.sentence_count as i32)
                    .abs()
            );
            println!("   └─────────────────────┴──────────┴──────────┴──────────┘");
        } else {
            println!("   ✅ Scores are consistent (difference < 10 points)");
        }
    }

    println!("\n✅ Comparison test completed!");
}