use crate::pattern::{expand_host, literal_prefix};
#[test]
fn expand_host_ipv4() {
let expanded = expand_host(r"Failed password for .* from <HOST>").unwrap();
assert!(expanded.contains("(?P<host>"));
assert!(!expanded.contains("<HOST>"));
regex::Regex::new(&expanded).unwrap();
}
#[test]
fn expand_host_with_regex() {
let expanded = expand_host(r"sshd\[\d+\]: Failed password for .* from <HOST> port").unwrap();
let re = regex::Regex::new(&expanded).unwrap();
let caps = re
.captures("sshd[1234]: Failed password for root from 192.168.1.100 port")
.unwrap();
assert_eq!(&caps["host"], "192.168.1.100");
}
#[test]
fn expand_host_ipv6() {
let expanded = expand_host(r"from <HOST>").unwrap();
let re = regex::Regex::new(&expanded).unwrap();
let caps = re.captures("from 2001:db8::1").unwrap();
assert_eq!(&caps["host"], "2001:db8::1");
}
#[test]
fn expand_host_missing() {
let result = expand_host(r"no host placeholder here");
assert!(result.is_err());
}
#[test]
fn expand_host_multiple() {
let result = expand_host(r"<HOST> and <HOST>");
assert!(result.is_err());
}
#[test]
fn literal_prefix_ssh() {
let prefix = literal_prefix(r"sshd\[\d+\]: Failed password for .* from <HOST>");
let p = prefix.unwrap();
assert!(p.contains("from ") || p.contains(" from"), "got: {p}");
}
#[test]
fn literal_prefix_simple() {
let prefix = literal_prefix(r"Connection refused from <HOST>");
assert_eq!(prefix, Some("Connection refused from ".to_string()));
}
#[test]
fn literal_prefix_none() {
let prefix = literal_prefix(r"<HOST> did something");
assert!(prefix.is_none());
}
#[test]
fn literal_prefix_short() {
let prefix = literal_prefix(r".*<HOST>");
assert!(prefix.is_none());
}
#[test]
fn literal_prefix_dot_treated_as_meta() {
let prefix = literal_prefix(r"prefix.thing from <HOST>");
let p = prefix.unwrap();
assert!(
p.contains("thing from "),
"dot should split segments; got: {p}"
);
}
#[test]
fn expand_host_empty_pattern() {
let result = expand_host("");
assert!(result.is_err());
}
#[test]
fn literal_prefix_all_metacharacters() {
let prefix = literal_prefix(r".*\d+\[\d+\]<HOST>");
assert!(prefix.is_none());
}
#[test]
fn literal_prefix_boundary_three_chars() {
let prefix = literal_prefix(r".*abc<HOST>");
assert_eq!(prefix, Some("abc".to_string()));
}
#[test]
fn literal_prefix_boundary_two_chars() {
let prefix = literal_prefix(r".*ab<HOST>");
assert_eq!(prefix, Some("ab".to_string()));
}
#[test]
fn literal_prefix_fallback_too_short() {
let prefix = literal_prefix(r".*a\d+b\w+<HOST>");
assert!(prefix.is_none());
}