rocketmq_protocol/protocol/header/
update_topic_config_cas_request_header.rs1use cheetah_string::CheetahString;
16use rocketmq_macros::RequestHeaderCodec;
17use serde::Deserialize;
18use serde::Serialize;
19
20#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, RequestHeaderCodec)]
28#[header(
29 type_id = "rocketmq_protocol::protocol::header::update_topic_config_cas_request_header::UpdateTopicConfigCasRequestHeader"
30)]
31#[serde(rename_all = "camelCase")]
32pub struct UpdateTopicConfigCasRequestHeader {
33 #[header(required)]
34 pub topic: CheetahString,
35 #[header(required)]
36 pub expected_version: u64,
37 pub read_queue_nums: Option<i32>,
38 pub write_queue_nums: Option<i32>,
39 pub order: Option<bool>,
40}
41
42#[cfg(test)]
43mod tests {
44 use std::collections::HashMap;
45
46 use cheetah_string::CheetahString;
47
48 use super::UpdateTopicConfigCasRequestHeader;
49 use crate::protocol::command_custom_header::CommandCustomHeader;
50 use crate::protocol::command_custom_header::FromMap;
51
52 #[test]
53 fn allowlisted_patch_round_trips_through_wire_map() {
54 let header = UpdateTopicConfigCasRequestHeader {
55 topic: "orders".into(),
56 expected_version: 42,
57 read_queue_nums: Some(8),
58 write_queue_nums: Some(6),
59 order: Some(true),
60 };
61 let map = header.to_map().expect("header should encode");
62
63 assert_eq!(map.get("topic").map(CheetahString::as_str), Some("orders"));
64 assert_eq!(map.get("expectedVersion").map(CheetahString::as_str), Some("42"));
65 assert_eq!(map.get("readQueueNums").map(CheetahString::as_str), Some("8"));
66 assert_eq!(map.get("writeQueueNums").map(CheetahString::as_str), Some("6"));
67 assert_eq!(map.get("order").map(CheetahString::as_str), Some("true"));
68
69 let decoded = <UpdateTopicConfigCasRequestHeader as FromMap>::from(&map).expect("header should decode");
70 assert_eq!(decoded, header);
71 }
72
73 #[test]
74 fn omitted_patch_fields_remain_absent() {
75 let header = UpdateTopicConfigCasRequestHeader {
76 topic: "orders".into(),
77 expected_version: 0,
78 ..Default::default()
79 };
80 let map = header.to_map().expect("header should encode");
81
82 assert!(!map.contains_key("readQueueNums"));
83 assert!(!map.contains_key("writeQueueNums"));
84 assert!(!map.contains_key("order"));
85 assert_eq!(
86 <UpdateTopicConfigCasRequestHeader as FromMap>::from(&map).expect("header should decode"),
87 header
88 );
89 }
90
91 #[test]
92 fn missing_version_is_rejected_instead_of_becoming_zero() {
93 let mut map = HashMap::new();
94 map.insert(
95 CheetahString::from_static_str("topic"),
96 CheetahString::from_static_str("orders"),
97 );
98
99 assert!(<UpdateTopicConfigCasRequestHeader as FromMap>::from(&map).is_err());
100 }
101}