cli

Command-line interface for Radroots
git clone https://radroots.dev/git/cli.git
Log | Files | Refs | README | LICENSE

commit 91c01c095e4841939bbfee910a15ddfddecce1b6
parent b6d756a6c484c39aa0c1ccbc9d1b8fe5fa5106e6
Author: triesap <tyson@radroots.org>
Date:   Thu, 30 Apr 2026 02:24:30 +0000

order: refine lifecycle status output

Diffstat:
Msrc/runtime/order.rs | 53++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 46 insertions(+), 7 deletions(-)

diff --git a/src/runtime/order.rs b/src/runtime/order.rs @@ -1983,7 +1983,11 @@ fn order_status_inventory_view( }) } RadrootsActiveOrderStatus::Cancelled => Some(OrderInventoryView { - state: "released".to_owned(), + state: if decision_event_id.is_some() { + "released".to_owned() + } else { + "not_reserved".to_owned() + }, listing_event_id, commitment_valid: inventory_issues.is_empty(), bins: Vec::new(), @@ -2035,7 +2039,12 @@ fn order_status_fulfillment_view( issues, }); } - if !matches!(status, RadrootsActiveOrderStatus::Accepted) { + if !matches!( + status, + RadrootsActiveOrderStatus::Accepted + | RadrootsActiveOrderStatus::Completed + | RadrootsActiveOrderStatus::Disputed + ) { return None; } let fulfillment_status = fulfillment_status?; @@ -6323,10 +6332,10 @@ mod tests { order_fulfillment_preflight_view_from_status, order_history_entry_from_event, order_history_from_receipt, order_receipt_dry_run_view, order_receipt_event_parts, order_receipt_payload_from_status, order_receipt_preflight_view_from_status, - order_request_filter, order_status_from_receipt, order_status_from_receipt_with_context, - order_status_reduction_from_receipt_with_context, order_submit_dry_run_view, - order_submit_existing_request_view_from_receipt, proposed_accept_decision_record, - resolve_local_order_fulfillment_signing_identity, + order_request_filter, order_status_filter, order_status_from_receipt, + order_status_from_receipt_with_context, order_status_reduction_from_receipt_with_context, + order_submit_dry_run_view, order_submit_existing_request_view_from_receipt, + proposed_accept_decision_record, resolve_local_order_fulfillment_signing_identity, seller_order_request_resolution_from_receipt, }; use crate::runtime::accounts; @@ -6465,6 +6474,20 @@ mod tests { } #[test] + fn order_status_filter_includes_active_lifecycle_kinds() { + let filter = order_status_filter("ord_AAAAAAAAAAAAAAAAAAAAAg").expect("status filter"); + let value = serde_json::to_value(filter).expect("filter json"); + let kinds = value["kinds"].as_array().expect("kinds array"); + + assert!(kinds.contains(&serde_json::json!(3422))); + assert!(kinds.contains(&serde_json::json!(3423))); + assert!(kinds.contains(&serde_json::json!(3433))); + assert!(kinds.contains(&serde_json::json!(3432))); + assert!(kinds.contains(&serde_json::json!(3434))); + assert_eq!(value["#d"][0], "ord_AAAAAAAAAAAAAAAAAAAAAg"); + } + + #[test] fn order_submit_existing_request_preflight_deduplicates_identical_request() { let dir = tempdir().expect("tempdir"); let mut config = sample_config(dir.path()); @@ -7384,6 +7407,7 @@ mod tests { let cancellation_event_id = cancellation_event.id.to_string(); let lifecycle = view.lifecycle.as_ref().expect("lifecycle view"); let cancellation = lifecycle.cancellation.as_ref().expect("cancellation view"); + let inventory = view.inventory.as_ref().expect("inventory view"); assert_eq!( u32::from(cancellation_event.kind.as_u16()), @@ -7423,6 +7447,8 @@ mod tests { Some(request_event_id.as_str()) ); assert_eq!(cancellation.reason.as_deref(), Some("buyer cancelled")); + assert_eq!(inventory.state, "not_reserved"); + assert_eq!(inventory.commitment_valid, true); assert!(view.reducer_issues.is_empty()); } @@ -7810,6 +7836,7 @@ mod tests { let lifecycle = view.lifecycle.as_ref().expect("lifecycle view"); let receipt = lifecycle.receipt.as_ref().expect("receipt view"); let inventory = view.inventory.as_ref().expect("inventory view"); + let fulfillment = view.fulfillment.as_ref().expect("fulfillment view"); assert_eq!(u32::from(receipt_event.kind.as_u16()), KIND_TRADE_RECEIPT); assert_eq!(view.state, "completed"); @@ -7818,6 +7845,11 @@ mod tests { Some(receipt_event_id.as_str()) ); assert_eq!(inventory.state, "reserved"); + assert_eq!(fulfillment.state, "delivered"); + assert_eq!( + fulfillment.event_id.as_deref(), + Some(fulfillment_event_id.as_str()) + ); assert_eq!(lifecycle.phase, "completed"); assert_eq!(lifecycle.terminal, true); assert_eq!( @@ -7888,16 +7920,23 @@ mod tests { events: vec![ fixture.request_event.clone(), decision_event, - fulfillment_event, + fulfillment_event.clone(), receipt_event.clone(), ], }, ); let receipt_event_id = receipt_event.id.to_string(); + let fulfillment_event_id = fulfillment_event.id.to_string(); let lifecycle = view.lifecycle.as_ref().expect("lifecycle view"); let receipt = lifecycle.receipt.as_ref().expect("receipt view"); + let fulfillment = view.fulfillment.as_ref().expect("fulfillment view"); assert_eq!(view.state, "disputed"); + assert_eq!(fulfillment.state, "ready_for_pickup"); + assert_eq!( + fulfillment.event_id.as_deref(), + Some(fulfillment_event_id.as_str()) + ); assert_eq!(lifecycle.phase, "disputed"); assert_eq!(lifecycle.terminal, true); assert_eq!(