slack_rust/usergroups/users/
list.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 ListRequest {
9    pub usergroup: String,
10    pub include_disabled: Option<bool>,
11    pub team_id: Option<String>,
12}
13
14#[skip_serializing_none]
15#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
16pub struct ListResponse {
17    pub ok: bool,
18    pub error: Option<String>,
19    pub response_metadata: Option<ResponseMetadata>,
20    pub users: Option<Vec<String>>,
21}
22
23pub async fn list<T>(
24    client: &T,
25    param: &ListRequest,
26    bot_token: &str,
27) -> Result<ListResponse, Error>
28where
29    T: SlackWebAPIClient,
30{
31    let url = get_slack_url("usergroups.users.list");
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::<ListResponse>(&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 = ListRequest {
50            usergroup: "S0604QSJC".to_string(),
51            team_id: Some("T1234567890".to_string()),
52            include_disabled: Some(true),
53        };
54        let json = r##"{
55  "usergroup": "S0604QSJC",
56  "include_disabled": true,
57  "team_id": "T1234567890"
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::<ListRequest>(json).unwrap();
64        assert_eq!(request, s);
65    }
66
67    #[test]
68    fn convert_response() {
69        let response = ListResponse {
70            ok: true,
71            users: Some(vec!["xxxxxxxx".to_string(), "xxxxxxxx".to_string()]),
72            ..Default::default()
73        };
74        let json = r##"{
75  "ok": true,
76  "users": [
77    "xxxxxxxx",
78    "xxxxxxxx"
79  ]
80}"##;
81
82        let j = serde_json::to_string_pretty(&response).unwrap();
83        assert_eq!(json, j);
84
85        let s = serde_json::from_str::<ListResponse>(json).unwrap();
86        assert_eq!(response, s);
87    }
88
89    #[async_std::test]
90    async fn test_list() {
91        let param = ListRequest {
92            usergroup: "S0604QSJC".to_string(),
93            team_id: Some("T1234567890".to_string()),
94            include_disabled: Some(true),
95        };
96        let mut mock = MockSlackWebAPIClient::new();
97        mock.expect_post_json().returning(|_, _, _| {
98            Ok(r##"{
99  "ok": true,
100  "users": [
101    "xxxxxxxx",
102    "xxxxxxxx"
103  ]
104}"##
105            .to_string())
106        });
107
108        let response = list(&mock, &param, &"test_token".to_string())
109            .await
110            .unwrap();
111        let expect = ListResponse {
112            ok: true,
113            users: Some(vec!["xxxxxxxx".to_string(), "xxxxxxxx".to_string()]),
114            ..Default::default()
115        };
116
117        assert_eq!(expect, response);
118    }
119}