slack_rust/users/
get_presence.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 GetPresenceRequest {
9    pub user: Option<String>,
10}
11
12#[skip_serializing_none]
13#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
14pub struct GetPresenceResponse {
15    pub ok: bool,
16    pub error: Option<String>,
17    pub response_metadata: Option<ResponseMetadata>,
18    pub presence: Option<String>,
19    pub online: Option<bool>,
20    pub auto_away: Option<bool>,
21    pub manual_away: Option<bool>,
22    pub connection_count: Option<i8>,
23    pub last_activity: Option<i32>,
24}
25
26pub async fn get_presence<T>(
27    client: &T,
28    param: &GetPresenceRequest,
29    bot_token: &str,
30) -> Result<GetPresenceResponse, Error>
31where
32    T: SlackWebAPIClient,
33{
34    let url = get_slack_url("users.getPresence");
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::<GetPresenceResponse>(&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 = GetPresenceRequest {
53            user: Some("xxxxxxxxxx".to_string()),
54        };
55        let json = r##"{
56  "user": "xxxxxxxxxx"
57}"##;
58
59        let j = serde_json::to_string_pretty(&request).unwrap();
60        assert_eq!(json, j);
61
62        let s = serde_json::from_str::<GetPresenceRequest>(json).unwrap();
63        assert_eq!(request, s);
64    }
65
66    #[test]
67    fn convert_response() {
68        let response = GetPresenceResponse {
69            ok: true,
70            presence: Some("active".to_string()),
71            online: Some(true),
72            auto_away: Some(false),
73            manual_away: Some(false),
74            connection_count: Some(1),
75            last_activity: Some(1419027078),
76            ..Default::default()
77        };
78        let json = r##"{
79  "ok": true,
80  "presence": "active",
81  "online": true,
82  "auto_away": false,
83  "manual_away": false,
84  "connection_count": 1,
85  "last_activity": 1419027078
86}"##;
87
88        let j = serde_json::to_string_pretty(&response).unwrap();
89        assert_eq!(json, j);
90
91        let s = serde_json::from_str::<GetPresenceResponse>(json).unwrap();
92        assert_eq!(response, s);
93    }
94
95    #[async_std::test]
96    async fn test_get_presence() {
97        let param = GetPresenceRequest {
98            user: Some("xxxxxxxxxx".to_string()),
99        };
100        let mut mock = MockSlackWebAPIClient::new();
101        mock.expect_post_json().returning(|_, _, _| {
102            Ok(r##"{
103  "ok": true,
104  "presence": "active",
105  "online": true,
106  "auto_away": false,
107  "manual_away": false,
108  "connection_count": 1,
109  "last_activity": 1419027078
110}"##
111            .to_string())
112        });
113
114        let response = get_presence(&mock, &param, &"test_token".to_string())
115            .await
116            .unwrap();
117        let expect = GetPresenceResponse {
118            ok: true,
119            presence: Some("active".to_string()),
120            online: Some(true),
121            auto_away: Some(false),
122            manual_away: Some(false),
123            connection_count: Some(1),
124            last_activity: Some(1419027078),
125            ..Default::default()
126        };
127
128        assert_eq!(expect, response);
129    }
130}