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(¶m)?;
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, ¶m, &"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}