slack_rust/team/
profile_get.rs

1use crate::error::Error;
2use crate::http_client::{get_slack_url, ResponseMetadata, SlackWebAPIClient};
3use crate::profiles::profile::Profile;
4use serde::{Deserialize, Serialize};
5use serde_with::skip_serializing_none;
6
7#[skip_serializing_none]
8#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
9pub struct ProfileGetRequest {
10    pub visibility: Option<String>,
11}
12
13#[skip_serializing_none]
14#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
15pub struct ProfileGetResponse {
16    pub ok: bool,
17    pub error: Option<String>,
18    pub response_metadata: Option<ResponseMetadata>,
19    pub profile: Option<Profile>,
20}
21
22pub async fn profile_get<T>(
23    client: &T,
24    param: &ProfileGetRequest,
25    bot_token: &str,
26) -> Result<ProfileGetResponse, Error>
27where
28    T: SlackWebAPIClient,
29{
30    let url = get_slack_url("team.profile.get");
31    let json = serde_json::to_string(&param)?;
32
33    client
34        .post_json(&url, &json, bot_token)
35        .await
36        .and_then(|result| {
37            serde_json::from_str::<ProfileGetResponse>(&result).map_err(Error::SerdeJsonError)
38        })
39}
40
41#[cfg(test)]
42mod test {
43    use super::*;
44    use crate::http_client::MockSlackWebAPIClient;
45    use crate::profiles::profile::Field;
46
47    #[test]
48    fn convert_request() {
49        let request = ProfileGetRequest {
50            visibility: Some("all".to_string()),
51        };
52        let json = r##"{
53  "visibility": "all"
54}"##;
55
56        let j = serde_json::to_string_pretty(&request).unwrap();
57        assert_eq!(json, j);
58
59        let s = serde_json::from_str::<ProfileGetRequest>(json).unwrap();
60        assert_eq!(request, s);
61    }
62
63    #[test]
64    fn convert_response() {
65        let response = ProfileGetResponse {
66            ok: true,
67            profile: Some(Profile {
68                fields: Some(vec![Field {
69                    id: Some("Xf06054AAA".to_string()),
70                    ordering: Some(0),
71                    label: Some("Phone extension".to_string()),
72                    hint: Some("Enter the extension to reach your desk".to_string()),
73                    type_filed: Some("text".to_string()),
74                    possible_values: Some(vec![]),
75                    is_hidden: Some(1),
76                    ..Default::default()
77                }]),
78            }),
79            ..Default::default()
80        };
81        let json = r##"{
82  "ok": true,
83  "profile": {
84    "fields": [
85      {
86        "id": "Xf06054AAA",
87        "ordering": 0,
88        "label": "Phone extension",
89        "hint": "Enter the extension to reach your desk",
90        "type": "text",
91        "possible_values": [],
92        "is_hidden": 1
93      }
94    ]
95  }
96}"##;
97
98        let j = serde_json::to_string_pretty(&response).unwrap();
99        assert_eq!(json, j);
100
101        let s = serde_json::from_str::<ProfileGetResponse>(json).unwrap();
102        assert_eq!(response, s);
103    }
104
105    #[async_std::test]
106    async fn test_profile_get() {
107        let param = ProfileGetRequest {
108            visibility: Some("all".to_string()),
109        };
110        let mut mock = MockSlackWebAPIClient::new();
111        mock.expect_post_json().returning(|_, _, _| {
112            Ok(r##"{
113  "ok": true,
114  "profile": {
115    "fields": [
116      {
117        "id": "Xf06054AAA",
118        "ordering": 0,
119        "label": "Phone extension",
120        "hint": "Enter the extension to reach your desk",
121        "type": "text",
122        "possible_values": [],
123        "is_hidden": 1
124      }
125    ]
126  }
127}"##
128            .to_string())
129        });
130
131        let response = profile_get(&mock, &param, &"test_token".to_string())
132            .await
133            .unwrap();
134        let expect = ProfileGetResponse {
135            ok: true,
136            profile: Some(Profile {
137                fields: Some(vec![Field {
138                    id: Some("Xf06054AAA".to_string()),
139                    ordering: Some(0),
140                    label: Some("Phone extension".to_string()),
141                    hint: Some("Enter the extension to reach your desk".to_string()),
142                    type_filed: Some("text".to_string()),
143                    possible_values: Some(vec![]),
144                    is_hidden: Some(1),
145                    ..Default::default()
146                }]),
147            }),
148            ..Default::default()
149        };
150
151        assert_eq!(expect, response);
152    }
153}