1use crate::client::GeweHttpClient;
2use gewe_core::{
3 DeleteFavorRequest, GetFavorContentRequest, GetFavorContentResponse, GeweError,
4 SyncFavorRequest, SyncFavorResponse,
5};
6use tracing::instrument;
7
8impl GeweHttpClient {
9 #[instrument(skip(self))]
10 pub async fn sync_favorites(
11 &self,
12 req: SyncFavorRequest<'_>,
13 ) -> Result<SyncFavorResponse, GeweError> {
14 let env = self
15 .post_api::<_, SyncFavorResponse>("gewe/v2/api/favor/sync", &req)
16 .await?;
17 env.data.ok_or(GeweError::MissingData)
18 }
19
20 #[instrument(skip(self))]
21 pub async fn get_favor_content(
22 &self,
23 req: GetFavorContentRequest<'_>,
24 ) -> Result<GetFavorContentResponse, GeweError> {
25 let env = self
26 .post_api::<_, GetFavorContentResponse>("gewe/v2/api/favor/getContent", &req)
27 .await?;
28 env.data.ok_or(GeweError::MissingData)
29 }
30
31 #[instrument(skip(self))]
32 pub async fn delete_favor(&self, req: DeleteFavorRequest<'_>) -> Result<(), GeweError> {
33 self.post_api::<_, serde_json::Value>("gewe/v2/api/favor/delete", &req)
34 .await?;
35 Ok(())
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use gewe_core::{DeleteFavorRequest, GetFavorContentRequest, SyncFavorRequest};
42
43 #[test]
44 fn test_sync_favor_request_serialization() {
45 let req = SyncFavorRequest {
46 app_id: "test_app",
47 sync_key: Some("sync_key_123"),
48 };
49
50 let json = serde_json::to_string(&req).unwrap();
51 assert!(json.contains("appId"));
52 assert!(json.contains("test_app"));
53 assert!(json.contains("syncKey"));
54 assert!(json.contains("sync_key_123"));
55 }
56
57 #[test]
58 fn test_sync_favor_request_without_sync_key() {
59 let req = SyncFavorRequest {
60 app_id: "test_app",
61 sync_key: None,
62 };
63
64 let json = serde_json::to_string(&req).unwrap();
65 assert!(json.contains("appId"));
66 assert!(json.contains("test_app"));
67 assert!(!json.contains("syncKey"));
69 }
70
71 #[test]
72 fn test_sync_favor_request_field_names() {
73 let req = SyncFavorRequest {
74 app_id: "app",
75 sync_key: Some("key"),
76 };
77
78 let json = serde_json::to_string(&req).unwrap();
79 let value: serde_json::Value = serde_json::from_str(&json).unwrap();
80
81 assert!(value.get("appId").is_some());
83 assert!(value.get("syncKey").is_some());
84 }
85
86 #[test]
87 fn test_get_favor_content_request_serialization() {
88 let req = GetFavorContentRequest {
89 app_id: "my_app",
90 fav_id: 123456,
91 };
92
93 let json = serde_json::to_string(&req).unwrap();
94 assert!(json.contains("appId"));
95 assert!(json.contains("my_app"));
96 assert!(json.contains("favId"));
97 assert!(json.contains("123456"));
98 }
99
100 #[test]
101 fn test_get_favor_content_request_field_names() {
102 let req = GetFavorContentRequest {
103 app_id: "app",
104 fav_id: 999,
105 };
106
107 let json = serde_json::to_string(&req).unwrap();
108 let value: serde_json::Value = serde_json::from_str(&json).unwrap();
109
110 assert!(value.get("appId").is_some());
112 assert!(value.get("favId").is_some());
113 assert_eq!(value.get("favId").unwrap().as_i64().unwrap(), 999);
114 }
115
116 #[test]
117 fn test_delete_favor_request_serialization() {
118 let req = DeleteFavorRequest {
119 app_id: "app_test",
120 fav_id: 789,
121 };
122
123 let json = serde_json::to_string(&req).unwrap();
124 assert!(json.contains("appId"));
125 assert!(json.contains("app_test"));
126 assert!(json.contains("favId"));
127 assert!(json.contains("789"));
128 }
129
130 #[test]
131 fn test_delete_favor_request_field_names() {
132 let req = DeleteFavorRequest {
133 app_id: "app",
134 fav_id: 456,
135 };
136
137 let json = serde_json::to_string(&req).unwrap();
138 let value: serde_json::Value = serde_json::from_str(&json).unwrap();
139
140 assert!(value.get("appId").is_some());
142 assert!(value.get("favId").is_some());
143 assert_eq!(value.get("favId").unwrap().as_i64().unwrap(), 456);
144 }
145
146 #[test]
147 fn test_sync_favor_request_with_large_fav_id() {
148 let req = GetFavorContentRequest {
149 app_id: "app",
150 fav_id: 9999999999,
151 };
152
153 let json = serde_json::to_string(&req).unwrap();
154 assert!(json.contains("9999999999"));
155 }
156
157 #[test]
158 fn test_sync_favor_request_with_special_chars() {
159 let req = SyncFavorRequest {
160 app_id: "测试应用",
161 sync_key: Some("密钥123"),
162 };
163
164 let json = serde_json::to_string(&req).unwrap();
165 assert!(json.contains("测试应用") || json.contains("\\u"));
167 }
168
169 #[test]
170 fn test_sync_favor_request_clone() {
171 let req = SyncFavorRequest {
172 app_id: "app",
173 sync_key: Some("key"),
174 };
175
176 let cloned = req.clone();
177 assert_eq!(req.app_id, cloned.app_id);
178 assert_eq!(req.sync_key, cloned.sync_key);
179 }
180
181 #[test]
182 fn test_get_favor_content_request_clone() {
183 let req = GetFavorContentRequest {
184 app_id: "app",
185 fav_id: 100,
186 };
187
188 let cloned = req.clone();
189 assert_eq!(req.app_id, cloned.app_id);
190 assert_eq!(req.fav_id, cloned.fav_id);
191 }
192
193 #[test]
194 fn test_delete_favor_request_clone() {
195 let req = DeleteFavorRequest {
196 app_id: "app",
197 fav_id: 200,
198 };
199
200 let cloned = req.clone();
201 assert_eq!(req.app_id, cloned.app_id);
202 assert_eq!(req.fav_id, cloned.fav_id);
203 }
204}