#![cfg_attr(not(test), allow(dead_code, unused_imports))]
use ruststream::memory::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Deserialize, Serialize, Outgoing)]
#[outgoing(name = "audit")]
struct Entry {
id: u64,
}
fn broker() -> MemoryBroker<Retaining> {
MemoryBroker::retaining(Retention::Messages(nonzero!(2)))
}
#[subscriber("audit", start_at(MemoryPosition::start()))]
async fn record(entry: &Entry) -> HandlerOutcome {
tracing::info!(entry.id, "recorded");
HandlerOutcome::ack()
}
fn app(broker: MemoryBroker<Retaining>) -> impl App {
RustStream::new(AppInfo::new("audit", "0.1.0")).with_broker(broker, |b| {
b.include(record);
})
}
fn main() {}
#[cfg(test)]
mod tests {
use std::error::Error;
use ruststream::memory::prelude::*;
use ruststream::testing::TestApp;
use super::{Entry, app, broker};
#[tokio::test]
async fn only_the_newest_two_are_replayed() -> Result<(), Box<dyn Error>> {
let broker = broker();
let publisher = broker.publisher();
for id in [1, 2, 3] {
publisher.message(&Entry { id }).publish().await?;
}
let tb = TestApp::start(app(broker)).await?;
tb.settle().await?;
let ids: Vec<u64> = tb
.broker::<MemoryBroker<Retaining>>()
.subscriber("audit")
.received::<Entry>()
.iter()
.map(|entry| entry.id)
.collect();
assert_eq!(ids, [2, 3]);
Ok(())
}
}