rabbit_warren 0.1.0

An ergonomic, production-ready RabbitMQ client built on top of lapin, featuring automatic ack/nack strategies and distributed tracing.
use std::fmt;

use crate::{AckAction, ProcessingError, ResultExt};

#[derive(Debug, PartialEq)]
struct DummyError(&'static str);

impl fmt::Display for DummyError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.0)
    }
}

#[test]
fn test_processing_error_constructors() {
    let err = DummyError("test error");

    let retryable = ProcessingError::retryable(&err);
    assert_eq!(retryable.action, AckAction::Requeue);
    assert_eq!(retryable.error.0, "test error");

    let permanent = ProcessingError::permanent(err);
    assert_eq!(permanent.action, AckAction::Discard);
}

#[test]
fn test_result_ext_requeue_on_err() {
    let res: Result<i32, DummyError> = Err(DummyError("db timeout"));
    let wrapped = res.requeue_on_err();

    assert!(wrapped.is_err());
    let err = wrapped.unwrap_err();
    assert_eq!(err.action, AckAction::Requeue);
    assert_eq!(err.error.0, "db timeout");
}

#[test]
fn test_result_ext_discard_on_err() {
    let res: Result<i32, DummyError> = Err(DummyError("invalid json"));
    let wrapped = res.discard_on_err();

    assert!(wrapped.is_err());
    let err = wrapped.unwrap_err();
    assert_eq!(err.action, AckAction::Discard);
}

#[test]
fn test_result_ext_with_custom_ack_action() {
    let res: Result<i32, DummyError> = Err(DummyError("custom logic"));
    let wrapped = res.with_ack_action(AckAction::Ack);

    assert!(wrapped.is_err());
    let err = wrapped.unwrap_err();
    assert_eq!(err.action, AckAction::Ack);
}