nstreams-core 0.2.2

Generic versioned event stream handler with history replay
Documentation
use nstreams_core::namespace::StreamNamespace;
use nstreams_core::store::EventStore;
use nstreams_core::stream::ReadStreamBackend;
use nstreams_core::testing::{payload, TestHarness};

#[tokio::test]
async fn worker_persists_without_piping_before_stream_ready() {
    let harness = TestHarness::new();
    let namespace = StreamNamespace::from("events.worker");
    let worker = harness.worker();
    let consumer = harness.write_queue.clone().consumer();

    harness
        .publisher
        .publish(&namespace, &payload(serde_json::json!({"queued": true})), None)
        .await
        .unwrap();

    tokio::spawn(async move {
        worker.run(consumer).await.unwrap();
    });

    tokio::time::sleep(std::time::Duration::from_millis(50)).await;

    let version = harness.store.latest_version(&namespace).await.unwrap();
    assert_eq!(version, Some(1));
    assert!(!harness.read_stream.stream_exists(&namespace).await.unwrap());
}

#[tokio::test]
async fn worker_pipes_to_read_stream_after_subscribe() {
    let harness = TestHarness::new();
    let namespace = StreamNamespace::from("events.pipe");
    let worker = harness.worker();
    let consumer = harness.write_queue.clone().consumer();

    tokio::spawn(async move {
        worker.run(consumer).await.unwrap();
    });

    harness.handler.subscribe(&namespace, 0).await.unwrap();
    tokio::time::sleep(std::time::Duration::from_millis(50)).await;

    harness
        .publisher
        .publish(&namespace, &payload(serde_json::json!({"piped": true})), None)
        .await
        .unwrap();

    tokio::time::sleep(std::time::Duration::from_millis(50)).await;

    let version = harness.store.latest_version(&namespace).await.unwrap();
    assert_eq!(version, Some(1));
    assert!(harness.handler.is_read_stream_ready(&namespace).await);
}

#[tokio::test]
async fn publish_assigns_monotonic_versions() {
    let harness = TestHarness::new();
    let namespace = StreamNamespace::from("events.versions");

    let first = harness
        .store
        .persist_next(&namespace, &payload(serde_json::json!(1)), None)
        .await
        .unwrap();
    let second = harness
        .store
        .persist_next(&namespace, &payload(serde_json::json!(2)), None)
        .await
        .unwrap();

    assert_eq!(first.version, 1);
    assert_eq!(second.version, 2);
}