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