feat: worker relays outbox to nats
This commit is contained in:
46
crates/adapters/nats/src/tests/consumer.rs
Normal file
46
crates/adapters/nats/src/tests/consumer.rs
Normal file
@@ -0,0 +1,46 @@
|
||||
use super::*;
|
||||
use domain::value_objects::UserId;
|
||||
use event_payload::{EventMessage, EventPayload};
|
||||
use uuid::Uuid;
|
||||
|
||||
fn payload() -> EventPayload {
|
||||
EventPayload::from(&DomainEvent::UserUpdated {
|
||||
user_id: UserId::from_uuid(Uuid::new_v4()),
|
||||
})
|
||||
}
|
||||
|
||||
fn encode(event_id: Option<&str>) -> Vec<u8> {
|
||||
serde_json::to_vec(&EventMessage {
|
||||
event_id: event_id.map(str::to_owned),
|
||||
payload: payload(),
|
||||
})
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_message_reads_the_event_id() {
|
||||
let id = Uuid::new_v4();
|
||||
let (decoded, event) = decode_message(&encode(Some(&id.to_string()))).unwrap();
|
||||
assert_eq!(decoded.unwrap().value(), id);
|
||||
assert!(matches!(event, DomainEvent::UserUpdated { .. }));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_message_accepts_a_legacy_payload_without_an_id() {
|
||||
let legacy = serde_json::to_vec(&payload()).unwrap();
|
||||
let (decoded, _) = decode_message(&legacy).unwrap();
|
||||
assert!(decoded.is_none());
|
||||
let (decoded, _) = decode_message(&encode(None)).unwrap();
|
||||
assert!(decoded.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_message_rejects_a_malformed_id() {
|
||||
let err = decode_message(&encode(Some("not-a-uuid"))).unwrap_err();
|
||||
assert!(err.to_string().contains("event_id"), "{err}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_message_rejects_garbage() {
|
||||
assert!(decode_message(b"{not json").is_err());
|
||||
}
|
||||
37
crates/adapters/nats/src/tests/relay.rs
Normal file
37
crates/adapters/nats/src/tests/relay.rs
Normal file
@@ -0,0 +1,37 @@
|
||||
use super::*;
|
||||
use domain::value_objects::UserId;
|
||||
use uuid::Uuid;
|
||||
|
||||
fn event() -> DomainEvent {
|
||||
DomainEvent::UserUpdated {
|
||||
user_id: UserId::from_uuid(Uuid::new_v4()),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn relaying_the_same_row_twice_sets_the_same_msg_id() {
|
||||
let id = EventId::new();
|
||||
let event = event();
|
||||
let first = relay_message("p", Some(&id), &event).unwrap();
|
||||
let second = relay_message("p", Some(&id), &event).unwrap();
|
||||
assert_eq!(first.msg_id, Some(id.value().to_string()));
|
||||
assert_eq!(first.msg_id, second.msg_id);
|
||||
assert_eq!(first.subject, "p.user.updated");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_legacy_row_without_an_id_has_no_msg_id() {
|
||||
let message = relay_message("p", None, &event()).unwrap();
|
||||
assert_eq!(message.msg_id, None);
|
||||
let decoded: serde_json::Value = serde_json::from_slice(&message.payload).unwrap();
|
||||
assert!(decoded.get("event_id").is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_body_carries_the_event_id_for_the_consumer() {
|
||||
let id = EventId::new();
|
||||
let message = relay_message("p", Some(&id), &event()).unwrap();
|
||||
let decoded: serde_json::Value = serde_json::from_slice(&message.payload).unwrap();
|
||||
assert_eq!(decoded["event_id"], id.value().to_string());
|
||||
assert_eq!(decoded["type"], "UserUpdated");
|
||||
}
|
||||
Reference in New Issue
Block a user