ref:main
use huorn_minecraft::security::{FilterResult, InputFilter};
#[test]
fn test_blocklist_blocks_match() {
let filter = InputFilter::new(vec!["rm -rf /".to_string()]);
assert_eq!(
filter.check_line("rm -rf /"),
FilterResult::Blocked("rm -rf /".to_string())
);
}
#[test]
fn test_blocklist_allows_safe_input() {
let filter = InputFilter::new(vec!["rm -rf /".to_string()]);
assert_eq!(filter.check_line("ls -la"), FilterResult::Allowed);
}
#[test]
fn test_blocklist_substring_match() {
let filter = InputFilter::new(vec!["rm -rf /".to_string()]);
assert_eq!(
filter.check_line("sudo rm -rf / --no-preserve-root"),
FilterResult::Blocked("rm -rf /".to_string())
);
}
#[test]
fn test_line_accumulation() {
let mut filter = InputFilter::new(vec!["rm -rf /".to_string()]);
let results = filter.feed(b"rm -r");
assert!(results.is_empty()); // Not a complete line
let results = filter.feed(b"f /\n");
assert_eq!(results.len(), 1);
assert_eq!(
results[0],
FilterResult::Blocked("rm -rf /".to_string())
);
}
#[test]
fn test_empty_blocklist_allows_everything() {
let filter = InputFilter::new(vec![]);
assert_eq!(filter.check_line("anything"), FilterResult::Allowed);
}
#[test]
fn test_multiple_lines_in_single_feed() {
let mut filter = InputFilter::new(vec!["rm -rf /".to_string()]);
let results = filter.feed(b"ls -la\nrm -rf /\necho hi\n");
assert_eq!(results.len(), 3);
assert_eq!(results[0], FilterResult::Allowed);
assert_eq!(
results[1],
FilterResult::Blocked("rm -rf /".to_string())
);
assert_eq!(results[2], FilterResult::Allowed);
}