commit aa399fc5f4fe81abf35272d44e929e46576c86ef
parent b5f18ef93b3d14039753e6279bdd0b049b41433a
Author: triesap <tyson@radroots.org>
Date: Sun, 21 Jun 2026 20:53:46 +0000
events-codec: expand order encode coverage
- Cover revision proposal and decision chain-context mismatch exits.
- Cover order envelope tag-build error propagation from the encode helper.
- Validate focused order tests, full radroots_events_codec tests, crate check, diff check, and refreshed coverage run.
Diffstat:
2 files changed, 64 insertions(+), 4 deletions(-)
diff --git a/crates/events_codec/src/order/decode.rs b/crates/events_codec/src/order/decode.rs
@@ -413,11 +413,14 @@ mod tests {
order_event_context_from_tags, order_request_from_event,
order_revision_decision_from_event, order_revision_proposal_from_event,
};
- use crate::order::encode::{
- order_cancellation_event_build, order_decision_event_build, order_request_event_build,
- order_revision_decision_event_build, order_revision_proposal_event_build,
- };
use crate::order::tags::TAG_LISTING_EVENT;
+ use crate::{
+ error::EventEncodeError,
+ order::encode::{
+ order_cancellation_event_build, order_decision_event_build, order_request_event_build,
+ order_revision_decision_event_build, order_revision_proposal_event_build,
+ },
+ };
use radroots_core::{
RadrootsCoreCurrency, RadrootsCoreDecimal, RadrootsCoreMoney, RadrootsCoreUnit,
};
@@ -809,6 +812,46 @@ mod tests {
}
#[test]
+ fn order_revision_builders_reject_mismatched_chain_context() {
+ let proposal = order_revision_proposal();
+ let wrong_root = event_id('9');
+ let wrong_prev = event_id('8');
+
+ let err =
+ order_revision_proposal_event_build(&wrong_root, &proposal.prev_event_id, &proposal)
+ .unwrap_err();
+ assert!(matches!(
+ err,
+ EventEncodeError::InvalidField("root_event_id")
+ ));
+
+ let err =
+ order_revision_proposal_event_build(&proposal.root_event_id, &wrong_prev, &proposal)
+ .unwrap_err();
+ assert!(matches!(
+ err,
+ EventEncodeError::InvalidField("prev_event_id")
+ ));
+
+ let decision = order_revision_decision(RadrootsOrderRevisionOutcome::Accepted);
+ let err =
+ order_revision_decision_event_build(&wrong_root, &decision.prev_event_id, &decision)
+ .unwrap_err();
+ assert!(matches!(
+ err,
+ EventEncodeError::InvalidField("root_event_id")
+ ));
+
+ let err =
+ order_revision_decision_event_build(&decision.root_event_id, &wrong_prev, &decision)
+ .unwrap_err();
+ assert!(matches!(
+ err,
+ EventEncodeError::InvalidField("prev_event_id")
+ ));
+ }
+
+ #[test]
fn order_cancellation_builder_emits_canonical_buyer_chain_shape() {
let payload = order_cancelled();
let root_event_id = event_id('1');
diff --git a/crates/events_codec/src/order/encode.rs b/crates/events_codec/src/order/encode.rs
@@ -239,6 +239,7 @@ mod tests {
};
use crate::error::EventEncodeError;
use radroots_events::{
+ RadrootsNostrEventPtr,
ids::RadrootsEventId,
order::{RadrootsOrderEnvelopeError, RadrootsOrderEventType, RadrootsOrderPayloadError},
};
@@ -398,6 +399,22 @@ mod tests {
})
.unwrap_err();
assert_empty_required(missing_prev, "prev_event_id");
+
+ let invalid_listing_event = order_envelope_event_build(OrderEnvelopeEventBuildParts {
+ recipient_pubkey: "recipient",
+ message_type: RadrootsOrderEventType::OrderRequested,
+ listing_addr: "listing-address",
+ order_id: "order-1",
+ listing_event: Some(&RadrootsNostrEventPtr {
+ id: String::new(),
+ relays: None,
+ }),
+ root_event_id: None,
+ prev_event_id: None,
+ payload: &payload,
+ })
+ .unwrap_err();
+ assert_empty_required(invalid_listing_event, "listing_event.id");
}
fn assert_empty_required(error: EventEncodeError, field: &'static str) {