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";
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);
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);
}
}
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);
}
}
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");
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!");
}