1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4#[serde(rename_all = "camelCase")]
5pub struct SearchWecomRequest<'a> {
6 #[serde(rename = "appId")]
7 pub app_id: &'a str,
8 pub scene: i32,
9 pub content: &'a str,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize, Default)]
13#[serde(rename_all = "camelCase")]
14pub struct SearchWecomResponse {
15 #[serde(rename = "nickName")]
16 pub nick_name: String,
17 pub sex: i32,
18 pub signature: String,
19 #[serde(rename = "bigHeadImgUrl")]
20 pub big_head_img_url: String,
21 #[serde(rename = "smallHeadImgUrl")]
22 pub small_head_img_url: String,
23 pub v3: String,
24 pub v4: String,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28#[serde(rename_all = "camelCase")]
29pub struct SyncWecomContactsRequest<'a> {
30 #[serde(rename = "appId")]
31 pub app_id: &'a str,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, Default)]
35#[serde(rename_all = "camelCase")]
36pub struct WecomContact {
37 #[serde(rename = "userName")]
38 pub user_name: String,
39 #[serde(rename = "nickName")]
40 pub nick_name: String,
41 pub remark: String,
42 #[serde(rename = "bigHeadImg")]
43 pub big_head_img: String,
44 #[serde(rename = "smallHeadImg")]
45 pub small_head_img: String,
46 #[serde(rename = "appId")]
47 pub app_id: String,
48 #[serde(rename = "descWordingId")]
49 pub desc_wording_id: String,
50}
51
52pub type SyncWecomContactsResponse = Vec<WecomContact>;
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55#[serde(rename_all = "camelCase")]
56pub struct AddWecomContactRequest<'a> {
57 #[serde(rename = "appId")]
58 pub app_id: &'a str,
59 pub v3: &'a str,
60 pub v4: &'a str,
61}
62
63pub type AddWecomContactResponse = ();
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
66#[serde(rename_all = "camelCase")]
67pub struct GetWecomContactDetailRequest<'a> {
68 #[serde(rename = "appId")]
69 pub app_id: &'a str,
70 #[serde(rename = "toUserName")]
71 pub to_user_name: &'a str,
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize, Default)]
75#[serde(rename_all = "camelCase")]
76pub struct WecomContactDetail {
77 #[serde(rename = "userName")]
78 pub user_name: String,
79 #[serde(rename = "nickName")]
80 pub nick_name: String,
81 pub remark: String,
82 #[serde(rename = "bigHeadImg")]
83 pub big_head_img: String,
84 #[serde(rename = "smallHeadImg")]
85 pub small_head_img: String,
86 #[serde(rename = "appId")]
87 pub app_id: String,
88 #[serde(rename = "descWordingId")]
89 pub desc_wording_id: String,
90 pub wording: String,
91 #[serde(rename = "wordingPinyin")]
92 pub wording_pinyin: String,
93 #[serde(rename = "wordingQuanpin")]
94 pub wording_quanpin: String,
95}
96
97pub type GetWecomContactDetailResponse = WecomContactDetail;
98
99#[cfg(test)]
100mod tests {
101 use super::*;
102
103 #[test]
104 fn test_search_wecom_response_default() {
105 let resp = SearchWecomResponse::default();
106 assert_eq!(resp.nick_name, "");
107 assert_eq!(resp.sex, 0);
108 assert_eq!(resp.signature, "");
109 assert_eq!(resp.v3, "");
110 assert_eq!(resp.v4, "");
111 }
112
113 #[test]
114 fn test_search_wecom_response_deserialization() {
115 let json = r#"{
116 "nickName": "WecomUser",
117 "sex": 1,
118 "signature": "Enterprise contact",
119 "bigHeadImgUrl": "http://example.com/big.jpg",
120 "smallHeadImgUrl": "http://example.com/small.jpg",
121 "v3": "test_v3",
122 "v4": "test_v4"
123 }"#;
124 let resp: SearchWecomResponse = serde_json::from_str(json).unwrap();
125 assert_eq!(resp.nick_name, "WecomUser");
126 assert_eq!(resp.sex, 1);
127 assert_eq!(resp.signature, "Enterprise contact");
128 assert_eq!(resp.v3, "test_v3");
129 assert_eq!(resp.v4, "test_v4");
130 }
131
132 #[test]
133 fn test_wecom_contact_default() {
134 let contact = WecomContact::default();
135 assert_eq!(contact.user_name, "");
136 assert_eq!(contact.nick_name, "");
137 assert_eq!(contact.remark, "");
138 assert_eq!(contact.app_id, "");
139 }
140
141 #[test]
142 fn test_wecom_contact_deserialization() {
143 let json = r#"{
144 "userName": "wecom_user",
145 "nickName": "WecomUser",
146 "remark": "Enterprise contact",
147 "bigHeadImg": "http://example.com/big.jpg",
148 "smallHeadImg": "http://example.com/small.jpg",
149 "appId": "test_app",
150 "descWordingId": "wording123"
151 }"#;
152 let contact: WecomContact = serde_json::from_str(json).unwrap();
153 assert_eq!(contact.user_name, "wecom_user");
154 assert_eq!(contact.nick_name, "WecomUser");
155 assert_eq!(contact.remark, "Enterprise contact");
156 assert_eq!(contact.app_id, "test_app");
157 assert_eq!(contact.desc_wording_id, "wording123");
158 }
159
160 #[test]
161 fn test_wecom_contact_detail_default() {
162 let detail = WecomContactDetail::default();
163 assert_eq!(detail.user_name, "");
164 assert_eq!(detail.nick_name, "");
165 assert_eq!(detail.wording, "");
166 }
167
168 #[test]
169 fn test_wecom_contact_detail_deserialization() {
170 let json = r#"{
171 "userName": "wecom_user",
172 "nickName": "WecomUser",
173 "remark": "Enterprise contact",
174 "bigHeadImg": "http://example.com/big.jpg",
175 "smallHeadImg": "http://example.com/small.jpg",
176 "appId": "test_app",
177 "descWordingId": "wording123",
178 "wording": "Department: Sales",
179 "wordingPinyin": "bmxs",
180 "wordingQuanpin": "bumenxiaoshou"
181 }"#;
182 let detail: WecomContactDetail = serde_json::from_str(json).unwrap();
183 assert_eq!(detail.user_name, "wecom_user");
184 assert_eq!(detail.nick_name, "WecomUser");
185 assert_eq!(detail.wording, "Department: Sales");
186 assert_eq!(detail.wording_pinyin, "bmxs");
187 assert_eq!(detail.wording_quanpin, "bumenxiaoshou");
188 }
189
190 #[test]
191 fn test_search_wecom_request_serialization() {
192 let req = SearchWecomRequest {
193 app_id: "test_app",
194 scene: 1,
195 content: "search_term",
196 };
197 let json = serde_json::to_string(&req).unwrap();
198 assert!(json.contains("test_app"));
199 assert!(json.contains("search_term"));
200 }
201
202 #[test]
203 fn test_sync_wecom_contacts_request_serialization() {
204 let req = SyncWecomContactsRequest { app_id: "test_app" };
205 let json = serde_json::to_string(&req).unwrap();
206 assert!(json.contains("test_app"));
207 }
208
209 #[test]
210 fn test_add_wecom_contact_request_serialization() {
211 let req = AddWecomContactRequest {
212 app_id: "test_app",
213 v3: "test_v3",
214 v4: "test_v4",
215 };
216 let json = serde_json::to_string(&req).unwrap();
217 assert!(json.contains("test_app"));
218 assert!(json.contains("test_v3"));
219 assert!(json.contains("test_v4"));
220 }
221
222 #[test]
223 fn test_get_wecom_contact_detail_request_serialization() {
224 let req = GetWecomContactDetailRequest {
225 app_id: "test_app",
226 to_user_name: "wecom_user",
227 };
228 let json = serde_json::to_string(&req).unwrap();
229 assert!(json.contains("test_app"));
230 assert!(json.contains("wecom_user"));
231 }
232}