open_lark/service/cloud_docs/bitable/v1/app_workflow/
mod.rs1use crate::core::config::Config;
2
3pub use list::*;
4pub use update::*;
5
6mod list;
7mod update;
8
9pub struct AppWorkflowService {
11 config: Config,
12}
13
14impl AppWorkflowService {
15 pub fn new(config: Config) -> Self {
16 Self { config }
17 }
18
19 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 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}