pub mod badge;
pub mod badge_grant;
pub mod data_report;
pub mod models;
pub mod password;
use crate::core::config::Config;
use badge::BadgeService;
use badge_grant::BadgeGrantService;
use data_report::DataReportService;
use password::PasswordService;
pub struct AdminService {
pub password: PasswordService,
pub data_report: DataReportService,
pub badge: BadgeService,
pub badge_grant: BadgeGrantService,
}
impl AdminService {
pub fn new(config: Config) -> Self {
Self {
password: PasswordService::new(config.clone()),
data_report: DataReportService::new(config.clone()),
badge: BadgeService::new(config.clone()),
badge_grant: BadgeGrantService::new(config),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[test]
fn test_admin_service_creation() {
let config = Config::default();
let service = AdminService::new(config.clone());
assert_eq!(service.password.config.app_id, config.app_id);
assert_eq!(service.data_report.config.app_id, config.app_id);
assert_eq!(service.badge.config.app_id, config.app_id);
assert_eq!(service.badge_grant.config.app_id, config.app_id);
}
#[test]
fn test_admin_service_with_custom_config() {
let config = Config::builder()
.app_id("admin_test_app")
.app_secret("admin_test_secret")
.req_timeout(Duration::from_secs(120))
.build();
let service = AdminService::new(config.clone());
assert_eq!(service.password.config.app_id, "admin_test_app");
assert_eq!(service.password.config.app_secret, "admin_test_secret");
assert_eq!(
service.password.config.req_timeout,
Some(Duration::from_secs(120))
);
assert_eq!(service.data_report.config.app_id, "admin_test_app");
assert_eq!(
service.data_report.config.req_timeout,
Some(Duration::from_secs(120))
);
assert_eq!(service.badge.config.app_id, "admin_test_app");
assert_eq!(service.badge_grant.config.app_id, "admin_test_app");
}
#[test]
fn test_admin_service_config_independence() {
let config1 = Config::builder().app_id("admin_app_1").build();
let config2 = Config::builder().app_id("admin_app_2").build();
let service1 = AdminService::new(config1);
let service2 = AdminService::new(config2);
assert_eq!(service1.password.config.app_id, "admin_app_1");
assert_eq!(service2.password.config.app_id, "admin_app_2");
assert_ne!(
service1.password.config.app_id,
service2.password.config.app_id
);
assert_eq!(service1.data_report.config.app_id, "admin_app_1");
assert_eq!(service2.data_report.config.app_id, "admin_app_2");
}
#[test]
fn test_admin_service_all_sub_services_accessible() {
let config = Config::default();
let service = AdminService::new(config.clone());
assert_eq!(service.password.config.app_id, config.app_id);
assert_eq!(service.data_report.config.app_id, config.app_id);
assert_eq!(service.badge.config.app_id, config.app_id);
assert_eq!(service.badge_grant.config.app_id, config.app_id);
}
#[test]
fn test_admin_service_config_cloning() {
let config = Config::builder()
.app_id("clone_test_app")
.app_secret("clone_test_secret")
.build();
let service = AdminService::new(config.clone());
let services_configs = [
&service.password.config,
&service.data_report.config,
&service.badge.config,
&service.badge_grant.config,
];
for service_config in &services_configs {
assert_eq!(service_config.app_id, "clone_test_app");
assert_eq!(service_config.app_secret, "clone_test_secret");
}
}
#[test]
fn test_admin_service_timeout_propagation() {
let config = Config::builder()
.req_timeout(Duration::from_secs(180))
.build();
let service = AdminService::new(config);
assert_eq!(
service.password.config.req_timeout,
Some(Duration::from_secs(180))
);
assert_eq!(
service.data_report.config.req_timeout,
Some(Duration::from_secs(180))
);
assert_eq!(
service.badge.config.req_timeout,
Some(Duration::from_secs(180))
);
assert_eq!(
service.badge_grant.config.req_timeout,
Some(Duration::from_secs(180))
);
}
#[test]
fn test_admin_service_multiple_instances() {
let config = Config::default();
let service1 = AdminService::new(config.clone());
let service2 = AdminService::new(config.clone());
assert_eq!(
service1.password.config.app_id,
service2.password.config.app_id
);
assert_eq!(
service1.data_report.config.app_id,
service2.data_report.config.app_id
);
assert_eq!(service1.badge.config.app_id, service2.badge.config.app_id);
assert_eq!(
service1.badge_grant.config.app_id,
service2.badge_grant.config.app_id
);
}
#[test]
fn test_admin_service_config_consistency() {
let config = Config::builder()
.app_id("consistency_test")
.app_secret("consistency_secret")
.req_timeout(Duration::from_secs(200))
.build();
let service = AdminService::new(config);
let configs = [
&service.password.config,
&service.data_report.config,
&service.badge.config,
&service.badge_grant.config,
];
for config in &configs {
assert_eq!(config.app_id, "consistency_test");
assert_eq!(config.app_secret, "consistency_secret");
assert_eq!(config.req_timeout, Some(Duration::from_secs(200)));
}
for i in 1..configs.len() {
assert_eq!(configs[0].app_id, configs[i].app_id);
assert_eq!(configs[0].app_secret, configs[i].app_secret);
assert_eq!(configs[0].req_timeout, configs[i].req_timeout);
}
}
}