use postfix_log_parser::components::postmap::PostmapParser;
use postfix_log_parser::components::ComponentParser;
use postfix_log_parser::events::postmap::{ErrorType, PostmapEventType};
use postfix_log_parser::events::ComponentEvent;
#[test]
fn test_parse_file_not_found_error() {
let parser = PostmapParser::new();
let message = "open /etc/config/transport: No such file or directory";
let result = parser.parse(message).unwrap();
if let ComponentEvent::Postmap(event) = result {
assert_eq!(event.event_type, PostmapEventType::FileError);
assert_eq!(event.details.error_type, ErrorType::FileNotFound);
assert_eq!(
event.details.file_path,
Some("/etc/config/transport".to_string())
);
assert_eq!(event.details.error_message, "No such file or directory");
} else {
panic!("Expected Postmap event");
}
}
#[test]
fn test_parse_directory_not_found_error() {
let parser = PostmapParser::new();
let message = "open /etc/postfix/: No such file or directory";
let result = parser.parse(message).unwrap();
if let ComponentEvent::Postmap(event) = result {
assert_eq!(event.event_type, PostmapEventType::FileError);
assert_eq!(event.details.error_type, ErrorType::DirectoryNotFound);
assert_eq!(event.details.file_path, Some("/etc/postfix/".to_string()));
} else {
panic!("Expected Postmap event");
}
}
#[test]
fn test_parse_command_argument_error() {
let parser = PostmapParser::new();
let message = "specify -b -h or -m only with \"-q -\"";
let result = parser.parse(message).unwrap();
if let ComponentEvent::Postmap(event) = result {
assert_eq!(event.event_type, PostmapEventType::CommandError);
assert_eq!(event.details.error_type, ErrorType::InvalidCommandArgs);
assert_eq!(event.details.command_args, Some("-b -h -m".to_string()));
assert!(event
.details
.error_message
.contains("specify -b -h or -m only with"));
} else {
panic!("Expected Postmap event");
}
}
#[test]
fn test_parse_sender_blacklist_error() {
let parser = PostmapParser::new();
let message = "open /etc/postfix/sender_blacklist: No such file or directory";
let result = parser.parse(message).unwrap();
if let ComponentEvent::Postmap(event) = result {
assert_eq!(event.event_type, PostmapEventType::FileError);
assert_eq!(event.details.error_type, ErrorType::FileNotFound);
assert_eq!(
event.details.file_path,
Some("/etc/postfix/sender_blacklist".to_string())
);
} else {
panic!("Expected Postmap event");
}
}
#[test]
fn test_parse_postmap_file_error() {
let parser = PostmapParser::new();
let message = "open postmap: No such file or directory";
let result = parser.parse(message).unwrap();
if let ComponentEvent::Postmap(event) = result {
assert_eq!(event.event_type, PostmapEventType::FileError);
assert_eq!(event.details.error_type, ErrorType::FileNotFound);
assert_eq!(event.details.file_path, Some("postmap".to_string()));
} else {
panic!("Expected Postmap event");
}
}
#[test]
fn test_component_name() {
let parser = PostmapParser::new();
assert_eq!(parser.component_name(), "postmap");
}
#[test]
fn test_parse_invalid_message() {
let parser = PostmapParser::new();
let message = "this is not a valid postmap message";
let result = parser.parse(message);
assert!(result.is_err());
}
#[test]
fn test_real_log_samples() {
let parser = PostmapParser::new();
let samples = [
"open /etc/config/transport: No such file or directory",
"open /etc/postfix/sender_blacklist: No such file or directory",
"specify -b -h or -m only with \"-q -\"",
"open postmap: No such file or directory",
];
for sample in &samples {
let result = parser.parse(sample);
assert!(result.is_ok(), "Failed to parse: {}", sample);
}
}