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