slack_rust/users/
info.rs

1use crate::error::Error;
2use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
3use crate::users::user::User;
4use serde::{Deserialize, Serialize};
5use serde_with::skip_serializing_none;
6
7#[skip_serializing_none]
8#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
9pub struct InfoRequest {
10    pub user: String,
11    pub include_locale: Option<bool>,
12}
13
14#[skip_serializing_none]
15#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
16pub struct InfoResponse {
17    pub ok: bool,
18    pub error: Option<String>,
19    pub response_metadata: Option<ResponseMetadata>,
20    pub user: Option<User>,
21}
22
23pub async fn info<T>(
24    client: &T,
25    param: &InfoRequest,
26    bot_token: &str,
27) -> Result<InfoResponse, Error>
28where
29    T: SlackWebAPIClient,
30{
31    let url = get_slack_url("users.info");
32    let json = serde_json::to_string(&param)?;
33
34    client
35        .post_json(&url, &json, bot_token)
36        .await
37        .and_then(|result| {
38            serde_json::from_str::<InfoResponse>(&result).map_err(Error::SerdeJsonError)
39        })
40}
41
42#[cfg(test)]
43mod test {
44    use super::*;
45    use crate::http_client::MockSlackWebAPIClient;
46
47    #[test]
48    fn convert_request() {
49        let request = InfoRequest {
50            user: "W1234567890".to_string(),
51            include_locale: Some(true),
52        };
53        let json = r##"{
54  "user": "W1234567890",
55  "include_locale": true
56}"##;
57
58        let j = serde_json::to_string_pretty(&request).unwrap();
59        assert_eq!(json, j);
60
61        let s = serde_json::from_str::<InfoRequest>(json).unwrap();
62        assert_eq!(request, s);
63    }
64
65    #[test]
66    fn convert_response() {
67        let response = InfoResponse {
68            ok: true,
69            user: Some(User {
70                id: Some("Sonny Whether".to_string()),
71                name: Some("U0G9QF9C6".to_string()),
72                ..Default::default()
73            }),
74            ..Default::default()
75        };
76        let json = r##"{
77  "ok": true,
78  "user": {
79    "id": "Sonny Whether",
80    "name": "U0G9QF9C6"
81  }
82}"##;
83
84        let j = serde_json::to_string_pretty(&response).unwrap();
85        assert_eq!(json, j);
86
87        let s = serde_json::from_str::<InfoResponse>(json).unwrap();
88        assert_eq!(response, s);
89    }
90
91    #[async_std::test]
92    async fn test_info() {
93        let param = InfoRequest {
94            user: "W1234567890".to_string(),
95            include_locale: Some(true),
96        };
97        let mut mock = MockSlackWebAPIClient::new();
98        mock.expect_post_json().returning(|_, _, _| {
99            Ok(r##"{
100  "ok": true,
101  "user": {
102    "id": "W1234567890",
103    "name": "xxxxxxxx"
104  },
105  "team": {
106    "id": "T0G9PQBBK"
107  }
108}"##
109            .to_string())
110        });
111
112        let response = info(&mock, &param, &"test_token".to_string())
113            .await
114            .unwrap();
115        let expect = InfoResponse {
116            ok: true,
117            user: Some(User {
118                id: Some("W1234567890".to_string()),
119                name: Some("xxxxxxxx".to_string()),
120                ..Default::default()
121            }),
122            ..Default::default()
123        };
124
125        assert_eq!(expect, response);
126    }
127}