58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
use super::*;
|
|
use domain::{
|
|
events::DomainEvent,
|
|
value_objects::{ExternalMetadataId, MovieId},
|
|
};
|
|
use futures::StreamExt;
|
|
|
|
fn movie_discovered() -> DomainEvent {
|
|
DomainEvent::MovieDiscovered {
|
|
movie_id: MovieId::generate(),
|
|
external_metadata_id: ExternalMetadataId::new("tt1234567".into()).unwrap(),
|
|
}
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn consumer_yields_published_events() {
|
|
let config = EventPublisherConfig { channel_buffer: 8 };
|
|
let (publisher, consumer) = create_event_channel(config);
|
|
|
|
publisher.publish(&movie_discovered()).await.unwrap();
|
|
drop(publisher);
|
|
|
|
let mut stream = consumer.consume();
|
|
let envelope = stream.next().await.unwrap().unwrap();
|
|
assert!(matches!(
|
|
envelope.event,
|
|
DomainEvent::MovieDiscovered { .. }
|
|
));
|
|
assert!(stream.next().await.is_none());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn consumer_yields_multiple_events_in_order() {
|
|
let config = EventPublisherConfig { channel_buffer: 8 };
|
|
let (publisher, consumer) = create_event_channel(config);
|
|
|
|
publisher.publish(&movie_discovered()).await.unwrap();
|
|
publisher.publish(&movie_discovered()).await.unwrap();
|
|
drop(publisher);
|
|
|
|
let mut stream = consumer.consume();
|
|
let first = stream.next().await.unwrap().unwrap();
|
|
let second = stream.next().await.unwrap().unwrap();
|
|
assert!(matches!(first.event, DomainEvent::MovieDiscovered { .. }));
|
|
assert!(matches!(second.event, DomainEvent::MovieDiscovered { .. }));
|
|
assert!(stream.next().await.is_none());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn stream_ends_when_publisher_dropped() {
|
|
let config = EventPublisherConfig { channel_buffer: 8 };
|
|
let (publisher, consumer) = create_event_channel(config);
|
|
drop(publisher);
|
|
|
|
let mut stream = consumer.consume();
|
|
assert!(stream.next().await.is_none());
|
|
}
|