slack_rust/conversations/
close.rs

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