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