slack_rust/conversations/
open.rs1use 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(¶m)?;
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, ¶m, &"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}