slack_rust/conversations/
rename.rs1use 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(¶m)?;
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, ¶m, &"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}