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

1pub 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
13/// 自定义角色服务
14pub struct AppRoleService {
15    config: Config,
16}
17
18impl AppRoleService {
19    pub fn new(config: Config) -> Self {
20        Self { config }
21    }
22
23    /// 更新自定义角色
24    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    /// 列出自定义角色
33    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    /// 删除自定义角色
42    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}