pub mod models;
#[allow(clippy::module_inception)]
pub mod okr;
pub mod period;
pub mod period_rule;
pub mod progress_record;
pub mod review;
use crate::core::config::Config;
use okr::OkrContentService;
use period::PeriodService;
use period_rule::PeriodRuleService;
use progress_record::ProgressRecordService;
use review::ReviewService;
pub struct OkrService {
pub period: PeriodService,
pub period_rule: PeriodRuleService,
pub okr: OkrContentService,
pub progress_record: ProgressRecordService,
pub review: ReviewService,
}
impl OkrService {
pub fn new(config: Config) -> Self {
Self {
period: PeriodService::new(config.clone()),
period_rule: PeriodRuleService::new(config.clone()),
okr: OkrContentService::new(config.clone()),
progress_record: ProgressRecordService::new(config.clone()),
review: ReviewService::new(config),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[test]
fn test_okr_service_creation() {
let config = Config::default();
let service = OkrService::new(config.clone());
assert_eq!(service.period.config.app_id, config.app_id);
assert_eq!(service.period.config.app_secret, config.app_secret);
assert_eq!(service.period_rule.config.app_id, config.app_id);
assert_eq!(service.okr.config.app_id, config.app_id);
assert_eq!(service.progress_record.config.app_id, config.app_id);
assert_eq!(service.review.config.app_id, config.app_id);
}
#[test]
fn test_okr_service_with_custom_config() {
let config = Config::builder()
.app_id("okr_test_app")
.app_secret("okr_test_secret")
.req_timeout(Duration::from_secs(180))
.build();
let service = OkrService::new(config.clone());
assert_eq!(service.period.config.app_id, "okr_test_app");
assert_eq!(service.period.config.app_secret, "okr_test_secret");
assert_eq!(
service.period.config.req_timeout,
Some(Duration::from_secs(180))
);
assert_eq!(service.period_rule.config.app_id, "okr_test_app");
assert_eq!(
service.okr.config.req_timeout,
Some(Duration::from_secs(180))
);
assert_eq!(service.progress_record.config.app_secret, "okr_test_secret");
assert_eq!(
service.review.config.req_timeout,
Some(Duration::from_secs(180))
);
}
#[test]
fn test_okr_service_config_independence() {
let config1 = Config::builder().app_id("okr_app_1").build();
let config2 = Config::builder().app_id("okr_app_2").build();
let service1 = OkrService::new(config1);
let service2 = OkrService::new(config2);
assert_eq!(service1.period.config.app_id, "okr_app_1");
assert_eq!(service2.period.config.app_id, "okr_app_2");
assert_ne!(service1.period.config.app_id, service2.period.config.app_id);
assert_ne!(service1.okr.config.app_id, service2.review.config.app_id);
}
#[test]
fn test_okr_service_sub_services_accessible() {
let config = Config::default();
let service = OkrService::new(config.clone());
assert_eq!(service.period.config.app_id, config.app_id);
assert_eq!(service.period_rule.config.app_id, config.app_id);
assert_eq!(service.okr.config.app_id, config.app_id);
assert_eq!(service.progress_record.config.app_id, config.app_id);
assert_eq!(service.review.config.app_id, config.app_id);
}
#[test]
fn test_okr_service_config_cloning() {
let config = Config::builder()
.app_id("clone_test_app")
.app_secret("clone_test_secret")
.build();
let service = OkrService::new(config.clone());
assert_eq!(service.period.config.app_id, "clone_test_app");
assert_eq!(service.period.config.app_secret, "clone_test_secret");
assert_eq!(service.period_rule.config.app_secret, "clone_test_secret");
assert_eq!(service.okr.config.app_id, "clone_test_app");
assert_eq!(
service.progress_record.config.app_secret,
"clone_test_secret"
);
assert_eq!(service.review.config.app_id, "clone_test_app");
}
#[test]
fn test_okr_service_timeout_propagation() {
let config = Config::builder()
.req_timeout(Duration::from_secs(200))
.build();
let service = OkrService::new(config);
assert_eq!(
service.period.config.req_timeout,
Some(Duration::from_secs(200))
);
assert_eq!(
service.period_rule.config.req_timeout,
Some(Duration::from_secs(200))
);
assert_eq!(
service.okr.config.req_timeout,
Some(Duration::from_secs(200))
);
assert_eq!(
service.progress_record.config.req_timeout,
Some(Duration::from_secs(200))
);
assert_eq!(
service.review.config.req_timeout,
Some(Duration::from_secs(200))
);
}
#[test]
fn test_okr_service_multiple_instances() {
let config = Config::default();
let service1 = OkrService::new(config.clone());
let service2 = OkrService::new(config.clone());
assert_eq!(service1.period.config.app_id, service2.period.config.app_id);
assert_eq!(
service1.period.config.app_secret,
service2.period.config.app_secret
);
assert_eq!(
service1.period_rule.config.app_id,
service2.period_rule.config.app_id
);
assert_eq!(
service1.okr.config.app_secret,
service2.okr.config.app_secret
);
assert_eq!(
service1.progress_record.config.app_id,
service2.progress_record.config.app_id
);
assert_eq!(
service1.review.config.app_secret,
service2.review.config.app_secret
);
}
#[test]
fn test_okr_service_config_consistency() {
let config = Config::builder()
.app_id("consistency_test")
.app_secret("consistency_secret")
.req_timeout(Duration::from_secs(160))
.build();
let service = OkrService::new(config);
assert_eq!(service.period.config.app_id, "consistency_test");
assert_eq!(service.period.config.app_secret, "consistency_secret");
assert_eq!(
service.period.config.req_timeout,
Some(Duration::from_secs(160))
);
assert_eq!(service.period_rule.config.app_id, "consistency_test");
assert_eq!(service.okr.config.app_secret, "consistency_secret");
assert_eq!(
service.progress_record.config.req_timeout,
Some(Duration::from_secs(160))
);
assert_eq!(service.review.config.app_id, "consistency_test");
}
}