gewe_http/
favorite.rs

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        // sync_key 为 None 时应该被跳过(skip_serializing_if)
68        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        // 验证字段名是 camelCase
82        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        // 验证字段名是 camelCase
111        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        // 验证字段名是 camelCase
141        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        // 验证 Unicode 字符能正确序列化
166        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}