#[cfg(test)]
use serde_json::value::Value;
use slog_extlog::slog_test;
pub struct CapturingLogger {
pub(crate) logger: slog::Logger,
buffer: iobuffer::IoBuffer,
}
impl CapturingLogger {
pub fn new() -> Self {
let buffer = iobuffer::IoBuffer::new();
let logger = slog_test::new_test_logger(buffer.clone());
Self { logger, buffer }
}
pub fn logs(&mut self) -> Vec<Value> {
slog_test::read_json_values(&mut self.buffer)
}
pub fn visible_logs(&mut self) -> Vec<Value> {
let logs = self.logs();
logs.iter()
.filter(|log| log["level"].as_str().unwrap().ne("DEBG"))
.map(|log| log.clone())
.collect()
}
}
pub fn assert_log_messages_are(actual_logs: Vec<Value>, expected_logs: Vec<&Value>) {
assert_eq!(
actual_logs.len(),
expected_logs.len(),
"Log lengths do not match. Found:\n{:?}",
actual_logs,
);
for (actual, expected) in actual_logs.iter().zip(expected_logs.iter()) {
slog_test::assert_json_matches(actual, expected);
}
}