lib

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

commit 917d826f04a5555399514875d8963aa17ff819a8
parent 7940737d0dfa008579c71f2f5be7073631b7f3fd
Author: triesap <tyson@radroots.org>
Date:   Fri, 12 Jun 2026 23:06:08 -0700

sdk: align tests with typed ids

- parse typed listing, order, quote, and bin identifiers in SDK fixtures
- use deterministic 64-hex pubkeys for parsed listing addresses
- update tag assertions to compare stringified typed payload fields
- keep SDK all-features tests green after identifier hardening

Diffstat:
Mcrates/sdk/tests/client.rs | 70++++++++++++++++++++++++++++++++++++++++++----------------------------
Mcrates/sdk/tests/facade.rs | 23++++++++++++++---------
Mcrates/sdk/tests/radrootsd.rs | 24++++++++++++++----------
Mcrates/sdk/tests/relay_direct.rs | 66+++++++++++++++++++++++++++++++++++++++---------------------------
4 files changed, 109 insertions(+), 74 deletions(-)

diff --git a/crates/sdk/tests/client.rs b/crates/sdk/tests/client.rs @@ -43,7 +43,7 @@ fn sample_farm() -> RadrootsFarm { fn sample_listing() -> RadrootsListing { RadrootsListing { - d_tag: "AAAAAAAAAAAAAAAAAAAAAg".into(), + d_tag: "AAAAAAAAAAAAAAAAAAAAAg".parse().expect("listing d tag"), published_at: None, farm: RadrootsFarmRef { pubkey: "seller".into(), @@ -60,9 +60,9 @@ fn sample_listing() -> RadrootsListing { profile: None, year: None, }, - primary_bin_id: "bin-1".into(), + primary_bin_id: "bin-1".parse().expect("primary bin id"), bins: vec![RadrootsListingBin { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), quantity: RadrootsCoreQuantity::new( RadrootsCoreDecimal::from(1000u32), RadrootsCoreUnit::MassG, @@ -136,21 +136,23 @@ fn listing_event_ptr() -> RadrootsNostrEventPtr { fn sample_order_request(buyer_pubkey: String, seller_pubkey: String) -> RadrootsOrderRequest { RadrootsOrderRequest { - order_id: "order-1".into(), - listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, items: vec![RadrootsOrderItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, }], economics: RadrootsOrderEconomics { - quote_id: "quote-1".into(), + quote_id: "quote-1".parse().expect("quote id"), quote_version: 1, pricing_basis: RadrootsOrderPricingBasis::ListingEvent, currency: RadrootsCoreCurrency::USD, items: vec![RadrootsOrderEconomicItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, quantity_amount: decimal("1"), quantity_unit: RadrootsCoreUnit::Each, @@ -170,13 +172,15 @@ fn sample_order_request(buyer_pubkey: String, seller_pubkey: String) -> Radroots fn sample_order_decision(buyer_pubkey: String, seller_pubkey: String) -> RadrootsOrderDecision { RadrootsOrderDecision { - order_id: "order-1".into(), - listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, decision: RadrootsOrderDecisionOutcome::Accepted { inventory_commitments: vec![RadrootsOrderInventoryCommitment { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, }], }, @@ -190,24 +194,26 @@ fn sample_order_revision_proposal( prev_event_id: String, ) -> RadrootsOrderRevisionProposal { RadrootsOrderRevisionProposal { - revision_id: "revision-1".into(), - order_id: "order-1".into(), - listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + revision_id: "revision-1".parse().expect("revision id"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, root_event_id, prev_event_id, items: vec![RadrootsOrderItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 3, }], economics: RadrootsOrderEconomics { - quote_id: "revision-quote-1".into(), + quote_id: "revision-quote-1".parse().expect("revision quote id"), quote_version: 2, pricing_basis: RadrootsOrderPricingBasis::ListingEvent, currency: RadrootsCoreCurrency::USD, items: vec![RadrootsOrderEconomicItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 3, quantity_amount: decimal("1"), quantity_unit: RadrootsCoreUnit::Each, @@ -247,8 +253,10 @@ fn sample_fulfillment_update( seller_pubkey: String, ) -> RadrootsOrderFulfillmentUpdate { RadrootsOrderFulfillmentUpdate { - order_id: "order-1".into(), - listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, status: RadrootsOrderFulfillmentState::ReadyForPickup, @@ -260,8 +268,10 @@ fn sample_order_cancellation( seller_pubkey: String, ) -> RadrootsOrderCancellation { RadrootsOrderCancellation { - order_id: "order-1".into(), - listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, reason: "schedule changed".into(), @@ -270,8 +280,10 @@ fn sample_order_cancellation( fn sample_buyer_receipt(buyer_pubkey: String, seller_pubkey: String) -> RadrootsOrderReceipt { RadrootsOrderReceipt { - order_id: "order-1".into(), - listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, received: true, @@ -432,7 +444,7 @@ fn namespace_clients_expose_parent_sdk_and_draft_facades() { assert_eq!(listing_draft.into_wire_parts().kind, KIND_LISTING); let mut invalid_listing = sample_listing(); - invalid_listing.d_tag.clear(); + invalid_listing.farm.pubkey.clear(); assert!(listing.build_draft(&invalid_listing).is_err()); } @@ -440,6 +452,8 @@ fn namespace_clients_expose_parent_sdk_and_draft_facades() { fn listing_and_order_clients_wrap_existing_sdk_facades() { let client = RadrootsSdkClient::from_config(RadrootsSdkConfig::local()).expect("sdk client"); let listing_value = sample_listing(); + let buyer_pubkey = "b".repeat(64); + let seller_pubkey = "a".repeat(64); let tags = client .listing() @@ -474,8 +488,8 @@ fn listing_and_order_clients_wrap_existing_sdk_facades() { .expect("validated listing"); assert_eq!(validated.listing_id, listing_value.d_tag); - let listing_addr = format!("{KIND_LISTING}:seller:{}", listing_value.d_tag); - let payload = sample_order_request("buyer".into(), "seller".into()); + let listing_addr = format!("{KIND_LISTING}:{seller_pubkey}:{}", listing_value.d_tag); + let payload = sample_order_request(buyer_pubkey.clone(), seller_pubkey.clone()); let envelope = client .order() .build_order_request_draft(&listing_event_ptr(), &payload) @@ -483,7 +497,7 @@ fn listing_and_order_clients_wrap_existing_sdk_facades() { assert_eq!(envelope.as_wire_parts().kind, KIND_ORDER_REQUEST); let envelope_event = RadrootsNostrEvent { id: "order-event-1".into(), - author: "buyer".into(), + author: buyer_pubkey, created_at: 2, kind: envelope.as_wire_parts().kind, tags: envelope.as_wire_parts().tags.clone(), @@ -688,7 +702,7 @@ fn order_draft_facades_return_encoder_errors() { let decision_event_id = "order-decision-event-1"; let mut invalid_order = sample_order_request(buyer_pubkey.clone(), seller_pubkey.clone()); - invalid_order.order_id.clear(); + invalid_order.buyer_pubkey.clear(); assert!( order .build_order_request_draft(&listing_event_ptr(), &invalid_order) diff --git a/crates/sdk/tests/facade.rs b/crates/sdk/tests/facade.rs @@ -46,7 +46,7 @@ fn sample_farm() -> RadrootsFarm { fn sample_listing() -> RadrootsListing { RadrootsListing { - d_tag: "AAAAAAAAAAAAAAAAAAAAAg".into(), + d_tag: "AAAAAAAAAAAAAAAAAAAAAg".parse().expect("listing d tag"), published_at: None, farm: RadrootsFarmRef { pubkey: "seller".into(), @@ -63,9 +63,9 @@ fn sample_listing() -> RadrootsListing { profile: None, year: None, }, - primary_bin_id: "bin-1".into(), + primary_bin_id: "bin-1".parse().expect("primary bin id"), bins: vec![RadrootsListingBin { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), quantity: RadrootsCoreQuantity::new( RadrootsCoreDecimal::from(1000u32), RadrootsCoreUnit::MassG, @@ -128,22 +128,26 @@ fn listing_event_ptr() -> RadrootsNostrEventPtr { } fn sample_order_request() -> RadrootsOrderRequest { + let seller_pubkey = "a".repeat(64); + RadrootsOrderRequest { - order_id: "order-1".into(), - listing_addr: format!("{KIND_LISTING}:seller:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey: "buyer".into(), seller_pubkey: "seller".into(), items: vec![RadrootsOrderItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, }], economics: RadrootsOrderEconomics { - quote_id: "quote-1".into(), + quote_id: "quote-1".parse().expect("quote id"), quote_version: 1, pricing_basis: RadrootsOrderPricingBasis::ListingEvent, currency: RadrootsCoreCurrency::USD, items: vec![RadrootsOrderEconomicItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, quantity_amount: RadrootsCoreDecimal::from(1u32), quantity_unit: RadrootsCoreUnit::Each, @@ -231,7 +235,8 @@ fn listing_parse_rejects_non_listing_kind() { #[test] fn order_facade_wraps_build_parse_and_address_ops() { let listing_value = sample_listing(); - let listing_addr = format!("{KIND_LISTING}:seller:{}", listing_value.d_tag); + let seller_pubkey = "a".repeat(64); + let listing_addr = format!("{KIND_LISTING}:{seller_pubkey}:{}", listing_value.d_tag); let payload = sample_order_request(); let parts = order::build_order_request_draft(&listing_event_ptr(), &payload).expect("order draft"); diff --git a/crates/sdk/tests/radrootsd.rs b/crates/sdk/tests/radrootsd.rs @@ -319,7 +319,7 @@ async fn write_http_response( fn sample_listing() -> RadrootsListing { RadrootsListing { - d_tag: "AAAAAAAAAAAAAAAAAAAAAg".into(), + d_tag: "AAAAAAAAAAAAAAAAAAAAAg".parse().expect("listing d tag"), published_at: None, farm: RadrootsFarmRef { pubkey: "seller".into(), @@ -336,9 +336,9 @@ fn sample_listing() -> RadrootsListing { profile: None, year: None, }, - primary_bin_id: "bin-1".into(), + primary_bin_id: "bin-1".parse().expect("primary bin id"), bins: vec![RadrootsListingBin { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), quantity: RadrootsCoreQuantity::new( RadrootsCoreDecimal::from(1000u32), RadrootsCoreUnit::MassG, @@ -416,12 +416,12 @@ fn sample_farm() -> RadrootsFarm { fn sample_order_request_economics() -> RadrootsOrderEconomics { RadrootsOrderEconomics { - quote_id: "quote-1".to_owned(), + quote_id: "quote-1".parse().expect("quote id"), quote_version: 1, pricing_basis: RadrootsOrderPricingBasis::ListingEvent, currency: RadrootsCoreCurrency::USD, items: vec![RadrootsOrderEconomicItem { - bin_id: "bin-1".to_owned(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, quantity_amount: RadrootsCoreDecimal::from(1u32), quantity_unit: RadrootsCoreUnit::MassG, @@ -451,13 +451,17 @@ fn sample_order_request_economics() -> RadrootsOrderEconomics { } fn sample_order_request() -> RadrootsOrderRequest { + let seller_pubkey = "a".repeat(64); + RadrootsOrderRequest { - order_id: "order-1".to_owned(), - listing_addr: format!("{KIND_LISTING}:seller:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("{KIND_LISTING}:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey: "buyer".to_owned(), seller_pubkey: "seller".to_owned(), items: vec![RadrootsOrderItem { - bin_id: "bin-1".to_owned(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, }], economics: sample_order_request_economics(), @@ -1586,7 +1590,7 @@ async fn radrootsd_order_request_publish_accepts_session_handle() -> TestResult< "signer_session_id": "session-order-1", "event_kind": KIND_ORDER_REQUEST, "event_id": "event-order-1", - "event_addr": format!("{KIND_LISTING}:seller:AAAAAAAAAAAAAAAAAAAAAg"), + "event_addr": format!("{KIND_LISTING}:{}:AAAAAAAAAAAAAAAAAAAAAg", "a".repeat(64)), "relay_count": 1, "acknowledged_relay_count": 1 } @@ -1696,7 +1700,7 @@ async fn radrootsd_sdk_workflow_chains_session_listing_order_and_bridge_job() -> "signer_session_id": "session-workflow-1", "event_kind": KIND_ORDER_REQUEST, "event_id": "event-workflow-order", - "event_addr": format!("{KIND_LISTING}:seller:AAAAAAAAAAAAAAAAAAAAAg"), + "event_addr": format!("{KIND_LISTING}:{}:AAAAAAAAAAAAAAAAAAAAAg", "a".repeat(64)), "relay_count": 1, "acknowledged_relay_count": 1 } diff --git a/crates/sdk/tests/relay_direct.rs b/crates/sdk/tests/relay_direct.rs @@ -109,7 +109,7 @@ impl Drop for AckRelay { fn sample_listing() -> RadrootsListing { RadrootsListing { - d_tag: "AAAAAAAAAAAAAAAAAAAAAg".into(), + d_tag: "AAAAAAAAAAAAAAAAAAAAAg".parse().expect("listing d tag"), published_at: None, farm: RadrootsFarmRef { pubkey: "seller".into(), @@ -126,9 +126,9 @@ fn sample_listing() -> RadrootsListing { profile: None, year: None, }, - primary_bin_id: "bin-1".into(), + primary_bin_id: "bin-1".parse().expect("primary bin id"), bins: vec![RadrootsListingBin { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), quantity: RadrootsCoreQuantity::new( RadrootsCoreDecimal::from(1000u32), RadrootsCoreUnit::MassG, @@ -221,21 +221,23 @@ fn listing_event_ptr() -> RadrootsNostrEventPtr { fn sample_order_request(buyer_pubkey: String, seller_pubkey: String) -> RadrootsOrderRequest { RadrootsOrderRequest { - order_id: "order-1".into(), - listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, items: vec![RadrootsOrderItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, }], economics: RadrootsOrderEconomics { - quote_id: "quote-1".into(), + quote_id: "quote-1".parse().expect("quote id"), quote_version: 1, pricing_basis: RadrootsOrderPricingBasis::ListingEvent, currency: RadrootsCoreCurrency::USD, items: vec![RadrootsOrderEconomicItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, quantity_amount: decimal("1"), quantity_unit: RadrootsCoreUnit::Each, @@ -255,13 +257,15 @@ fn sample_order_request(buyer_pubkey: String, seller_pubkey: String) -> Radroots fn sample_order_decision(buyer_pubkey: String, seller_pubkey: String) -> RadrootsOrderDecision { RadrootsOrderDecision { - order_id: "order-1".into(), - listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, decision: RadrootsOrderDecisionOutcome::Accepted { inventory_commitments: vec![RadrootsOrderInventoryCommitment { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 2, }], }, @@ -275,24 +279,26 @@ fn sample_order_revision_proposal( prev_event_id: String, ) -> RadrootsOrderRevisionProposal { RadrootsOrderRevisionProposal { - revision_id: "revision-1".into(), - order_id: "order-1".into(), - listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + revision_id: "revision-1".parse().expect("revision id"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, root_event_id, prev_event_id, items: vec![RadrootsOrderItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 3, }], economics: RadrootsOrderEconomics { - quote_id: "revision-quote-1".into(), + quote_id: "revision-quote-1".parse().expect("revision quote id"), quote_version: 2, pricing_basis: RadrootsOrderPricingBasis::ListingEvent, currency: RadrootsCoreCurrency::USD, items: vec![RadrootsOrderEconomicItem { - bin_id: "bin-1".into(), + bin_id: "bin-1".parse().expect("bin id"), bin_count: 3, quantity_amount: decimal("1"), quantity_unit: RadrootsCoreUnit::Each, @@ -332,8 +338,10 @@ fn sample_fulfillment_update( seller_pubkey: String, ) -> RadrootsOrderFulfillmentUpdate { RadrootsOrderFulfillmentUpdate { - order_id: "order-1".into(), - listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, status: RadrootsOrderFulfillmentState::ReadyForPickup, @@ -345,8 +353,10 @@ fn sample_order_cancellation( seller_pubkey: String, ) -> RadrootsOrderCancellation { RadrootsOrderCancellation { - order_id: "order-1".into(), - listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, reason: "schedule changed".into(), @@ -355,8 +365,10 @@ fn sample_order_cancellation( fn sample_buyer_receipt(buyer_pubkey: String, seller_pubkey: String) -> RadrootsOrderReceipt { RadrootsOrderReceipt { - order_id: "order-1".into(), - listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg"), + order_id: "order-1".parse().expect("order id"), + listing_addr: format!("30402:{seller_pubkey}:AAAAAAAAAAAAAAAAAAAAAg") + .parse() + .expect("listing address"), buyer_pubkey, seller_pubkey, received: true, @@ -467,13 +479,13 @@ async fn relay_direct_order_request_publish_accepts_sdk_built_draft() -> TestRes relay_receipt .event .tags - .contains(&vec!["a".to_owned(), payload.listing_addr.clone()]) + .contains(&vec!["a".to_owned(), payload.listing_addr.to_string()]) ); assert!( relay_receipt .event .tags - .contains(&vec!["d".to_owned(), payload.order_id.clone()]) + .contains(&vec!["d".to_owned(), payload.order_id.to_string()]) ); assert!(relay_receipt.event.tags.contains(&vec![ "listing_event".to_owned(), @@ -552,13 +564,13 @@ async fn relay_direct_order_decision_publish_accepts_sdk_built_draft() -> TestRe relay_receipt .event .tags - .contains(&vec!["a".to_owned(), payload.listing_addr.clone()]) + .contains(&vec!["a".to_owned(), payload.listing_addr.to_string()]) ); assert!( relay_receipt .event .tags - .contains(&vec!["d".to_owned(), payload.order_id.clone()]) + .contains(&vec!["d".to_owned(), payload.order_id.to_string()]) ); assert!( relay_receipt