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