runtime_local.rs (4523B)
1 use radroots_authority::RadrootsActorContext; 2 use radroots_core::{ 3 RadrootsCoreCurrency, RadrootsCoreDecimal, RadrootsCoreMoney, RadrootsCoreQuantity, 4 RadrootsCoreQuantityPrice, RadrootsCoreUnit, 5 }; 6 use radroots_events::contract::RadrootsActorRole; 7 use radroots_events::ids::{RadrootsDTag, RadrootsInventoryBinId}; 8 use radroots_nostr::prelude::RadrootsNostrKeys; 9 use radroots_sdk::protocol::farm::RadrootsFarmRef; 10 use radroots_sdk::protocol::listing::{ 11 RadrootsListing, RadrootsListingBin, RadrootsListingProduct, 12 }; 13 use radroots_sdk::{ 14 ListingPreparePublishRequest, OrderStatusRequest, PushOutboxRequest, RadrootsSdk, 15 RadrootsSdkError, RadrootsSdkLocalKeySigner, RadrootsSdkSignerProvider, RadrootsSdkTimestamp, 16 SdkIdempotencyKey, SdkRelayTargetPolicy, SdkRelayUrlPolicy, 17 }; 18 19 const RELAY: &str = "wss://relay.example.com"; 20 21 #[tokio::main] 22 async fn main() -> Result<(), Box<dyn std::error::Error>> { 23 let keys = RadrootsNostrKeys::generate(); 24 let seller = keys.public_key().to_hex(); 25 let signer = RadrootsSdkLocalKeySigner::new(keys)?; 26 let sdk = RadrootsSdk::builder() 27 .fixed_clock(RadrootsSdkTimestamp::from_unix_seconds(1_700_000_000)) 28 .signer_provider(RadrootsSdkSignerProvider::LocalKey(signer)) 29 .build() 30 .await?; 31 let actor = RadrootsActorContext::test(seller.as_str(), [RadrootsActorRole::Seller])?; 32 let listing = sample_listing(seller.as_str()); 33 let prepare_request = ListingPreparePublishRequest::new(actor.clone(), listing); 34 let target_relays = SdkRelayTargetPolicy::try_explicit([RELAY], SdkRelayUrlPolicy::Public)?; 35 let idempotency_key = SdkIdempotencyKey::new("example-1")?; 36 37 let prepared = sdk.listings().prepare_publish(prepare_request)?; 38 let enqueue = sdk 39 .listings() 40 .enqueue_prepared_publish( 41 &actor, 42 prepared.clone(), 43 target_relays, 44 Some(idempotency_key), 45 ) 46 .await?; 47 let push = sdk 48 .sync() 49 .push_outbox(PushOutboxRequest::new().with_limit(1)) 50 .await; 51 let order_status = sdk 52 .orders() 53 .status(OrderStatusRequest::parse("example-order-1")?) 54 .await?; 55 56 assert_eq!( 57 prepared.public_listing_addr.as_str(), 58 enqueue.public_listing_addr.as_str() 59 ); 60 #[cfg(feature = "relay-runtime")] 61 assert!(matches!( 62 push, 63 Err(RadrootsSdkError::ProductSyncRelaySetupFailure { .. }) 64 )); 65 #[cfg(not(feature = "relay-runtime"))] 66 assert!(matches!( 67 push, 68 Err(RadrootsSdkError::ProductSyncUnsupported { .. }) 69 )); 70 assert!(!order_status.found); 71 Ok(()) 72 } 73 74 fn sample_listing(seller: &str) -> RadrootsListing { 75 RadrootsListing { 76 d_tag: RadrootsDTag::parse("AAAAAAAAAAAAAAAAAAAAAQ").expect("d tag"), 77 published_at: None, 78 farm: RadrootsFarmRef { 79 pubkey: seller.to_owned(), 80 d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_owned(), 81 }, 82 product: RadrootsListingProduct { 83 key: "coffee".to_owned(), 84 title: "Coffee".to_owned(), 85 category: "coffee".to_owned(), 86 summary: Some("Single origin coffee".to_owned()), 87 process: None, 88 lot: None, 89 location: None, 90 profile: None, 91 year: None, 92 }, 93 primary_bin_id: RadrootsInventoryBinId::parse("bin-1").expect("bin id"), 94 bins: vec![RadrootsListingBin { 95 bin_id: RadrootsInventoryBinId::parse("bin-1").expect("bin id"), 96 quantity: RadrootsCoreQuantity::new( 97 RadrootsCoreDecimal::from(1000u32), 98 RadrootsCoreUnit::MassG, 99 ), 100 price_per_canonical_unit: RadrootsCoreQuantityPrice { 101 amount: RadrootsCoreMoney::new( 102 RadrootsCoreDecimal::from(20u32), 103 RadrootsCoreCurrency::USD, 104 ), 105 quantity: RadrootsCoreQuantity::new( 106 RadrootsCoreDecimal::from(1u32), 107 RadrootsCoreUnit::MassG, 108 ), 109 }, 110 display_amount: None, 111 display_unit: None, 112 display_label: None, 113 display_price: None, 114 display_price_unit: None, 115 }], 116 resource_area: None, 117 plot: None, 118 discounts: None, 119 inventory_available: None, 120 availability: None, 121 delivery_method: None, 122 location: None, 123 images: None, 124 } 125 }