commit c1cce631a43f45abdf81bd22d478c3d9a18be951
parent 40090ccc3eea57a933fe4e8485644145e4650ea7
Author: triesap <tyson@radroots.org>
Date: Wed, 29 Apr 2026 16:16:48 +0000
test: cover invalid order decision failures
- add invalid decision coverage for validation failure output
- assert operation id and lifecycle correlation fields in detail
- keep already-decided coverage paired with invalid state behavior
- verify order status parity tests remain green
Diffstat:
1 file changed, 39 insertions(+), 2 deletions(-)
diff --git a/src/operation_order.rs b/src/operation_order.rs
@@ -480,8 +480,9 @@ mod tests {
use crate::domain::runtime::OrderDecisionView;
use crate::operation_adapter::{
OperationAdapter, OperationContext, OperationData, OperationRequest, OrderAcceptRequest,
- OrderAcceptResult, OrderDeclineRequest, OrderEventListRequest, OrderEventWatchRequest,
- OrderGetRequest, OrderListRequest, OrderStatusGetRequest, OrderSubmitRequest,
+ OrderAcceptResult, OrderDeclineRequest, OrderDeclineResult, OrderEventListRequest,
+ OrderEventWatchRequest, OrderGetRequest, OrderListRequest, OrderStatusGetRequest,
+ OrderSubmitRequest,
};
use crate::runtime::config::{
AccountConfig, AccountSecretContractConfig, HyfConfig, IdentityConfig, InteractionConfig,
@@ -598,6 +599,31 @@ mod tests {
}
#[test]
+ fn order_decision_invalid_maps_to_validation_failure() {
+ let view = invalid_decision_view();
+ let error = match decision_result::<OrderDeclineResult>("order.decline", &view) {
+ Ok(_) => panic!("invalid view should fail validation"),
+ Err(error) => error,
+ };
+ let output_error = error.to_output_error();
+
+ assert_eq!(output_error.code, "validation_failed");
+ assert_eq!(output_error.exit_code, 10);
+ assert_eq!(
+ output_error.message,
+ "active order events for `ord_test` failed reducer validation"
+ );
+ let detail = output_error.detail.expect("validation detail");
+ assert_eq!(detail["state"], "invalid");
+ assert_eq!(detail["operation_id"], "order.decline");
+ assert_eq!(detail["listing_event_id"], "l".repeat(64));
+ assert_eq!(detail["event_id"], Value::Null);
+ assert_eq!(detail["event_kind"], Value::Null);
+ assert_eq!(detail["idempotency_key"], "idem_test");
+ assert_eq!(detail["signer_mode"], "local");
+ }
+
+ #[test]
fn order_decline_requires_reason_before_approval() {
let dir = tempdir().expect("tempdir");
let config = sample_config(dir.path());
@@ -822,4 +848,15 @@ mod tests {
actions: vec!["radroots order status get ord_test".to_owned()],
}
}
+
+ fn invalid_decision_view() -> OrderDecisionView {
+ let mut view = already_decided_view();
+ view.state = "invalid".to_owned();
+ view.decision = "declined".to_owned();
+ view.event_id = None;
+ view.event_kind = None;
+ view.reason =
+ Some("active order events for `ord_test` failed reducer validation".to_owned());
+ view
+ }
}