slack_rust/conversations/
members.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 MembersRequest {
9 pub channel: String,
10 pub cursor: Option<String>,
11 pub limit: Option<i32>,
12}
13
14#[skip_serializing_none]
15#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
16pub struct MembersResponse {
17 pub ok: bool,
18 pub error: Option<String>,
19 pub response_metadata: Option<ResponseMetadata>,
20 pub members: Option<Vec<String>>,
21}
22
23pub async fn members<T>(
24 client: &T,
25 param: &MembersRequest,
26 bot_token: &str,
27) -> Result<MembersResponse, Error>
28where
29 T: SlackWebAPIClient,
30{
31 let url = get_slack_url("conversations.members");
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::<MembersResponse>(&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 = MembersRequest {
50 channel: "C1234567890".to_string(),
51 cursor: Some("dXNlcjpVMDYxTkZUVDI=".to_string()),
52 limit: Some(20),
53 };
54 let json = r##"{
55 "channel": "C1234567890",
56 "cursor": "dXNlcjpVMDYxTkZUVDI=",
57 "limit": 20
58}"##;
59
60 let j = serde_json::to_string_pretty(&request).unwrap();
61 assert_eq!(json, j);
62
63 let s = serde_json::from_str::<MembersRequest>(json).unwrap();
64 assert_eq!(request, s);
65 }
66
67 #[test]
68 fn convert_response() {
69 let response = MembersResponse {
70 ok: true,
71 members: Some(vec![
72 "U023BECGF".to_string(),
73 "U061F7AUR".to_string(),
74 "W012A3CDE".to_string(),
75 ]),
76 ..Default::default()
77 };
78 let json = r##"{
79 "ok": true,
80 "members": [
81 "U023BECGF",
82 "U061F7AUR",
83 "W012A3CDE"
84 ]
85}"##;
86
87 let j = serde_json::to_string_pretty(&response).unwrap();
88 assert_eq!(json, j);
89
90 let s = serde_json::from_str::<MembersResponse>(json).unwrap();
91 assert_eq!(response, s);
92 }
93
94 #[async_std::test]
95 async fn test_members() {
96 let param = MembersRequest {
97 channel: "C1234567890".to_string(),
98 cursor: Some("dXNlcjpVMDYxTkZUVDI=".to_string()),
99 limit: Some(20),
100 };
101
102 let mut mock = MockSlackWebAPIClient::new();
103 mock.expect_post_json().returning(|_, _, _| {
104 Ok(r##"{
105 "ok": true,
106 "members": [
107 "U023BECGF",
108 "U061F7AUR",
109 "W012A3CDE"
110 ]
111}"##
112 .to_string())
113 });
114
115 let response = members(&mock, ¶m, &"test_token".to_string())
116 .await
117 .unwrap();
118 let expect = MembersResponse {
119 ok: true,
120 members: Some(vec![
121 "U023BECGF".to_string(),
122 "U061F7AUR".to_string(),
123 "W012A3CDE".to_string(),
124 ]),
125 ..Default::default()
126 };
127
128 assert_eq!(expect, response);
129 }
130}