use icookforms::parser::parse_set_cookie;
use icookforms::storage::cache::Cache; use icookforms::storage::Storage; use icookforms::types::{AnalysisResult, Cookie, SameSite, ScanResult};
use icookforms::ReportFormat;
#[test]
fn test_parser_with_various_cookies() {
let result = parse_set_cookie("session_id=abc123", false);
assert!(result.is_ok());
let cookie = result.unwrap();
assert_eq!(cookie.name, "session_id");
assert_eq!(cookie.value, "abc123");
let result = parse_set_cookie(
"token=xyz; Domain=example.com; Path=/; Secure; HttpOnly; SameSite=Strict",
false,
);
assert!(result.is_ok());
let cookie = result.unwrap();
assert_eq!(cookie.name, "token");
assert!(cookie.secure);
assert!(cookie.http_only);
assert_eq!(cookie.same_site, Some(SameSite::Strict));
let result = parse_set_cookie("persistent=value; Max-Age=3600", false);
assert!(result.is_ok());
let cookie = result.unwrap();
assert_eq!(cookie.max_age, Some(3600));
}
#[test]
fn test_malformed_cookie_handling() {
let malformed_cookies = vec![
"",
" ",
"invalid",
"name=",
"=value",
";;;",
"name=value;;;;;",
];
for cookie_str in malformed_cookies {
let result = parse_set_cookie(cookie_str, false);
match result {
Ok(cookie) => {
println!(
"Leniently parsed '{}' as '{}'='{}'",
cookie_str, cookie.name, cookie.value
);
}
Err(e) => {
assert!(
!e.to_string().is_empty(),
"Error message should not be empty"
);
}
}
}
}
#[test]
fn test_cookie_creation() {
let cookie = Cookie::new("test".to_string(), "value".to_string());
assert_eq!(cookie.name, "test");
assert_eq!(cookie.value, "value");
assert!(!cookie.secure);
assert!(!cookie.http_only);
assert_eq!(cookie.same_site, None);
}
#[test]
fn test_scan_result_creation() {
let scan = ScanResult::new("https://example.com");
assert_eq!(scan.url, "https://example.com");
assert_eq!(scan.cookies.len(), 0);
assert_eq!(scan.pages_scanned, 0);
}
#[test]
fn test_analysis_result_creation() {
let analysis = AnalysisResult::new("test-scan-id");
assert_eq!(analysis.scan_id, "test-scan-id");
assert!(analysis.id.len() > 0);
}
#[test]
fn test_iab_tcf_module_exists() {
println!("IAB TCF module is available");
}
#[test]
fn test_compliance_checker_creation() {
use icookforms::compliance::ComplianceChecker;
let checker = ComplianceChecker::new();
let cookie = Cookie::new("test".to_string(), "value".to_string());
let _result = checker.check(&cookie, icookforms::types::Regulation::GDPR);
}
#[test]
fn test_all_regulations() {
use icookforms::compliance::ComplianceChecker;
use icookforms::types::Regulation;
let checker = ComplianceChecker::new();
let cookie = Cookie::new("test".to_string(), "value".to_string());
let regulations = vec![
Regulation::GDPR,
Regulation::CCPA,
Regulation::CPRA,
Regulation::LGPD,
Regulation::PIPEDA,
Regulation::POPIA,
];
for regulation in regulations {
let result = checker.check(&cookie, regulation);
let _ = result.issues.len();
}
}
#[test]
fn test_analyzer_creation() {
use icookforms::analyzer::Analyzer;
let analyzer = Analyzer::new();
let cookie = Cookie::new("session".to_string(), "abc123".to_string());
let result = analyzer.analyze(&cookie);
let _ = result.security_issues.len();
let _ = result.compliance_issues.len();
}
#[test]
fn test_analyzer_multiple_cookies() {
use icookforms::analyzer::Analyzer;
let analyzer = Analyzer::new();
let cookies = vec![
Cookie::new("session".to_string(), "abc123".to_string()),
Cookie::new("tracking".to_string(), "xyz789".to_string()),
];
for cookie in &cookies {
let result = analyzer.analyze(cookie);
let _ = result.security_issues.len();
}
}
#[test]
fn test_database_storage() {
use icookforms::storage::database::DatabaseStorage;
let db = DatabaseStorage::in_memory();
assert!(db.is_ok());
let db = db.unwrap();
let scan = ScanResult::new("https://example.com");
let result = db.save_scan(&scan);
assert!(result.is_ok());
let loaded = db.load_scan(&scan.id);
assert!(loaded.is_ok());
}
#[test]
fn test_cache_operations() {
let cache = Cache::new(3600, 100);
let _ = cache.set("key1".to_string(), "value1".to_string());
assert_eq!(cache.get("key1"), Some("value1".to_string()));
let _ = cache.set("key1".to_string(), "value2".to_string());
assert_eq!(cache.get("key1"), Some("value2".to_string()));
assert_eq!(cache.get("nonexistent"), None);
}
#[test]
fn test_reporter_json() {
use icookforms::reporter::Reporter;
let reporter = Reporter::new(ReportFormat::Json);
let analysis = AnalysisResult::new("test-scan");
let result = reporter.generate_string(&analysis);
assert!(result.is_ok());
let json = result.unwrap();
assert!(json.contains("scan_id"));
}
#[test]
fn test_reporter_csv() {
use icookforms::reporter::Reporter;
let reporter = Reporter::new(ReportFormat::Csv);
let analysis = AnalysisResult::new("test-scan");
let result = reporter.generate_string(&analysis);
assert!(result.is_ok());
let csv = result.unwrap();
assert!(csv.contains("Type") || csv.contains("Severity"));
}
#[test]
fn test_reporter_html() {
use icookforms::reporter::Reporter;
let reporter = Reporter::new(ReportFormat::Html);
let analysis = AnalysisResult::new("test-scan");
let result = reporter.generate_string(&analysis);
assert!(result.is_ok());
let html = result.unwrap();
assert!(html.contains("<!DOCTYPE") || html.contains("<html"));
}
#[test]
fn test_crypto_utils() {
use icookforms::utils::crypto::{base64_decode, base64_encode, sha256, sha512};
let hash = sha256(b"test data");
assert_eq!(hash.len(), 64);
let hash = sha512(b"test data");
assert_eq!(hash.len(), 128);
let encoded = base64_encode(b"hello world");
assert_eq!(encoded, "aGVsbG8gd29ybGQ=");
let decoded = base64_decode(&encoded);
assert!(decoded.is_ok());
assert_eq!(decoded.unwrap(), b"hello world");
}
#[test]
fn test_hmac() {
use icookforms::utils::crypto::hmac_sha256;
let result = hmac_sha256(b"secret", b"message");
assert!(result.is_ok());
let hmac1 = result.unwrap();
let hmac2 = hmac_sha256(b"secret", b"message").unwrap();
assert_eq!(hmac1, hmac2);
}
#[test]
#[ignore]
fn test_parser_performance() {
use std::time::Instant;
let test_cookies = vec![
"simple=value",
"session=xyz; Secure; HttpOnly",
"complex=value; Domain=.example.com; Path=/; Secure; HttpOnly; SameSite=Strict; Max-Age=3600",
];
let start = Instant::now();
let iterations = 10000;
for _ in 0..iterations {
for cookie_str in &test_cookies {
let _ = parse_set_cookie(cookie_str, false);
}
}
let duration = start.elapsed();
let per_cookie = duration / (iterations * test_cookies.len() as u32);
println!(
"Parsed {} cookies in {:?}",
iterations * test_cookies.len() as u32,
duration
);
println!("Average time per cookie: {:?}", per_cookie);
assert!(per_cookie.as_micros() < 100, "Parser should be fast");
}