slack_rust/conversations/
leave.rs1use crate::error::Error;
2use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
3use serde::{Deserialize, Serialize};
4use serde_with::skip_serializing_none;
5
6#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
7pub struct LeaveRequest {
8 pub channel: String,
9}
10
11#[skip_serializing_none]
12#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
13pub struct LeaveResponse {
14 pub ok: bool,
15 pub error: Option<String>,
16 pub response_metadata: Option<ResponseMetadata>,
17 pub not_in_channel: Option<bool>,
18}
19
20pub async fn leave<T>(
21 client: &T,
22 param: &LeaveRequest,
23 bot_token: &str,
24) -> Result<LeaveResponse, Error>
25where
26 T: SlackWebAPIClient,
27{
28 let url = get_slack_url("conversations.leave");
29 let json = serde_json::to_string(¶m)?;
30
31 client
32 .post_json(&url, &json, bot_token)
33 .await
34 .and_then(|result| {
35 serde_json::from_str::<LeaveResponse>(&result).map_err(Error::SerdeJsonError)
36 })
37}
38
39#[cfg(test)]
40mod test {
41 use super::*;
42 use crate::http_client::MockSlackWebAPIClient;
43
44 #[test]
45 fn convert_request() {
46 let request = LeaveRequest {
47 channel: "C1234567890".to_string(),
48 };
49 let json = r##"{
50 "channel": "C1234567890"
51}"##;
52
53 let j = serde_json::to_string_pretty(&request).unwrap();
54 assert_eq!(json, j);
55
56 let s = serde_json::from_str::<LeaveRequest>(json).unwrap();
57 assert_eq!(request, s);
58 }
59
60 #[test]
61 fn convert_response() {
62 let response = LeaveResponse {
63 ok: true,
64 not_in_channel: Some(true),
65 ..Default::default()
66 };
67 let json = r##"{
68 "ok": true,
69 "not_in_channel": true
70}"##;
71
72 let j = serde_json::to_string_pretty(&response).unwrap();
73 assert_eq!(json, j);
74
75 let s = serde_json::from_str::<LeaveResponse>(json).unwrap();
76 assert_eq!(response, s);
77 }
78
79 #[async_std::test]
80 async fn test_leave() {
81 let param = LeaveRequest {
82 channel: "C1234567890".to_string(),
83 };
84
85 let mut mock = MockSlackWebAPIClient::new();
86 mock.expect_post_json().returning(|_, _, _| {
87 Ok(r##"{
88 "ok": true,
89 "not_in_channel": true
90}"##
91 .to_string())
92 });
93
94 let response = leave(&mock, ¶m, &"test_token".to_string())
95 .await
96 .unwrap();
97 let expect = LeaveResponse {
98 ok: true,
99 not_in_channel: Some(true),
100 ..Default::default()
101 };
102
103 assert_eq!(expect, response);
104 }
105}