rhi

Coordinated trade for connected markets
git clone https://radroots.dev/git/rhi.git
Log | Files | Refs | README | LICENSE

commit 3f8175d3dc9f38782bafaf522745ff36265b1e2a
parent 260646b70644e459b062f5a3333f210e21df2782
Author: triesap <tyson@radroots.org>
Date:   Tue,  5 May 2026 17:03:02 +0000

rhi: align trade dvm pricing tests

- keep the runtime path resolver helper in test builds only
- generate unique timestamps for signed dvm test events
- align discount-decline tests with forbidden kind 3431
- refresh the worker lockfile for current local path dependencies

Diffstat:
MCargo.lock | 3+++
Msrc/features/trade_listing/handlers/dvm.rs | 87++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/paths.rs | 1+
3 files changed, 52 insertions(+), 39 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1620,8 +1620,10 @@ version = "0.1.0-alpha.2" dependencies = [ "nostr", "radroots_events", + "radroots_protected_store", "radroots_runtime", "radroots_runtime_paths", + "radroots_secret_vault", "serde", "serde_json", "thiserror 1.0.69", @@ -1693,6 +1695,7 @@ dependencies = [ name = "radroots_runtime_paths" version = "0.1.0-alpha.2" dependencies = [ + "serde", "thiserror 1.0.69", ] diff --git a/src/features/trade_listing/handlers/dvm.rs b/src/features/trade_listing/handlers/dvm.rs @@ -1477,14 +1477,17 @@ mod tests { }; use serde_json::json; use std::collections::HashSet; + use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::{Arc, Mutex, MutexGuard}; use tokio::sync::Mutex as AsyncMutex; static TEST_LOCK: Mutex<()> = Mutex::new(()); + static TEST_EVENT_TIMESTAMP: AtomicU64 = AtomicU64::new(1_700_000_000); const TEST_LISTING_EVENT_ID: &str = "listing-event"; fn test_guard() -> MutexGuard<'static, ()> { let guard = TEST_LOCK.lock().unwrap_or_else(|err| err.into_inner()); + TEST_EVENT_TIMESTAMP.store(1_700_000_000, Ordering::Relaxed); *dvm_test_hooks() .lock() .unwrap_or_else(|err| err.into_inner()) = DvmTestHooks::default(); @@ -1498,6 +1501,10 @@ mod tests { ) } + fn next_test_timestamp() -> RadrootsNostrTimestamp { + RadrootsNostrTimestamp::from(TEST_EVENT_TIMESTAMP.fetch_add(1, Ordering::Relaxed)) + } + fn push_send_ok() { dvm_test_hooks() .lock() @@ -1701,6 +1708,7 @@ mod tests { tags: Vec<RadrootsNostrTag>, ) -> RadrootsNostrEvent { RadrootsNostrEventBuilder::new(kind, content) + .custom_created_at(next_test_timestamp()) .tags(tags) .sign_with_keys(sender) .expect("event") @@ -1972,7 +1980,10 @@ mod tests { envelope_event.tags, ) .expect("event builder"); - builder.sign_with_keys(sender).expect("event") + builder + .custom_created_at(next_test_timestamp()) + .sign_with_keys(sender) + .expect("event") } async fn make_handle_event_trade_event( @@ -4265,37 +4276,38 @@ mod tests { .await, Err(TradeListingDvmError::InvalidOrder) )); - assert!(matches!( - handle_discount_decision( - &make_public_trade_event( - &buyer_keys, - TradeListingMessageType::DiscountDecline, - &listing_addr, - "order-1", - &buyer_pub, - &seller_pub, - Some(&state), - ) - .await, + let result = handle_discount_decision( + &make_public_trade_event( + &buyer_keys, TradeListingMessageType::DiscountDecline, - TradeDiscountDecision::Accept { - value: sample_discount_value(), - }, - &parsed, - Some("order-1"), - &client, - &state, + &listing_addr, + "order-1", + &buyer_pub, + &seller_pub, + Some(&state), ) .await, - Err(TradeListingDvmError::InvalidOrder) - )); + TradeListingMessageType::DiscountDecline, + TradeDiscountDecision::Accept { + value: sample_discount_value(), + }, + &parsed, + Some("order-1"), + &client, + &state, + ) + .await; + assert!( + matches!(result, Err(TradeListingDvmError::InvalidPayload(ref message)) if message.contains("3431")), + "unexpected discount decline mismatch result: {result:?}" + ); push_send_ok(); assert!( handle_discount_decision( &make_public_trade_event( &buyer_keys, - TradeListingMessageType::DiscountDecline, + TradeListingMessageType::DiscountAccept, &listing_addr, "order-1", &buyer_pub, @@ -4304,7 +4316,9 @@ mod tests { ) .await, TradeListingMessageType::Cancel, - TradeDiscountDecision::Decline { reason: None }, + TradeDiscountDecision::Accept { + value: sample_discount_value(), + }, &parsed, Some("order-1"), &client, @@ -4811,7 +4825,7 @@ mod tests { set_order_status(&state, "order-1", TradeOrderStatus::Revised).await; let seen_discount_decision = make_public_trade_event( &buyer_keys, - TradeListingMessageType::DiscountDecline, + TradeListingMessageType::DiscountAccept, &listing_addr, "order-1", &buyer_pub, @@ -4823,8 +4837,10 @@ mod tests { assert!( handle_discount_decision( &seen_discount_decision, - TradeListingMessageType::DiscountDecline, - TradeDiscountDecision::Decline { reason: None }, + TradeListingMessageType::DiscountAccept, + TradeDiscountDecision::Accept { + value: sample_discount_value(), + }, &parsed, Some("order-1"), &client, @@ -4837,7 +4853,7 @@ mod tests { handle_discount_decision( &make_public_trade_event( &seller_keys, - TradeListingMessageType::DiscountDecline, + TradeListingMessageType::DiscountAccept, &listing_addr, "order-1", &buyer_pub, @@ -4845,8 +4861,10 @@ mod tests { Some(&state), ) .await, - TradeListingMessageType::DiscountDecline, - TradeDiscountDecision::Decline { reason: None }, + TradeListingMessageType::DiscountAccept, + TradeDiscountDecision::Accept { + value: sample_discount_value(), + }, &parsed, Some("order-1"), &client, @@ -5590,10 +5608,6 @@ mod tests { KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ, ), ( - TradeListingMessageType::DiscountDecline, - KIND_TRADE_LISTING_DISCOUNT_DECLINE_REQ, - ), - ( TradeListingMessageType::Cancel, KIND_TRADE_LISTING_CANCEL_REQ, ), @@ -5646,7 +5660,6 @@ mod tests { TradeListingMessageType::DiscountRequest, TradeListingMessageType::DiscountOffer, TradeListingMessageType::DiscountAccept, - TradeListingMessageType::DiscountDecline, TradeListingMessageType::Cancel, TradeListingMessageType::FulfillmentUpdate, TradeListingMessageType::Receipt, @@ -5706,10 +5719,6 @@ mod tests { TradeListingMessageType::DiscountAccept, TradeOrderStatus::Completed, ), - ( - TradeListingMessageType::DiscountDecline, - TradeOrderStatus::Completed, - ), (TradeListingMessageType::Cancel, TradeOrderStatus::Completed), ( TradeListingMessageType::FulfillmentUpdate, diff --git a/src/paths.rs b/src/paths.rs @@ -186,6 +186,7 @@ pub fn runtime_contract_for_process() -> Result<RhiRuntimeContractOutput> { runtime_contract_with_selection(&RadrootsPathResolver::current(), &selection) } +#[cfg(test)] pub(crate) fn runtime_contract_with_resolver( resolver: &RadrootsPathResolver, profile: RadrootsPathProfile,