use icookforms::analyzer::Analyzer;
use icookforms::compliance::ComplianceChecker;
use icookforms::parser::parse_set_cookie;
use icookforms::reporter::Reporter;
use icookforms::types::{AnalysisResult, Cookie, Regulation, ScanResult};
use icookforms::ReportFormat;
#[test]
fn test_complete_workflow_end_to_end() {
let mut scan = ScanResult::new("https://example.com");
let cookie_strings = vec![
"session=abc123; Secure; HttpOnly; SameSite=Strict",
"tracking=xyz; Domain=.example.com; Max-Age=31536000",
"_ga=GA1.2.123456789.987654321",
];
let cookies: Vec<Cookie> = cookie_strings
.iter()
.filter_map(|s| parse_set_cookie(s, false).ok())
.collect();
scan.cookies = cookies.clone();
scan.pages_scanned = 1;
let analyzer = Analyzer::new();
let mut total_issues = 0;
for cookie in &cookies {
let result = analyzer.analyze(cookie);
total_issues += result.security_issues.len();
}
let _ = total_issues;
let checker = ComplianceChecker::new();
for cookie in &cookies {
let gdpr_result = checker.check(cookie, Regulation::GDPR);
let _ = gdpr_result.issues.len();
}
let reporter = Reporter::new(ReportFormat::Json);
let analysis = AnalysisResult::new(&scan.id);
let report = reporter.generate_string(&analysis);
assert!(report.is_ok());
let json = report.unwrap();
assert!(json.contains("scan_id"));
}
#[test]
fn test_gdpr_workflow() {
let cookie = Cookie::new("session".to_string(), "abc123".to_string());
let checker = ComplianceChecker::new();
let result = checker.check(&cookie, Regulation::GDPR);
let _ = result.issues.len();
}
#[test]
fn test_ccpa_workflow() {
let cookie = Cookie::new("tracking".to_string(), "xyz789".to_string());
let checker = ComplianceChecker::new();
let result = checker.check(&cookie, Regulation::CCPA);
let _ = result.issues.len();
}
#[test]
fn test_lgpd_workflow() {
let cookie = Cookie::new("analytics".to_string(), "123456".to_string());
let checker = ComplianceChecker::new();
let result = checker.check(&cookie, Regulation::LGPD);
let _ = result.issues.len();
}
#[test]
fn test_popia_workflow() {
let cookie = Cookie::new("session".to_string(), "abc".to_string());
let checker = ComplianceChecker::new();
let result = checker.check(&cookie, Regulation::POPIA);
let _ = result.issues.len();
}
#[test]
fn test_pipeda_workflow() {
let cookie = Cookie::new("pref".to_string(), "en".to_string());
let checker = ComplianceChecker::new();
let result = checker.check(&cookie, Regulation::PIPEDA);
let _ = result.issues.len();
}
#[test]
fn test_cpra_workflow() {
let cookie = Cookie::new("ad_id".to_string(), "xyz".to_string());
let checker = ComplianceChecker::new();
let result = checker.check(&cookie, Regulation::CPRA);
let _ = result.issues.len();
}
#[test]
fn test_xss_vulnerability_detection() {
let analyzer = Analyzer::new();
let mut cookie = Cookie::new("session".to_string(), "abc123".to_string());
cookie.http_only = false;
let result = analyzer.analyze(&cookie);
let _ = result.security_issues.len();
}
#[test]
fn test_csrf_vulnerability_detection() {
let analyzer = Analyzer::new();
let mut cookie = Cookie::new("session".to_string(), "abc123".to_string());
cookie.same_site = None;
let result = analyzer.analyze(&cookie);
let _ = result.security_issues.len();
}
#[test]
fn test_mitm_vulnerability_detection() {
let analyzer = Analyzer::new();
let mut cookie = Cookie::new("session".to_string(), "abc123".to_string());
cookie.secure = false;
let result = analyzer.analyze(&cookie);
let _ = result.security_issues.len();
}
#[test]
fn test_session_hijacking_detection() {
let analyzer = Analyzer::new();
let mut cookie = Cookie::new("PHPSESSID".to_string(), "abc123".to_string());
cookie.secure = false;
cookie.http_only = false;
cookie.same_site = None;
let result = analyzer.analyze(&cookie);
assert!(result.security_issues.len() > 0);
}
#[test]
fn test_batch_cookie_analysis() {
let analyzer = Analyzer::new();
let cookies: Vec<Cookie> = (0..100)
.map(|i| Cookie::new(format!("cookie_{}", i), format!("value_{}", i)))
.collect();
let mut total_issues = 0;
for cookie in &cookies {
let result = analyzer.analyze(cookie);
total_issues += result.security_issues.len();
}
let _ = total_issues;
}
#[test]
fn test_batch_compliance_check() {
let checker = ComplianceChecker::new();
let cookies: Vec<Cookie> = (0..50)
.map(|i| Cookie::new(format!("cookie_{}", i), format!("value_{}", i)))
.collect();
let regulations = vec![
Regulation::GDPR,
Regulation::CCPA,
Regulation::LGPD,
Regulation::POPIA,
Regulation::PIPEDA,
Regulation::CPRA,
];
for cookie in &cookies {
for regulation in ®ulations {
let result = checker.check(cookie, *regulation);
let _ = result.issues.len();
}
}
}
#[test]
fn test_all_report_formats() {
let analysis = AnalysisResult::new("test-scan");
let json_reporter = Reporter::new(ReportFormat::Json);
let json_result = json_reporter.generate_string(&analysis);
assert!(json_result.is_ok());
assert!(json_result.unwrap().contains("scan_id"));
let csv_reporter = Reporter::new(ReportFormat::Csv);
let csv_result = csv_reporter.generate_string(&analysis);
assert!(csv_result.is_ok());
let html_reporter = Reporter::new(ReportFormat::Html);
let html_result = html_reporter.generate_string(&analysis);
assert!(html_result.is_ok());
let html_content = html_result.unwrap();
assert!(html_content.contains("<!DOCTYPE") || html_content.contains("<html"));
}
#[test]
fn test_malformed_cookie_handling_extended() {
let long_string = "a".repeat(10000);
let malformed = vec![
"", " ", "invalid", "name=", "=value", ";;;", "name=value;;;;;", "name=value; Invalid-Attr", "name=value; Secure; Secure", long_string.as_str(), ];
for cookie_str in malformed {
let result = parse_set_cookie(cookie_str, false);
match result {
Ok(_) => {} Err(e) => assert!(!e.to_string().is_empty()),
}
}
}
#[test]
fn test_unicode_cookie_handling() {
let unicode_cookies = vec![
"name=café",
"session=日本語",
"пример=значение",
"emoji=🍪🔒",
];
for cookie_str in unicode_cookies {
let result = parse_set_cookie(cookie_str, false);
match result {
Ok(cookie) => assert!(!cookie.name.is_empty()),
Err(_) => {} }
}
}
#[test]
fn test_database_storage_complete() {
use icookforms::storage::database::DatabaseStorage;
use icookforms::storage::Storage;
let db = DatabaseStorage::in_memory().unwrap();
let mut scan = ScanResult::new("https://example.com");
scan.cookies = vec![
Cookie::new("session".to_string(), "abc123".to_string()),
Cookie::new("tracking".to_string(), "xyz789".to_string()),
];
scan.pages_scanned = 2;
db.save_scan(&scan).unwrap();
let loaded = db.load_scan(&scan.id).unwrap();
assert_eq!(loaded.id, scan.id);
assert_eq!(loaded.cookies.len(), 2);
}
#[test]
fn test_cache_operations_complete() {
use icookforms::storage::cache::Cache;
let cache = Cache::new(3600, 100);
for i in 0..50 {
let _ = cache.set(format!("key_{}", i), format!("value_{}", i));
}
for i in 0..50 {
let value = cache.get(&format!("key_{}", i));
assert_eq!(value, Some(format!("value_{}", i)));
}
assert_eq!(cache.get("nonexistent"), None);
let _ = cache.set("key_0".to_string(), "new_value".to_string());
assert_eq!(cache.get("key_0"), Some("new_value".to_string()));
}
#[test]
#[ignore]
fn test_large_scale_processing() {
use std::time::Instant;
let analyzer = Analyzer::new();
let checker = ComplianceChecker::new();
let cookies: Vec<Cookie> = (0..1000)
.map(|i| Cookie::new(format!("cookie_{}", i), format!("value_{}", i)))
.collect();
let start = Instant::now();
for cookie in &cookies {
let _ = analyzer.analyze(cookie);
let _ = checker.check(cookie, Regulation::GDPR);
}
let duration = start.elapsed();
println!("Processed 1000 cookies in {:?}", duration);
assert!(duration.as_secs() < 5);
}
#[test]
fn test_error_propagation() {
use icookforms::storage::database::DatabaseStorage;
use icookforms::storage::Storage;
let db = DatabaseStorage::in_memory().unwrap();
let result = db.load_scan("nonexistent-id");
assert!(result.is_err());
}