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