slack_rust/users/
get_presence.rs1use 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(¶m)?;
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, ¶m, &"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}