slack_rust/auth/
revoke.rs

1//! Revokes a token.
2//! See: <https://api.slack.com/methods/auth.revoke>
3
4use crate::error::Error;
5use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
6use serde::{Deserialize, Serialize};
7use serde_with::skip_serializing_none;
8
9#[skip_serializing_none]
10#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
11pub struct RevokeRequest {
12    pub test: Option<bool>,
13}
14
15#[skip_serializing_none]
16#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
17pub struct RevokeResponse {
18    pub ok: bool,
19    pub error: Option<String>,
20    pub response_metadata: Option<ResponseMetadata>,
21    pub revoked: Option<bool>,
22}
23
24/// Revokes a token.
25/// See: <https://api.slack.com/methods/auth.revoke>
26pub async fn revoke<T>(
27    client: &T,
28    param: &RevokeRequest,
29    bot_token: &str,
30) -> Result<RevokeResponse, Error>
31where
32    T: SlackWebAPIClient,
33{
34    let url = get_slack_url("auth.revoke");
35    let json = serde_json::to_string(&param)?;
36
37    client
38        .post_json(&url, &json, bot_token)
39        .await
40        .and_then(|result| {
41            serde_json::from_str::<RevokeResponse>(&result).map_err(Error::SerdeJsonError)
42        })
43}
44
45#[cfg(test)]
46mod test {
47    use super::*;
48    use crate::http_client::MockSlackWebAPIClient;
49
50    #[test]
51    fn convert_request() {
52        let request = RevokeRequest { test: Some(true) };
53        let json = r##"{
54  "test": true
55}"##;
56
57        let j = serde_json::to_string_pretty(&request).unwrap();
58        assert_eq!(json, j);
59
60        let s = serde_json::from_str::<RevokeRequest>(json).unwrap();
61        assert_eq!(request, s);
62    }
63
64    #[test]
65    fn convert_response() {
66        let response = RevokeResponse {
67            ok: true,
68            revoked: Some(true),
69            ..Default::default()
70        };
71        let json = r##"{
72  "ok": true,
73  "revoked": true
74}"##;
75
76        let j = serde_json::to_string_pretty(&response).unwrap();
77        assert_eq!(json, j);
78
79        let s = serde_json::from_str::<RevokeResponse>(json).unwrap();
80        assert_eq!(response, s);
81    }
82
83    #[async_std::test]
84    async fn test_revoke() {
85        let param = RevokeRequest { test: Some(false) };
86
87        let mut mock = MockSlackWebAPIClient::new();
88        mock.expect_post_json().returning(|_, _, _| {
89            Ok(r##"{
90          "ok": true,
91          "revoked": true
92        }"##
93            .to_string())
94        });
95
96        let response = revoke(&mock, &param, &"test_token".to_string())
97            .await
98            .unwrap();
99        let expect = RevokeResponse {
100            ok: true,
101            revoked: Some(true),
102            ..Default::default()
103        };
104
105        assert_eq!(expect, response);
106    }
107}