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