lib

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

commit 7a8287d9b8ab4c5fda63f20a849b6b06a868a6b4
parent 90c9102094b19d0f24cb54f096f0b60c54cab73d
Author: triesap <tyson@radroots.org>
Date:   Fri, 10 Apr 2026 06:32:01 +0000

events_codec: cover trade tag builder branches

Diffstat:
Mcrates/events_codec/src/trade/tags.rs | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 104 insertions(+), 0 deletions(-)

diff --git a/crates/events_codec/src/trade/tags.rs b/crates/events_codec/src/trade/tags.rs @@ -240,6 +240,7 @@ mod tests { parse_trade_prev_tag, parse_trade_root_tag, push_trade_chain_tags, trade_envelope_tags, validate_trade_chain, }; + use crate::error::EventEncodeError; use radroots_events::{ RadrootsNostrEventPtr, kinds::KIND_LISTING, @@ -295,6 +296,109 @@ mod tests { } #[test] + fn trade_envelope_tags_support_snapshot_without_relay() { + let listing_addr = format!("{KIND_LISTING}:pubkey:AAAAAAAAAAAAAAAAAAAAAg"); + let tags = trade_envelope_tags( + "buyer", + &listing_addr, + None::<&str>, + Some(&RadrootsNostrEventPtr { + id: "listing-snapshot".into(), + relays: None, + }), + Some("root-event"), + None::<&str>, + ) + .expect("trade tags"); + assert_eq!( + tags, + vec![ + vec![String::from("p"), String::from("buyer")], + vec![String::from("a"), listing_addr], + vec![ + String::from(TAG_LISTING_EVENT), + String::from("listing-snapshot"), + ], + vec![String::from(TAG_E_ROOT), String::from("root-event")], + ] + ); + } + + #[test] + fn trade_envelope_tags_reject_empty_required_fields() { + let listing_addr = format!("{KIND_LISTING}:pubkey:AAAAAAAAAAAAAAAAAAAAAg"); + + let err = trade_envelope_tags(" ", &listing_addr, None::<&str>, None, None, None) + .expect_err("blank recipient"); + assert!(matches!( + err, + EventEncodeError::EmptyRequiredField("recipient_pubkey") + )); + + let err = trade_envelope_tags("buyer", " ", None::<&str>, None, None, None) + .expect_err("blank listing address"); + assert!(matches!( + err, + EventEncodeError::EmptyRequiredField("listing_addr") + )); + + let err = trade_envelope_tags("buyer", &listing_addr, Some(" "), None, None, None) + .expect_err("blank order id"); + assert!(matches!( + err, + EventEncodeError::EmptyRequiredField("order_id") + )); + + let err = trade_envelope_tags( + "buyer", + &listing_addr, + None::<&str>, + Some(&RadrootsNostrEventPtr { + id: " ".into(), + relays: None, + }), + None, + None, + ) + .expect_err("blank listing snapshot id"); + assert!(matches!( + err, + EventEncodeError::EmptyRequiredField("listing_event.id") + )); + + let err = trade_envelope_tags( + "buyer", + &listing_addr, + None::<&str>, + Some(&RadrootsNostrEventPtr { + id: "listing-snapshot".into(), + relays: Some(" ".into()), + }), + None, + None, + ) + .expect_err("blank listing snapshot relay"); + assert!(matches!( + err, + EventEncodeError::EmptyRequiredField("listing_event.relays") + )); + + let err = trade_envelope_tags("buyer", &listing_addr, None::<&str>, None, Some(" "), None) + .expect_err("blank root event id"); + assert!(matches!( + err, + EventEncodeError::EmptyRequiredField("root_event_id") + )); + + let err = trade_envelope_tags("buyer", &listing_addr, None::<&str>, None, None, Some(" ")) + .expect_err("blank prev event id"); + assert!(matches!( + err, + EventEncodeError::EmptyRequiredField("prev_event_id") + )); + } + + #[test] fn trade_envelope_tag_parsers_cover_public_context() { let tags = vec![ vec!["p".into(), "counterparty".into()],