ref:main
use std::fs;
use std::time::Duration;
use tempfile::NamedTempFile;
#[test]
fn test_audit_log_writes_jsonl() {
let tmp = NamedTempFile::new().unwrap();
let path = tmp.path().to_str().unwrap();
let logger = huorn_minecraft::audit::AuditLogger::new(path).unwrap();
logger.log_event("CONNECT", r#"{"player":"abc-123","name":"Steve"}"#);
let contents = fs::read_to_string(path).unwrap();
let line = contents.trim();
assert!(line.contains(r#""event":"CONNECT""#));
assert!(line.contains(r#""player":"abc-123""#));
assert!(line.contains(r#""ts":"#));
}
#[test]
fn test_audit_log_empty_payload() {
let tmp = NamedTempFile::new().unwrap();
let path = tmp.path().to_str().unwrap();
let logger = huorn_minecraft::audit::AuditLogger::new(path).unwrap();
logger.log_event("TEST", "{}");
let contents = fs::read_to_string(path).unwrap();
assert!(contents.contains(r#""event":"TEST""#));
}
#[test]
fn test_audit_log_multiple_events() {
let tmp = NamedTempFile::new().unwrap();
let path = tmp.path().to_str().unwrap();
let logger = huorn_minecraft::audit::AuditLogger::new(path).unwrap();
logger.log_event("CONNECT", r#"{"player":"a"}"#);
logger.log_event("COMMAND", r#"{"player":"a","input":"ls"}"#);
logger.log_event("DISCONNECT", r#"{"player":"a"}"#);
let contents = fs::read_to_string(path).unwrap();
let lines: Vec<&str> = contents.trim().lines().collect();
assert_eq!(lines.len(), 3);
}
#[test]
fn test_idle_timeout_detects_idle() {
let mut tracker = huorn_minecraft::audit::IdleTracker::new(Duration::from_millis(50));
tracker.register(1);
std::thread::sleep(Duration::from_millis(100));
let expired = tracker.check_expired();
assert_eq!(expired, vec![1]);
}
#[test]
fn test_idle_timeout_resets_on_touch() {
let mut tracker = huorn_minecraft::audit::IdleTracker::new(Duration::from_millis(200));
tracker.register(1);
std::thread::sleep(Duration::from_millis(100));
tracker.touch(1);
std::thread::sleep(Duration::from_millis(100));
let expired = tracker.check_expired();
assert!(expired.is_empty());
}
#[test]
fn test_idle_timeout_unregister() {
let mut tracker = huorn_minecraft::audit::IdleTracker::new(Duration::from_millis(10));
tracker.register(1);
tracker.register(2);
tracker.unregister(1);
std::thread::sleep(Duration::from_millis(50));
let expired = tracker.check_expired();
assert_eq!(expired, vec![2]);
}