sova-rabbit 0.1.1

RabbitMQ / AMQP broker plugin for Sova (raw publish/consume + fake)
use bytes::Bytes;
use sova_core::{App, Request, ResponseAssert, TestClient};
use sova_rabbit::{Broker, Exchange, FakeBroker, QueueOpts, Rabbit, RabbitExt};

#[tokio::test]
async fn fake_publish_consume_ack() {
    let fake = FakeBroker::new();
    let mut app = App::new();
    app.install(Rabbit::fake(fake.clone()));
    app.post("/send", |req: Request| async move {
        let ex = Exchange::topic("events");
        req.rabbit().declare_exchange(&ex).await.unwrap();
        req.rabbit()
            .declare_queue("jobs", &QueueOpts::durable())
            .await
            .unwrap();
        req.rabbit().bind("jobs", "events", "user.*").await.unwrap();
        req.rabbit()
            .publish(&ex, "user.created", Bytes::from_static(b"{\"id\":1}"))
            .await
            .unwrap();
        sova_core::Json(serde_json::json!({ "ok": true }))
    });

    let c = TestClient::new(app).unwrap();
    c.post("/send").await.assert_status(200);

    let msg = fake.consume_one("jobs").await.unwrap().expect("msg");
    assert_eq!(msg.routing_key, "user.created");
    assert_eq!(msg.body.as_ref(), b"{\"id\":1}");
    msg.ack().await.unwrap();
    assert_eq!(fake.queue_len("jobs"), 0);
}

#[tokio::test]
async fn fake_nack_to_dlq() {
    let fake = FakeBroker::new();
    fake.declare_exchange(&Exchange::direct("dlx"))
        .await
        .unwrap();
    fake.declare_queue("dlq", &QueueOpts::durable())
        .await
        .unwrap();
    fake.bind("dlq", "dlx", "jobs").await.unwrap();
    fake.declare_queue("jobs", &QueueOpts::durable().with_dlq("dlx", "jobs"))
        .await
        .unwrap();
    fake.declare_exchange(&Exchange::direct("main"))
        .await
        .unwrap();
    fake.bind("jobs", "main", "k").await.unwrap();
    fake.publish(&Exchange::direct("main"), "k", Bytes::from_static(b"x"))
        .await
        .unwrap();

    let msg = fake.consume_one("jobs").await.unwrap().unwrap();
    msg.nack(false).await.unwrap();
    assert_eq!(fake.queue_len("dlq"), 1);
}