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