open_lark/service/cloud_docs/bitable/v1/app_role/
mod.rs1pub mod create;
2pub mod delete;
3pub mod list;
4pub mod update;
5
6use crate::core::config::Config;
7
8pub use create::*;
9pub use delete::*;
10pub use list::*;
11pub use update::*;
12
13pub struct AppRoleService {
15 config: Config,
16}
17
18impl AppRoleService {
19 pub fn new(config: Config) -> Self {
20 Self { config }
21 }
22
23 pub async fn update(
25 &self,
26 request: UpdateAppRoleRequest,
27 option: Option<crate::core::req_option::RequestOption>,
28 ) -> crate::core::SDKResult<crate::core::api_resp::BaseResponse<UpdateAppRoleResponse>> {
29 update::update_app_role(request, &self.config, option).await
30 }
31
32 pub async fn list(
34 &self,
35 request: ListAppRoleRequest,
36 option: Option<crate::core::req_option::RequestOption>,
37 ) -> crate::core::SDKResult<crate::core::api_resp::BaseResponse<ListAppRoleResponse>> {
38 list::list_app_roles(request, &self.config, option).await
39 }
40
41 pub async fn delete(
43 &self,
44 request: DeleteAppRoleRequest,
45 option: Option<crate::core::req_option::RequestOption>,
46 ) -> crate::core::SDKResult<crate::core::api_resp::BaseResponse<DeleteAppRoleResponse>> {
47 delete::delete_app_role(request, &self.config, option).await
48 }
49}
50
51#[cfg(test)]
52#[allow(unused_variables, unused_unsafe)]
53mod tests {
54 use super::*;
55 use crate::core::config::Config;
56
57 fn create_test_config() -> Config {
58 Config::default()
59 }
60
61 #[test]
62 fn test_app_role_service_creation() {
63 let config = create_test_config();
64 let service = AppRoleService::new(config.clone());
65
66 assert_eq!(service.config.app_id, config.app_id);
67 assert_eq!(service.config.app_secret, config.app_secret);
68 }
69
70 #[test]
71 fn test_app_role_service_with_custom_config() {
72 let config = Config::builder()
73 .app_id("role_app")
74 .app_secret("role_secret")
75 .req_timeout(std::time::Duration::from_millis(8000))
76 .base_url("https://role.api.com")
77 .build();
78
79 let service = AppRoleService::new(config.clone());
80
81 assert_eq!(service.config.app_id, "role_app");
82 assert_eq!(service.config.app_secret, "role_secret");
83 assert_eq!(service.config.base_url, "https://role.api.com");
84 assert_eq!(
85 service.config.req_timeout,
86 Some(std::time::Duration::from_millis(8000))
87 );
88 }
89
90 #[test]
91 fn test_app_role_service_config_independence() {
92 let config1 = Config::builder()
93 .app_id("role1")
94 .app_secret("secret1")
95 .build();
96 let config2 = Config::builder()
97 .app_id("role2")
98 .app_secret("secret2")
99 .build();
100
101 let service1 = AppRoleService::new(config1);
102 let service2 = AppRoleService::new(config2);
103
104 assert_eq!(service1.config.app_id, "role1");
105 assert_eq!(service2.config.app_id, "role2");
106 assert_ne!(service1.config.app_id, service2.config.app_id);
107 }
108
109 #[test]
110 fn test_app_role_service_memory_layout() {
111 let config = create_test_config();
112 let service = AppRoleService::new(config);
113
114 let service_ptr = std::ptr::addr_of!(service) as *const u8;
115 let config_ptr = std::ptr::addr_of!(service.config) as *const u8;
116
117 assert!(
118 !service_ptr.is_null(),
119 "Service should have valid memory address"
120 );
121 assert!(
122 !config_ptr.is_null(),
123 "Config should have valid memory address"
124 );
125 }
126
127 #[test]
128 fn test_app_role_service_with_different_configurations() {
129 let test_configs = vec![
130 Config::builder()
131 .app_id("role_basic")
132 .app_secret("basic_secret")
133 .build(),
134 Config::builder()
135 .app_id("role_timeout")
136 .app_secret("timeout_secret")
137 .req_timeout(std::time::Duration::from_millis(6000))
138 .build(),
139 Config::builder()
140 .app_id("role_custom")
141 .app_secret("custom_secret")
142 .base_url("https://custom.role.com")
143 .build(),
144 Config::builder()
145 .app_id("role_full")
146 .app_secret("full_secret")
147 .req_timeout(std::time::Duration::from_millis(12000))
148 .base_url("https://full.role.com")
149 .enable_token_cache(false)
150 .build(),
151 ];
152
153 for config in test_configs {
154 let service = AppRoleService::new(config.clone());
155
156 assert_eq!(service.config.app_id, config.app_id);
157 assert_eq!(service.config.app_secret, config.app_secret);
158 assert_eq!(service.config.base_url, config.base_url);
159 assert_eq!(service.config.req_timeout, config.req_timeout);
160 }
161 }
162
163 #[test]
164 fn test_app_role_service_multiple_instances() {
165 let config = create_test_config();
166 let service1 = AppRoleService::new(config.clone());
167 let service2 = AppRoleService::new(config.clone());
168
169 assert_eq!(service1.config.app_id, service2.config.app_id);
170 assert_eq!(service1.config.app_secret, service2.config.app_secret);
171
172 let ptr1 = std::ptr::addr_of!(service1) as *const u8;
173 let ptr2 = std::ptr::addr_of!(service2) as *const u8;
174 assert_ne!(ptr1, ptr2, "Services should be independent instances");
175 }
176
177 #[test]
178 fn test_app_role_service_config_cloning() {
179 let original_config = create_test_config();
180 let cloned_config = original_config.clone();
181
182 let service = AppRoleService::new(cloned_config);
183
184 assert_eq!(service.config.app_id, original_config.app_id);
185 assert_eq!(service.config.app_secret, original_config.app_secret);
186 }
187
188 #[test]
189 fn test_app_role_service_with_empty_config() {
190 let config = Config::default();
191 let service = AppRoleService::new(config);
192
193 assert_eq!(service.config.app_id, "");
194 assert_eq!(service.config.app_secret, "");
195 }
196
197 #[test]
198 fn test_app_role_service_with_unicode_config() {
199 let config = Config::builder()
200 .app_id("角色应用")
201 .app_secret("角色密钥")
202 .base_url("https://角色.com")
203 .build();
204 let service = AppRoleService::new(config);
205
206 assert_eq!(service.config.app_id, "角色应用");
207 assert_eq!(service.config.app_secret, "角色密钥");
208 assert_eq!(service.config.base_url, "https://角色.com");
209 }
210
211 #[test]
212 fn test_app_role_service_with_extreme_timeout() {
213 let config = Config::builder()
214 .app_id("role_extreme")
215 .app_secret("extreme_secret")
216 .req_timeout(std::time::Duration::from_secs(7200))
217 .build();
218 let service = AppRoleService::new(config);
219
220 assert_eq!(
221 service.config.req_timeout,
222 Some(std::time::Duration::from_secs(7200))
223 );
224 }
225
226 #[test]
227 fn test_app_role_service_concurrent_creation() {
228 let configs = vec![
229 Config::builder()
230 .app_id("role_concurrent_1")
231 .app_secret("secret_1")
232 .build(),
233 Config::builder()
234 .app_id("role_concurrent_2")
235 .app_secret("secret_2")
236 .build(),
237 Config::builder()
238 .app_id("role_concurrent_3")
239 .app_secret("secret_3")
240 .build(),
241 ];
242
243 let mut services = Vec::new();
244 for config in configs {
245 let service = AppRoleService::new(config);
246 services.push(service);
247 }
248
249 assert_eq!(services.len(), 3);
250
251 for (i, service1) in services.iter().enumerate() {
252 for service2 in services.iter().skip(i + 1) {
253 let ptr1 = std::ptr::addr_of!(*service1) as *const u8;
254 let ptr2 = std::ptr::addr_of!(*service2) as *const u8;
255 assert_ne!(ptr1, ptr2, "Services should be independent instances");
256 }
257 }
258 }
259
260 #[test]
261 fn test_app_role_service_construction_stability() {
262 for i in 0..100 {
263 let config = Config::builder()
264 .app_id(format!("role_app_{}", i))
265 .app_secret(format!("secret_{}", i))
266 .build();
267 let service = AppRoleService::new(config.clone());
268
269 assert_eq!(service.config.app_id, format!("role_app_{}", i));
270 assert_eq!(service.config.app_secret, format!("secret_{}", i));
271 }
272 }
273}