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);
}