slack_rust/conversations/
rename.rs

1use crate::channels::channel::Channel;
2use crate::error::Error;
3use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
4use serde::{Deserialize, Serialize};
5use serde_with::skip_serializing_none;
6
7#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
8pub struct RenameRequest {
9    pub channel: String,
10    pub name: String,
11}
12
13#[skip_serializing_none]
14#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
15pub struct RenameResponse {
16    pub ok: bool,
17    pub error: Option<String>,
18    pub response_metadata: Option<ResponseMetadata>,
19    pub channel: Option<Channel>,
20}
21
22pub async fn rename<T>(
23    client: &T,
24    param: &RenameRequest,
25    bot_token: &str,
26) -> Result<RenameResponse, Error>
27where
28    T: SlackWebAPIClient,
29{
30    let url = get_slack_url("conversations.rename");
31    let json = serde_json::to_string(&param)?;
32
33    client
34        .post_json(&url, &json, bot_token)
35        .await
36        .and_then(|result| {
37            serde_json::from_str::<RenameResponse>(&result).map_err(Error::SerdeJsonError)
38        })
39}
40
41#[cfg(test)]
42mod test {
43    use super::*;
44    use crate::channels::channel::{Purpose, Topic};
45    use crate::http_client::MockSlackWebAPIClient;
46
47    #[test]
48    fn convert_request() {
49        let request = RenameRequest {
50            channel: "C1234567890".to_string(),
51            name: "xxxxxxxxxxx".to_string(),
52        };
53        let json = r##"{
54  "channel": "C1234567890",
55  "name": "xxxxxxxxxxx"
56}"##;
57
58        let j = serde_json::to_string_pretty(&request).unwrap();
59        assert_eq!(json, j);
60
61        let s = serde_json::from_str::<RenameRequest>(json).unwrap();
62        assert_eq!(request, s);
63    }
64
65    #[test]
66    fn convert_response() {
67        let response = RenameResponse {
68            ok: true,
69            channel: Some(Channel {
70                id: Some("C0EAQDV4Z".to_string()),
71                name: Some("endeavor".to_string()),
72                is_channel: Some(true),
73                created: Some(1504554479),
74                creator: Some("U0123456".to_string()),
75                is_archived: Some(false),
76                is_general: Some(false),
77                name_normalized: Some("endeavor".to_string()),
78                is_shared: Some(false),
79                is_org_shared: Some(false),
80                is_member: Some(false),
81                is_private: Some(false),
82                is_mpim: Some(false),
83                last_read: Some("0000000000.000000".to_string()),
84                unread_count: Some(0),
85                unread_count_display: Some(0),
86                topic: Some(Topic {
87                    value: Some("".to_string()),
88                    creator: Some("".to_string()),
89                    last_set: Some(0),
90                }),
91                purpose: Some(Purpose {
92                    value: Some("".to_string()),
93                    creator: Some("".to_string()),
94                    last_set: Some(0),
95                }),
96                previous_names: Some(vec![]),
97                priority: Some(0),
98                ..Default::default()
99            }),
100            ..Default::default()
101        };
102        let json = r##"{
103  "ok": true,
104  "channel": {
105    "id": "C0EAQDV4Z",
106    "name": "endeavor",
107    "is_channel": true,
108    "created": 1504554479,
109    "creator": "U0123456",
110    "is_archived": false,
111    "is_general": false,
112    "name_normalized": "endeavor",
113    "is_shared": false,
114    "is_org_shared": false,
115    "is_member": false,
116    "is_private": false,
117    "is_mpim": false,
118    "last_read": "0000000000.000000",
119    "unread_count": 0,
120    "unread_count_display": 0,
121    "topic": {
122      "value": "",
123      "creator": "",
124      "last_set": 0
125    },
126    "purpose": {
127      "value": "",
128      "creator": "",
129      "last_set": 0
130    },
131    "previous_names": [],
132    "priority": 0
133  }
134}"##;
135
136        let j = serde_json::to_string_pretty(&response).unwrap();
137        assert_eq!(json, j);
138
139        let s = serde_json::from_str::<RenameResponse>(json).unwrap();
140        assert_eq!(response, s);
141    }
142
143    #[async_std::test]
144    async fn test_rename() {
145        let param = RenameRequest {
146            channel: "C1234567890".to_string(),
147            name: "xxxxxxxxxxx".to_string(),
148        };
149
150        let mut mock = MockSlackWebAPIClient::new();
151        mock.expect_post_json().returning(|_, _, _| {
152            Ok(r##"{
153  "ok": true,
154  "channel": {
155    "id": "C1234567890",
156    "name": "endeavor",
157    "is_channel": true,
158    "created": 1504554479,
159    "creator": "U0123456",
160    "is_archived": false,
161    "is_general": false,
162    "name_normalized": "endeavor",
163    "is_shared": false,
164    "is_org_shared": false,
165    "is_member": false,
166    "is_private": false,
167    "is_mpim": false,
168    "last_read": "0000000000.000000",
169    "unread_count": 0,
170    "unread_count_display": 0,
171    "topic": {
172      "value": "",
173      "creator": "",
174      "last_set": 0
175    },
176    "purpose": {
177      "value": "",
178      "creator": "",
179      "last_set": 0
180    },
181    "previous_names": [],
182    "priority": 0
183  }
184}"##
185            .to_string())
186        });
187
188        let response = rename(&mock, &param, &"test_token".to_string())
189            .await
190            .unwrap();
191        let expect = RenameResponse {
192            ok: true,
193            channel: Some(Channel {
194                id: Some("C1234567890".to_string()),
195                name: Some("endeavor".to_string()),
196                is_channel: Some(true),
197                created: Some(1504554479),
198                creator: Some("U0123456".to_string()),
199                is_archived: Some(false),
200                is_general: Some(false),
201                name_normalized: Some("endeavor".to_string()),
202                is_shared: Some(false),
203                is_org_shared: Some(false),
204                is_member: Some(false),
205                is_private: Some(false),
206                is_mpim: Some(false),
207                last_read: Some("0000000000.000000".to_string()),
208                unread_count: Some(0),
209                unread_count_display: Some(0),
210                topic: Some(Topic {
211                    value: Some("".to_string()),
212                    creator: Some("".to_string()),
213                    last_set: Some(0),
214                }),
215                purpose: Some(Purpose {
216                    value: Some("".to_string()),
217                    creator: Some("".to_string()),
218                    last_set: Some(0),
219                }),
220                previous_names: Some(vec![]),
221                priority: Some(0),
222                ..Default::default()
223            }),
224            ..Default::default()
225        };
226
227        assert_eq!(expect, response);
228    }
229}