nautilus_model/events/order/spec/
denied.rs1use nautilus_core::{UUID4, UnixNanos};
17use ustr::Ustr;
18
19use crate::{
20 events::OrderDenied,
21 identifiers::{ClientOrderId, InstrumentId, StrategyId, TraderId},
22 stubs::{TestDefault, test_uuid},
23};
24
25#[derive(Debug, Clone, bon::Builder)]
31#[builder(finish_fn = into_spec)]
32pub struct OrderDeniedSpec {
33 #[builder(default = TraderId::test_default())]
34 pub trader_id: TraderId,
35 #[builder(default = StrategyId::test_default())]
36 pub strategy_id: StrategyId,
37 #[builder(default = InstrumentId::test_default())]
38 pub instrument_id: InstrumentId,
39 #[builder(default = ClientOrderId::test_default())]
40 pub client_order_id: ClientOrderId,
41 #[builder(default = Ustr::from("TEST"))]
42 pub reason: Ustr,
43 #[builder(default = test_uuid())]
44 pub event_id: UUID4,
45 #[builder(default = UnixNanos::default())]
46 pub ts_event: UnixNanos,
47 #[builder(default = UnixNanos::default())]
48 pub ts_init: UnixNanos,
49}
50
51impl<S: order_denied_spec_builder::IsComplete> OrderDeniedSpecBuilder<S> {
52 #[must_use]
54 pub fn build(self) -> OrderDenied {
55 let spec = self.into_spec();
56 OrderDenied::new(
57 spec.trader_id,
58 spec.strategy_id,
59 spec.instrument_id,
60 spec.client_order_id,
61 spec.reason,
62 spec.event_id,
63 spec.ts_event,
64 spec.ts_init,
65 )
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use rstest::rstest;
72
73 use super::*;
74 use crate::stubs::reset_test_uuid_rng;
75
76 #[rstest]
77 fn defaults_are_sensible() {
78 let event = OrderDeniedSpec::builder().build();
81 assert_eq!(event.trader_id, TraderId::test_default());
82 assert_eq!(event.strategy_id, StrategyId::test_default());
83 assert_eq!(event.instrument_id, InstrumentId::test_default());
84 assert_eq!(event.client_order_id, ClientOrderId::test_default());
85 assert_eq!(event.reason, Ustr::from("TEST"));
86 assert_eq!(event.ts_event, UnixNanos::default());
87 assert_eq!(event.ts_init, UnixNanos::default());
88 }
89
90 #[rstest]
91 fn overrides_apply_through_constructor() {
92 let event = OrderDeniedSpec::builder()
93 .reason(Ustr::from("MAX_ORDER_RATE"))
94 .ts_event(UnixNanos::from(1_000))
95 .ts_init(UnixNanos::from(2_000))
96 .build();
97
98 assert_eq!(event.reason, Ustr::from("MAX_ORDER_RATE"));
99 assert_eq!(event.ts_event, UnixNanos::from(1_000));
100 assert_eq!(event.ts_init, UnixNanos::from(2_000));
101 assert_eq!(event.trader_id, TraderId::test_default());
102 }
103
104 #[rstest]
105 fn event_ids_are_unique_within_a_run() {
106 reset_test_uuid_rng();
107 let a = OrderDeniedSpec::builder().build();
108 let b = OrderDeniedSpec::builder().build();
109 let c = OrderDeniedSpec::builder().build();
110 assert_ne!(a.event_id, b.event_id);
111 assert_ne!(b.event_id, c.event_id);
112 assert_ne!(a.event_id, c.event_id);
113 }
114
115 #[rstest]
116 fn event_id_sequence_is_reproducible() {
117 reset_test_uuid_rng();
119 let first_run: Vec<_> = (0..3)
120 .map(|_| OrderDeniedSpec::builder().build().event_id)
121 .collect();
122
123 reset_test_uuid_rng();
124 let second_run: Vec<_> = (0..3)
125 .map(|_| OrderDeniedSpec::builder().build().event_id)
126 .collect();
127
128 assert_eq!(first_run, second_run);
129 }
130}