bottest/tests/unit/compliance/compliance_code_scanner.rs

92 lines
No EOL
2.2 KiB
Rust

#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(dead_code)]
#[test]
fn test_pattern_matching() {
let scanner = CodeScanner::new("/tmp/test");
let password_pattern = scanner
.patterns
.iter()
.find(|p| matches!(p.issue_type, IssueType::PasswordInConfig))
.unwrap();
assert!(password_pattern.regex.is_match(r#"password = "secret123""#));
assert!(password_pattern.regex.is_match(r#"PASSWORD = 'mypass'"#));
let underscore_pattern = scanner
.patterns
.iter()
.find(|p| matches!(p.issue_type, IssueType::UnderscoreInKeyword))
.unwrap();
assert!(underscore_pattern.regex.is_match("GET_BOT_MEMORY"));
assert!(underscore_pattern.regex.is_match("SET_USER_MEMORY"));
}
#[test]
fn test_severity_ordering() {
assert!(IssueSeverity::Critical > IssueSeverity::High);
assert!(IssueSeverity::High > IssueSeverity::Medium);
assert!(IssueSeverity::Medium > IssueSeverity::Low);
assert!(IssueSeverity::Low > IssueSeverity::Info);
}
#[test]
fn test_stats_merge() {
let mut stats1 = ScanStats {
critical: 1,
high: 2,
medium: 3,
low: 4,
info: 5,
total: 15,
};
let stats2 = ScanStats {
critical: 1,
high: 1,
medium: 1,
low: 1,
info: 1,
total: 5,
};
stats1.merge(&stats2);
assert_eq!(stats1.critical, 2);
assert_eq!(stats1.high, 3);
assert_eq!(stats1.total, 20);
}
#[test]
fn test_csv_escape() {
assert_eq!(escape_csv("simple"), "simple");
assert_eq!(escape_csv("with,comma"), "\"with,comma\"");
assert_eq!(escape_csv("with\"quote"), "\"with\"\"quote\"");
}
#[test]
fn test_redact_sensitive() {
let scanner = CodeScanner::new("/tmp/test");
let line = r#"password = "supersecretpassword123""#;
let redacted = scanner.redact_sensitive(line);
assert!(redacted.contains("***REDACTED***"));
assert!(!redacted.contains("supersecretpassword123"));
}