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(¶m)?;
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, ¶m, &"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}