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