lib

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

commit 74946e23190d31c20da9348504aa5ec76c3ba7b8
parent 1e0c91b479674149b6069629893d8de8af0b2d23
Author: triesap <tyson@radroots.org>
Date:   Sun, 21 Jun 2026 20:03:38 +0000

events-codec: expand listing decode coverage

- Cover listing parsed-data and parsed-event wrapper constructors.

- Exercise remaining listing decode edge branches for empty tags, plot refs, primary-bin conflicts, and availability-start parsing.

- Validate listing integration test, full radroots_events_codec tests, check, diff check, and refreshed coverage run.

Diffstat:
Mcrates/events_codec/tests/listing.rs | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 91 insertions(+), 2 deletions(-)

diff --git a/crates/events_codec/tests/listing.rs b/crates/events_codec/tests/listing.rs @@ -5,8 +5,8 @@ use radroots_core::{ RadrootsCoreDiscountThreshold, RadrootsCoreDiscountValue, RadrootsCoreMoney, RadrootsCoreQuantity, RadrootsCoreQuantityPrice, RadrootsCoreUnit, }; -use radroots_events::tags::{TAG_D, TAG_PUBLISHED_AT}; use radroots_events::{ + RadrootsNostrEvent, farm::RadrootsFarmRef, ids::{RadrootsDTag, RadrootsInventoryBinId}, kinds::{ @@ -19,9 +19,13 @@ use radroots_events::{ }, plot::RadrootsPlotRef, resource_area::RadrootsResourceAreaRef, + tags::{TAG_D, TAG_PUBLISHED_AT}, }; use radroots_events_codec::error::{EventEncodeError, EventParseError}; -use radroots_events_codec::listing::decode::listing_from_event; +use radroots_events_codec::listing::decode::{ + data_from_event, data_from_nostr_event, listing_from_event, parsed_from_event, + parsed_from_nostr_event, +}; use radroots_events_codec::listing::encode::{ listing_build_tags, to_wire_parts, to_wire_parts_with_kind, }; @@ -639,6 +643,91 @@ fn listing_from_event_covers_trade_location_delivery_and_image_paths() { } #[test] +fn listing_from_event_covers_remaining_edge_paths() { + let mut tags = sample_listing_tags(); + tags.insert(0, Vec::new()); + tags.push(vec!["location".to_string()]); + let decoded = listing_from_event(KIND_LISTING, &tags, "# Widget").unwrap(); + assert_eq!(decoded.product.location, None); + + let mut tags = sample_listing_tags(); + tags.push(vec![ + "radroots:plot".to_string(), + format!("{KIND_PLOT}::AAAAAAAAAAAAAAAAAAAAAw"), + ]); + assert_invalid_tag(tags, "radroots:plot"); + + let mut tags = sample_listing_tags(); + tags.push(vec![ + "radroots:primary_bin".to_string(), + "bin-2".to_string(), + ]); + assert_invalid_tag(tags, "radroots:primary_bin"); + + let mut tags = sample_listing_tags(); + tags.push(vec!["radroots:availability_start".to_string()]); + assert_invalid_tag(tags, "radroots:availability_start"); + + let mut tags = sample_listing_tags(); + tags.push(vec![ + "radroots:availability_start".to_string(), + "bad".to_string(), + ]); + assert_invalid_tag(tags, "radroots:availability_start"); +} + +#[test] +fn listing_parsed_wrappers_preserve_event_metadata() { + let listing = sample_listing("AAAAAAAAAAAAAAAAAAAAAQ"); + let parts = to_wire_parts(&listing).unwrap(); + let data = data_from_event( + "event-id".to_string(), + "author-pubkey".to_string(), + 7, + parts.kind, + parts.content.clone(), + parts.tags.clone(), + ) + .unwrap(); + assert_eq!(data.id, "event-id"); + assert_eq!(data.author, "author-pubkey"); + assert_eq!(data.published_at, 7); + assert_eq!(data.kind, KIND_LISTING); + assert_eq!(data.data.d_tag, listing.d_tag); + + let parsed = parsed_from_event( + "event-id".to_string(), + "author-pubkey".to_string(), + 7, + parts.kind, + parts.content.clone(), + parts.tags.clone(), + "sig".to_string(), + ) + .unwrap(); + assert_eq!(parsed.event.id, "event-id"); + assert_eq!(parsed.event.author, "author-pubkey"); + assert_eq!(parsed.event.created_at, 7); + assert_eq!(parsed.event.sig, "sig"); + assert_eq!(parsed.data.data.d_tag, listing.d_tag); + + let event = RadrootsNostrEvent { + id: "event-id".to_string(), + author: "author-pubkey".to_string(), + created_at: 7, + kind: parts.kind, + tags: parts.tags, + content: parts.content, + sig: "sig".to_string(), + }; + let data = data_from_nostr_event(&event).unwrap(); + assert_eq!(data.data.d_tag, listing.d_tag); + let parsed = parsed_from_nostr_event(&event).unwrap(); + assert_eq!(parsed.event.sig, "sig"); + assert_eq!(parsed.data.data.d_tag, listing.d_tag); +} + +#[test] fn draft_listing_roundtrip_from_event() { let mut listing = sample_listing("AAAAAAAAAAAAAAAAAAAAAQ"); listing.published_at = Some(1_781_895_600);