open_lark/service/cloud_docs/
mod.rs1use crate::core::config::Config;
137use std::sync::Arc;
138
139pub mod assistant;
141pub mod bitable;
142pub mod board;
143pub mod comments;
144pub mod docx;
145pub mod drive;
146pub mod permission;
147pub mod sheets;
148pub mod wiki;
149
150pub use assistant::AssistantService;
152pub use bitable::BitableService;
153pub use board::BoardService;
154pub use comments::CommentsService;
155pub use docx::DocxService;
156pub use drive::DriveService;
157pub use permission::PermissionService;
158pub use sheets::SheetsService;
159pub use wiki::WikiService;
160
161pub struct CloudDocsService {
174 pub drive: DriveService,
175 pub wiki: WikiService,
176 pub docx: DocxService,
177 pub sheets: SheetsService,
178 pub bitable: BitableService,
179 pub board: BoardService,
180 pub permission: PermissionService,
181 pub comments: CommentsService,
182 pub assistant: AssistantService,
183}
184
185impl CloudDocsService {
186 pub fn new(config: Config) -> Self {
187 Self {
188 drive: DriveService::new(config.clone()),
189 wiki: WikiService::new(config.clone()),
190 docx: DocxService::new(config.clone()),
191 sheets: SheetsService::new(config.clone()),
192 bitable: BitableService::new(config.clone()),
193 board: BoardService::new(config.clone()),
194 permission: PermissionService::new(config.clone()),
195 comments: CommentsService::new(config.clone()),
196 assistant: AssistantService::new(config.clone()),
197 }
198 }
199
200 pub fn new_from_shared(shared: Arc<Config>) -> Self {
202 Self {
203 drive: DriveService::new_from_shared(shared.clone()),
204 wiki: WikiService::new_from_shared(shared.clone()),
205 docx: DocxService::new_from_shared(shared.clone()),
206 sheets: SheetsService::new_from_shared(shared.clone()),
207 bitable: BitableService::new_from_shared(shared.clone()),
208 board: BoardService::new_from_shared(shared.clone()),
209 permission: PermissionService::new_from_shared(shared.clone()),
210 comments: CommentsService::new_from_shared(shared.clone()),
211 assistant: AssistantService::new_from_shared(shared),
212 }
213 }
214}
215
216#[cfg(test)]
217mod tests {
218 use super::*;
219 use std::time::Duration;
220
221 #[test]
222 fn test_cloud_docs_service_creation() {
223 let config = Config::default();
224 let service = CloudDocsService::new(config.clone());
225
226 let _ = &service.drive;
228 let _ = &service.wiki;
229 let _ = &service.docx;
230 let _ = &service.sheets;
231 let _ = &service.bitable;
232 let _ = &service.board;
233 let _ = &service.permission;
234 let _ = &service.comments;
235 let _ = &service.assistant;
236
237 let _ = &service.drive.v1;
239 let _ = &service.drive.v2;
240 let _ = &service.wiki.v2;
241 let _ = &service.docx.v1;
242 let _ = &service.bitable.v1;
243 let _ = &service.assistant.v1;
244 }
245
246 #[test]
247 fn test_cloud_docs_service_with_custom_config() {
248 let config = Config::builder()
249 .app_id("cloud_docs_test_app")
250 .app_secret("cloud_docs_test_secret")
251 .req_timeout(Duration::from_secs(300))
252 .build();
253
254 let service = CloudDocsService::new(config.clone());
255
256 let _ = &service.drive;
258 let _ = &service.wiki;
259 let _ = &service.docx;
260 let _ = &service.sheets;
261 let _ = &service.bitable;
262 let _ = &service.board;
263 let _ = &service.permission;
264 let _ = &service.comments;
265 let _ = &service.assistant;
266 }
267
268 #[test]
269 fn test_cloud_docs_service_config_independence() {
270 let config1 = Config::builder().app_id("cloud_docs_app_1").build();
271
272 let config2 = Config::builder().app_id("cloud_docs_app_2").build();
273
274 let service1 = CloudDocsService::new(config1);
275 let service2 = CloudDocsService::new(config2);
276
277 assert!(!std::ptr::eq(
279 std::ptr::addr_of!(service1.drive),
280 std::ptr::addr_of!(service2.drive)
281 ));
282 assert!(!std::ptr::eq(
283 std::ptr::addr_of!(service1.wiki),
284 std::ptr::addr_of!(service2.wiki)
285 ));
286 assert!(!std::ptr::eq(
287 std::ptr::addr_of!(service1.docx),
288 std::ptr::addr_of!(service2.docx)
289 ));
290 assert!(!std::ptr::eq(
291 std::ptr::addr_of!(service1.sheets),
292 std::ptr::addr_of!(service2.sheets)
293 ));
294 assert!(!std::ptr::eq(
295 std::ptr::addr_of!(service1.bitable),
296 std::ptr::addr_of!(service2.bitable)
297 ));
298 assert!(!std::ptr::eq(
299 std::ptr::addr_of!(service1.board),
300 std::ptr::addr_of!(service2.board)
301 ));
302 assert!(!std::ptr::eq(
303 std::ptr::addr_of!(service1.permission),
304 std::ptr::addr_of!(service2.permission)
305 ));
306 assert!(!std::ptr::eq(
307 std::ptr::addr_of!(service1.comments),
308 std::ptr::addr_of!(service2.comments)
309 ));
310 assert!(!std::ptr::eq(
311 std::ptr::addr_of!(service1.assistant),
312 std::ptr::addr_of!(service2.assistant)
313 ));
314 }
315
316 #[test]
317 fn test_cloud_docs_service_sub_services_accessible() {
318 let config = Config::default();
319 let service = CloudDocsService::new(config.clone());
320
321 let _ = &service.drive.v1;
323 let _ = &service.drive.v2;
324 let _ = &service.wiki.v2;
325 let _ = &service.docx.v1;
326 let _ = &service.bitable.v1;
327 let _ = &service.assistant.v1;
328 let _ = &service.board.whiteboard;
329 }
330
331 #[test]
332 fn test_cloud_docs_service_config_cloning() {
333 let config = Config::builder()
334 .app_id("clone_test_app")
335 .app_secret("clone_test_secret")
336 .build();
337
338 let service = CloudDocsService::new(config.clone());
339
340 let _ = &service.drive;
342 let _ = &service.wiki;
343 let _ = &service.docx;
344 let _ = &service.sheets;
345 let _ = &service.bitable;
346 let _ = &service.board;
347 let _ = &service.permission;
348 let _ = &service.comments;
349 let _ = &service.assistant;
350 }
351
352 #[test]
353 fn test_cloud_docs_service_timeout_propagation() {
354 let config = Config::builder()
355 .req_timeout(Duration::from_secs(240))
356 .build();
357
358 let service = CloudDocsService::new(config);
359
360 let _ = &service.drive;
362 let _ = &service.wiki;
363 let _ = &service.docx;
364 let _ = &service.sheets;
365 let _ = &service.bitable;
366 let _ = &service.board;
367 let _ = &service.permission;
368 let _ = &service.comments;
369 let _ = &service.assistant;
370 }
371
372 #[test]
373 fn test_cloud_docs_service_multiple_instances() {
374 let config = Config::default();
375
376 let service1 = CloudDocsService::new(config.clone());
377 let service2 = CloudDocsService::new(config.clone());
378
379 let _ = &service1.drive;
382 let _ = &service2.drive;
383 let _ = &service1.wiki;
385 let _ = &service2.wiki;
386 let _ = &service1.docx;
388 let _ = &service2.docx;
389 let _ = &service1.sheets;
391 let _ = &service2.sheets;
392 let _ = &service1.bitable;
394 let _ = &service2.bitable;
395 let _ = &service1.board;
397 let _ = &service2.board;
398 let _ = &service1.permission;
400 let _ = &service2.permission;
401 let _ = &service1.comments;
403 let _ = &service2.comments;
404 let _ = &service1.assistant;
406 let _ = &service2.assistant;
407 }
408
409 #[test]
410 fn test_cloud_docs_service_config_consistency() {
411 let config = Config::builder()
412 .app_id("consistency_test")
413 .app_secret("consistency_secret")
414 .req_timeout(Duration::from_secs(360))
415 .build();
416
417 let service = CloudDocsService::new(config);
418
419 let _ = &service.drive;
421 let _ = &service.wiki;
422 let _ = &service.docx;
423 let _ = &service.sheets;
424 let _ = &service.bitable;
425 let _ = &service.board;
426 let _ = &service.permission;
427 let _ = &service.comments;
428 let _ = &service.assistant;
429 }
430}