lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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:
Mcrates/events_codec/src/order/decode.rs | 51+++++++++++++++++++++++++++++++++++++++++++++++----
Mcrates/events_codec/src/order/encode.rs | 17+++++++++++++++++
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) {