open_lark/service/cloud_docs/bitable/v1/app_workflow/
mod.rs

1use crate::core::config::Config;
2
3pub use list::*;
4pub use update::*;
5
6mod list;
7mod update;
8
9/// 自动化流程服务
10pub struct AppWorkflowService {
11    config: Config,
12}
13
14impl AppWorkflowService {
15    pub fn new(config: Config) -> Self {
16        Self { config }
17    }
18
19    /// 列出自动化流程
20    pub async fn list(
21        &self,
22        request: ListWorkflowRequest,
23        option: Option<crate::core::req_option::RequestOption>,
24    ) -> crate::core::SDKResult<crate::core::api_resp::BaseResponse<ListWorkflowResponse>> {
25        list_workflows(request, &self.config, option).await
26    }
27
28    /// 更新自动化流程状态
29    pub async fn update(
30        &self,
31        request: UpdateWorkflowRequest,
32        option: Option<crate::core::req_option::RequestOption>,
33    ) -> crate::core::SDKResult<crate::core::api_resp::BaseResponse<UpdateWorkflowResponse>> {
34        update_workflow(request, &self.config, option).await
35    }
36}
37
38#[cfg(test)]
39#[allow(unused_variables, unused_unsafe)]
40mod tests {
41    use super::*;
42    use crate::core::config::Config;
43
44    fn create_test_config() -> Config {
45        Config::default()
46    }
47
48    #[test]
49    fn test_app_workflow_service_creation() {
50        let config = create_test_config();
51        let service = AppWorkflowService::new(config.clone());
52
53        assert_eq!(service.config.app_id, config.app_id);
54        assert_eq!(service.config.app_secret, config.app_secret);
55    }
56
57    #[test]
58    fn test_app_workflow_service_with_custom_config() {
59        let config = Config::builder()
60            .app_id("workflow_app")
61            .app_secret("workflow_secret")
62            .req_timeout(std::time::Duration::from_millis(12000))
63            .base_url("https://workflow.api.com")
64            .build();
65
66        let service = AppWorkflowService::new(config.clone());
67
68        assert_eq!(service.config.app_id, "workflow_app");
69        assert_eq!(service.config.app_secret, "workflow_secret");
70        assert_eq!(service.config.base_url, "https://workflow.api.com");
71        assert_eq!(
72            service.config.req_timeout,
73            Some(std::time::Duration::from_millis(12000))
74        );
75    }
76
77    #[test]
78    fn test_app_workflow_service_config_independence() {
79        let config1 = Config::builder()
80            .app_id("workflow1")
81            .app_secret("secret1")
82            .build();
83        let config2 = Config::builder()
84            .app_id("workflow2")
85            .app_secret("secret2")
86            .build();
87
88        let service1 = AppWorkflowService::new(config1);
89        let service2 = AppWorkflowService::new(config2);
90
91        assert_eq!(service1.config.app_id, "workflow1");
92        assert_eq!(service2.config.app_id, "workflow2");
93        assert_ne!(service1.config.app_id, service2.config.app_id);
94    }
95
96    #[test]
97    fn test_app_workflow_service_memory_layout() {
98        let config = create_test_config();
99        let service = AppWorkflowService::new(config);
100
101        let service_ptr = std::ptr::addr_of!(service) as *const u8;
102        let config_ptr = std::ptr::addr_of!(service.config) as *const u8;
103
104        assert!(
105            !service_ptr.is_null(),
106            "Service should have valid memory address"
107        );
108        assert!(
109            !config_ptr.is_null(),
110            "Config should have valid memory address"
111        );
112    }
113
114    #[test]
115    fn test_app_workflow_service_with_different_configurations() {
116        let test_configs = vec![
117            Config::builder()
118                .app_id("workflow_basic")
119                .app_secret("basic_secret")
120                .build(),
121            Config::builder()
122                .app_id("workflow_timeout")
123                .app_secret("timeout_secret")
124                .req_timeout(std::time::Duration::from_millis(9500))
125                .build(),
126            Config::builder()
127                .app_id("workflow_custom")
128                .app_secret("custom_secret")
129                .base_url("https://custom.workflow.com")
130                .build(),
131            Config::builder()
132                .app_id("workflow_full")
133                .app_secret("full_secret")
134                .req_timeout(std::time::Duration::from_millis(19000))
135                .base_url("https://full.workflow.com")
136                .enable_token_cache(false)
137                .build(),
138        ];
139
140        for config in test_configs {
141            let service = AppWorkflowService::new(config.clone());
142
143            assert_eq!(service.config.app_id, config.app_id);
144            assert_eq!(service.config.app_secret, config.app_secret);
145            assert_eq!(service.config.base_url, config.base_url);
146            assert_eq!(service.config.req_timeout, config.req_timeout);
147        }
148    }
149
150    #[test]
151    fn test_app_workflow_service_multiple_instances() {
152        let config = create_test_config();
153        let service1 = AppWorkflowService::new(config.clone());
154        let service2 = AppWorkflowService::new(config.clone());
155
156        assert_eq!(service1.config.app_id, service2.config.app_id);
157        assert_eq!(service1.config.app_secret, service2.config.app_secret);
158
159        let ptr1 = std::ptr::addr_of!(service1) as *const u8;
160        let ptr2 = std::ptr::addr_of!(service2) as *const u8;
161        assert_ne!(ptr1, ptr2, "Services should be independent instances");
162    }
163
164    #[test]
165    fn test_app_workflow_service_config_cloning() {
166        let original_config = create_test_config();
167        let cloned_config = original_config.clone();
168
169        let service = AppWorkflowService::new(cloned_config);
170
171        assert_eq!(service.config.app_id, original_config.app_id);
172        assert_eq!(service.config.app_secret, original_config.app_secret);
173    }
174
175    #[test]
176    fn test_app_workflow_service_with_empty_config() {
177        let config = Config::default();
178        let service = AppWorkflowService::new(config);
179
180        assert_eq!(service.config.app_id, "");
181        assert_eq!(service.config.app_secret, "");
182    }
183
184    #[test]
185    fn test_app_workflow_service_with_unicode_config() {
186        let config = Config::builder()
187            .app_id("工作流应用")
188            .app_secret("工作流密钥")
189            .base_url("https://工作流.com")
190            .build();
191        let service = AppWorkflowService::new(config);
192
193        assert_eq!(service.config.app_id, "工作流应用");
194        assert_eq!(service.config.app_secret, "工作流密钥");
195        assert_eq!(service.config.base_url, "https://工作流.com");
196    }
197
198    #[test]
199    fn test_app_workflow_service_with_extreme_timeout() {
200        let config = Config::builder()
201            .app_id("workflow_extreme")
202            .app_secret("extreme_secret")
203            .req_timeout(std::time::Duration::from_secs(10800))
204            .build();
205        let service = AppWorkflowService::new(config);
206
207        assert_eq!(
208            service.config.req_timeout,
209            Some(std::time::Duration::from_secs(10800))
210        );
211    }
212
213    #[test]
214    fn test_app_workflow_service_concurrent_creation() {
215        let configs = vec![
216            Config::builder()
217                .app_id("workflow_concurrent_1")
218                .app_secret("secret_1")
219                .build(),
220            Config::builder()
221                .app_id("workflow_concurrent_2")
222                .app_secret("secret_2")
223                .build(),
224            Config::builder()
225                .app_id("workflow_concurrent_3")
226                .app_secret("secret_3")
227                .build(),
228        ];
229
230        let mut services = Vec::new();
231        for config in configs {
232            let service = AppWorkflowService::new(config);
233            services.push(service);
234        }
235
236        assert_eq!(services.len(), 3);
237
238        for (i, service1) in services.iter().enumerate() {
239            for service2 in services.iter().skip(i + 1) {
240                let ptr1 = std::ptr::addr_of!(*service1) as *const u8;
241                let ptr2 = std::ptr::addr_of!(*service2) as *const u8;
242                assert_ne!(ptr1, ptr2, "Services should be independent instances");
243            }
244        }
245    }
246}