Skip to main content

rocketmq_remoting/protocol/header/
delete_acl_request_header.rs

1// Copyright 2023 The RocketMQ Rust Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use cheetah_string::CheetahString;
16use rocketmq_macros::RequestHeaderCodecV2;
17use serde::Deserialize;
18use serde::Serialize;
19
20#[derive(Debug, Clone, Serialize, Deserialize, Default, RequestHeaderCodecV2)]
21#[serde(rename_all = "camelCase")]
22pub struct DeleteAclRequestHeader {
23    pub subject: CheetahString,
24
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub resource: Option<CheetahString>,
27}
28
29impl DeleteAclRequestHeader {
30    pub fn new(subject: CheetahString, resource: Option<CheetahString>) -> Self {
31        Self { subject, resource }
32    }
33
34    pub fn with_subject(subject: CheetahString) -> Self {
35        Self {
36            subject,
37            resource: None,
38        }
39    }
40
41    pub fn set_subject(&mut self, subject: CheetahString) {
42        self.subject = subject;
43    }
44
45    pub fn set_resource(&mut self, resource: Option<CheetahString>) {
46        self.resource = resource;
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use std::collections::HashMap;
53
54    use super::*;
55    use crate::protocol::command_custom_header::CommandCustomHeader;
56    use crate::protocol::command_custom_header::FromMap;
57
58    #[test]
59    fn delete_acl_request_header_new() {
60        let subject = CheetahString::from_static_str("user:alice");
61        let resource = Some(CheetahString::from_static_str("Topic:test-topic"));
62        let header = DeleteAclRequestHeader::new(subject.clone(), resource.clone());
63
64        assert_eq!(header.subject, subject);
65        assert_eq!(header.resource, resource);
66    }
67
68    #[test]
69    fn delete_acl_request_header_with_subject() {
70        let subject = CheetahString::from_static_str("user:bob");
71        let header = DeleteAclRequestHeader::with_subject(subject.clone());
72
73        assert_eq!(header.subject, subject);
74        assert!(header.resource.is_none());
75    }
76
77    #[test]
78    fn delete_acl_request_header_default() {
79        let header = DeleteAclRequestHeader::default();
80
81        assert!(header.subject.is_empty());
82        assert!(header.resource.is_none());
83    }
84
85    #[test]
86    fn delete_acl_request_header_set_methods() {
87        let mut header = DeleteAclRequestHeader::default();
88        let subject = CheetahString::from_static_str("user:charlie");
89        let resource = Some(CheetahString::from_static_str("Group:consumer-group"));
90
91        header.set_subject(subject.clone());
92        header.set_resource(resource.clone());
93
94        assert_eq!(header.subject, subject);
95        assert_eq!(header.resource, resource);
96    }
97
98    #[test]
99    fn delete_acl_request_header_serializes_correctly() {
100        let header = DeleteAclRequestHeader::new(
101            CheetahString::from_static_str("user:alice"),
102            Some(CheetahString::from_static_str("Topic:test")),
103        );
104
105        let map = header.to_map().unwrap();
106        assert_eq!(
107            map.get(&CheetahString::from_static_str("subject")),
108            Some(&CheetahString::from_static_str("user:alice"))
109        );
110        assert_eq!(
111            map.get(&CheetahString::from_static_str("resource")),
112            Some(&CheetahString::from_static_str("Topic:test"))
113        );
114    }
115
116    #[test]
117    fn delete_acl_request_header_deserializes_correctly() {
118        let mut map: HashMap<CheetahString, CheetahString> = HashMap::new();
119        map.insert(
120            CheetahString::from_static_str("subject"),
121            CheetahString::from_static_str("user:alice"),
122        );
123        map.insert(
124            CheetahString::from_static_str("resource"),
125            CheetahString::from_static_str("Topic:test"),
126        );
127
128        let header = <DeleteAclRequestHeader as FromMap>::from(&map).unwrap();
129        assert_eq!(header.subject, CheetahString::from_static_str("user:alice"));
130        assert_eq!(header.resource, Some(CheetahString::from_static_str("Topic:test")));
131    }
132}