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