slack_rust/usergroups/
update.rs

1use crate::error::Error;
2use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
3use crate::usergroups::usergroup::Usergroup;
4use serde::{Deserialize, Serialize};
5use serde_with::skip_serializing_none;
6
7#[skip_serializing_none]
8#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
9pub struct UpdateRequest {
10    pub usergroup: String,
11    pub channels: Option<Vec<String>>,
12    pub description: Option<String>,
13    pub handle: Option<String>,
14    pub include_count: Option<bool>,
15    pub name: Option<String>,
16    pub team_id: Option<String>,
17}
18
19#[skip_serializing_none]
20#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
21pub struct UpdateResponse {
22    pub ok: bool,
23    pub error: Option<String>,
24    pub response_metadata: Option<ResponseMetadata>,
25    pub usergroup: Option<Usergroup>,
26}
27
28pub async fn update<T>(
29    client: &T,
30    param: &UpdateRequest,
31    bot_token: &str,
32) -> Result<UpdateResponse, Error>
33where
34    T: SlackWebAPIClient,
35{
36    let url = get_slack_url("usergroups.update");
37    let json = serde_json::to_string(&param)?;
38
39    client
40        .post_json(&url, &json, bot_token)
41        .await
42        .and_then(|result| {
43            serde_json::from_str::<UpdateResponse>(&result).map_err(Error::SerdeJsonError)
44        })
45}
46
47#[cfg(test)]
48mod test {
49    use super::*;
50    use crate::http_client::MockSlackWebAPIClient;
51    use crate::usergroups::usergroup::Pref;
52
53    #[test]
54    fn convert_request() {
55        let request = UpdateRequest {
56            usergroup: "S0604QSJC".to_string(),
57            channels: Some(vec!["xxxxxxxxxxx".to_string(), "xxxxxxxxxxx".to_string()]),
58            description: Some("xxxxxxxxxxx".to_string()),
59            handle: Some("marketing".to_string()),
60            include_count: Some(true),
61            name: Some("My Test Team".to_string()),
62            team_id: Some("T1234567890".to_string()),
63        };
64        let json = r##"{
65  "usergroup": "S0604QSJC",
66  "channels": [
67    "xxxxxxxxxxx",
68    "xxxxxxxxxxx"
69  ],
70  "description": "xxxxxxxxxxx",
71  "handle": "marketing",
72  "include_count": true,
73  "name": "My Test Team",
74  "team_id": "T1234567890"
75}"##;
76
77        let j = serde_json::to_string_pretty(&request).unwrap();
78        assert_eq!(json, j);
79
80        let s = serde_json::from_str::<UpdateRequest>(json).unwrap();
81        assert_eq!(request, s);
82    }
83
84    #[test]
85    fn convert_response() {
86        let response = UpdateResponse {
87            ok: true,
88            usergroup: Some(Usergroup {
89                id: Some("S0615G0KT".to_string()),
90                team_id: Some("T060RNRCH".to_string()),
91                is_usergroup: Some(true),
92                name: Some("Marketing Team".to_string()),
93                description: Some("Marketing gurus, PR experts and product advocates.".to_string()),
94                handle: Some("marketing-team".to_string()),
95                is_external: Some(false),
96                date_create: Some(1446746793),
97                date_update: Some(1446746793),
98                date_delete: Some(0),
99                auto_type: Some("".to_string()),
100                created_by: Some("U060RNRCZ".to_string()),
101                updated_by: Some("U060RNRCZ".to_string()),
102                deleted_by: Some("".to_string()),
103                prefs: Some(Pref {
104                    channels: Some(vec![]),
105                    groups: Some(vec![]),
106                }),
107                user_count: Some("0".to_string()),
108            }),
109            ..Default::default()
110        };
111        let json = r##"{
112  "ok": true,
113  "usergroup": {
114    "id": "S0615G0KT",
115    "team_id": "T060RNRCH",
116    "is_usergroup": true,
117    "name": "Marketing Team",
118    "description": "Marketing gurus, PR experts and product advocates.",
119    "handle": "marketing-team",
120    "is_external": false,
121    "date_create": 1446746793,
122    "date_update": 1446746793,
123    "date_delete": 0,
124    "auto_type": "",
125    "created_by": "U060RNRCZ",
126    "updated_by": "U060RNRCZ",
127    "deleted_by": "",
128    "prefs": {
129      "channels": [],
130      "groups": []
131    },
132    "user_count": "0"
133  }
134}"##;
135
136        let j = serde_json::to_string_pretty(&response).unwrap();
137        assert_eq!(json, j);
138
139        let s = serde_json::from_str::<UpdateResponse>(json).unwrap();
140        assert_eq!(response, s);
141    }
142
143    #[async_std::test]
144    async fn test_update() {
145        let param = UpdateRequest {
146            usergroup: "S0604QSJC".to_string(),
147            description: Some("xxxxxxxxxxx".to_string()),
148            ..Default::default()
149        };
150        let mut mock = MockSlackWebAPIClient::new();
151        mock.expect_post_json().returning(|_, _, _| {
152            Ok(r##"{
153  "ok": true,
154  "usergroup": {
155    "id": "S0604QSJC",
156    "team_id": "T1234567890",
157    "is_usergroup": true,
158    "name": "Marketing Team",
159    "description": "xxxxxxxxxxx",
160    "handle": "marketing-team",
161    "is_external": false,
162    "date_create": 1446746793,
163    "date_update": 1446746793,
164    "date_delete": 0,
165    "auto_type": "",
166    "created_by": "U060RNRCZ",
167    "updated_by": "U060RNRCZ",
168    "deleted_by": "",
169    "prefs": {
170      "channels": [],
171      "groups": []
172    },
173    "user_count": "0"
174  }
175}"##
176            .to_string())
177        });
178
179        let response = update(&mock, &param, &"test_token".to_string())
180            .await
181            .unwrap();
182        let expect = UpdateResponse {
183            ok: true,
184            usergroup: Some(Usergroup {
185                id: Some("S0604QSJC".to_string()),
186                team_id: Some("T1234567890".to_string()),
187                is_usergroup: Some(true),
188                name: Some("Marketing Team".to_string()),
189                description: Some("xxxxxxxxxxx".to_string()),
190                handle: Some("marketing-team".to_string()),
191                is_external: Some(false),
192                date_create: Some(1446746793),
193                date_update: Some(1446746793),
194                date_delete: Some(0),
195                auto_type: Some("".to_string()),
196                created_by: Some("U060RNRCZ".to_string()),
197                updated_by: Some("U060RNRCZ".to_string()),
198                deleted_by: Some("".to_string()),
199                prefs: Some(Pref {
200                    channels: Some(vec![]),
201                    groups: Some(vec![]),
202                }),
203                user_count: Some("0".to_string()),
204            }),
205            ..Default::default()
206        };
207
208        assert_eq!(expect, response);
209    }
210}