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