use webpage_quality_analyzer::{analyze, Analyzer};
const TEST_HTML: &str = r#"
<!DOCTYPE html>
<html>
<head>
<title>Test Page</title>
<meta name="description" content="A test page for verification">
</head>
<body>
<h1>Main Heading</h1>
<p>This is a test paragraph with some content.</p>
<img src="test.jpg" alt="Test image">
</body>
</html>
"#;
const TEST_URL: &str = "http://example.com";
#[tokio::test]
async fn test_phase1_phase2_end_to_end_flow() {
let result_basic = analyze(TEST_URL, Some(TEST_HTML)).await;
assert!(result_basic.is_ok(), "Basic analysis should succeed");
let analyzer_disabled: Analyzer = Analyzer::builder()
.with_profile_name("content_article")
.unwrap()
.disable_metric("word_count")
.unwrap()
.disable_metric("readability_fk")
.unwrap()
.build()
.unwrap();
let result_disabled = analyzer_disabled.run(TEST_URL, Some(TEST_HTML)).await;
assert!(
result_disabled.is_ok(),
"Analysis with disabled metrics should succeed"
);
let report_disabled = result_disabled.unwrap();
assert!(
report_disabled.score > 0.0,
"Score should be calculated even with disabled metrics"
);
let analyzer_bulk: Analyzer = Analyzer::builder()
.with_profile_name("news")
.unwrap()
.disable_metrics(vec!["title_len".to_string(), "images_count".to_string()])
.unwrap()
.build()
.unwrap();
let result_bulk = analyzer_bulk.run(TEST_URL, Some(TEST_HTML)).await;
assert!(result_bulk.is_ok(), "Bulk disable should work");
let analyzer_chain: Analyzer = Analyzer::builder()
.with_profile_name("blog")
.unwrap()
.disable_metric("title_len")
.unwrap()
.enable_metric("word_count")
.unwrap()
.disable_metric("readability_fk")
.unwrap()
.build()
.unwrap();
let result_chain = analyzer_chain.run(TEST_URL, Some(TEST_HTML)).await;
assert!(result_chain.is_ok(), "Chained operations should work");
let result_invalid: Result<Analyzer, _> = Analyzer::builder()
.with_profile_name("content_article")
.unwrap()
.disable_metric("invalid_metric_name_xyz")
.and_then(|b| b.build());
assert!(
result_invalid.is_err(),
"Invalid metric name should produce error"
);
let error_msg = result_invalid.unwrap_err().to_string();
assert!(
error_msg.contains("invalid_metric_name_xyz"),
"Error should mention invalid metric"
);
println!("✅ Phase 1 & 2 end-to-end tests PASSED!");
}
#[tokio::test]
async fn test_profile_modifier_integration() {
use webpage_quality_analyzer::config::ConfigManager;
let mut manager = ConfigManager::new();
let profile = manager
.get_profile("content_article")
.expect("content_article profile should exist");
assert_eq!(profile.metadata.name, "Content Article");
let result = manager.set_runtime_profile(profile.clone());
assert!(result.is_ok(), "set_runtime_profile should succeed");
let retrieved = manager
.get_profile("content_article")
.expect("content_article profile should exist");
assert_eq!(retrieved.metadata.name, "Content Article");
println!("✅ ProfileModifier integration test PASSED!");
}
#[tokio::test]
async fn test_complete_verification_workflow() {
let report1 = analyze(TEST_URL, Some(TEST_HTML)).await.unwrap();
assert!(report1.score > 0.0);
let analyzer2: Analyzer = Analyzer::builder()
.with_profile_name("content_article")
.unwrap()
.disable_metrics(vec![
"title_len".to_string(),
"images_count".to_string(),
"readability_fk".to_string(),
])
.unwrap()
.build()
.unwrap();
let report2 = analyzer2.run(TEST_URL, Some(TEST_HTML)).await.unwrap();
assert!(report2.score > 0.0);
let analyzer3: Analyzer = Analyzer::builder()
.with_profile_name("blog")
.unwrap()
.enable_metric("word_count")
.unwrap()
.enable_metric("paragraph_count")
.unwrap()
.disable_metric("title_len")
.unwrap()
.build()
.unwrap();
let report3 = analyzer3.run(TEST_URL, Some(TEST_HTML)).await.unwrap();
assert!(report3.score > 0.0);
println!("✅ All end-to-end verification tests passed!");
println!(" - Default profile analysis: PASS");
println!(" - Metric toggling: PASS");
println!(" - Bulk operations: PASS");
println!(" - Error handling: PASS");
}