use crate::core::{config::Config, trait_system::Service};
pub mod v1;
pub struct AttendanceService {
pub v1: v1::V1,
}
impl AttendanceService {
pub fn new(config: Config) -> Self {
Self {
v1: v1::V1::new(config),
}
}
}
impl Service for AttendanceService {
fn config(&self) -> &Config {
&self.v1.shift.config
}
fn service_name() -> &'static str {
"attendance"
}
fn service_version() -> &'static str {
"v1"
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[test]
fn test_attendance_service_creation() {
let config = Config::default();
let service = AttendanceService::new(config.clone());
assert_eq!(service.v1.shift.config.app_id, config.app_id);
assert_eq!(service.v1.shift.config.app_secret, config.app_secret);
assert_eq!(service.v1.user_daily_shift.config.app_id, config.app_id);
assert_eq!(service.v1.group.config.app_id, config.app_id);
assert_eq!(service.v1.user_setting.config.app_id, config.app_id);
assert_eq!(
service.v1.user_stats_data.config.app_secret,
config.app_secret
);
assert_eq!(service.v1.user_approval.config.app_id, config.app_id);
assert_eq!(service.v1.user_task.config.app_id, config.app_id);
assert_eq!(
service.v1.user_task_remedy.config.app_secret,
config.app_secret
);
assert_eq!(service.v1.archive_rule.config.app_id, config.app_id);
assert_eq!(
service.v1.leave_employ_expire_record.config.app_id,
config.app_id
);
assert_eq!(
service.v1.leave_accrual_record.config.app_secret,
config.app_secret
);
}
#[test]
fn test_attendance_service_with_custom_config() {
let config = Config::builder()
.app_id("attendance_test_app")
.app_secret("attendance_test_secret")
.req_timeout(Duration::from_secs(350))
.build();
let service = AttendanceService::new(config.clone());
assert_eq!(service.v1.shift.config.app_id, "attendance_test_app");
assert_eq!(service.v1.shift.config.app_secret, "attendance_test_secret");
assert_eq!(
service.v1.shift.config.req_timeout,
Some(Duration::from_secs(350))
);
assert_eq!(
service.v1.user_daily_shift.config.app_id,
"attendance_test_app"
);
assert_eq!(
service.v1.group.config.req_timeout,
Some(Duration::from_secs(350))
);
assert_eq!(service.v1.user_setting.config.app_id, "attendance_test_app");
assert_eq!(
service.v1.user_stats_data.config.req_timeout,
Some(Duration::from_secs(350))
);
assert_eq!(
service.v1.user_approval.config.app_id,
"attendance_test_app"
);
assert_eq!(
service.v1.user_task.config.req_timeout,
Some(Duration::from_secs(350))
);
assert_eq!(
service.v1.user_task_remedy.config.app_id,
"attendance_test_app"
);
assert_eq!(
service.v1.archive_rule.config.req_timeout,
Some(Duration::from_secs(350))
);
assert_eq!(
service.v1.leave_employ_expire_record.config.app_id,
"attendance_test_app"
);
assert_eq!(
service.v1.leave_accrual_record.config.req_timeout,
Some(Duration::from_secs(350))
);
}
#[test]
fn test_attendance_service_config_independence() {
let config1 = Config::builder().app_id("attendance_app_1").build();
let config2 = Config::builder().app_id("attendance_app_2").build();
let service1 = AttendanceService::new(config1);
let service2 = AttendanceService::new(config2);
assert_eq!(service1.v1.shift.config.app_id, "attendance_app_1");
assert_eq!(service2.v1.shift.config.app_id, "attendance_app_2");
assert_ne!(
service1.v1.shift.config.app_id,
service2.v1.shift.config.app_id
);
assert_ne!(
service1.v1.user_daily_shift.config.app_id,
service2.v1.user_daily_shift.config.app_id
);
assert_ne!(
service1.v1.group.config.app_id,
service2.v1.group.config.app_id
);
assert_ne!(
service1.v1.user_setting.config.app_id,
service2.v1.user_setting.config.app_id
);
assert_ne!(
service1.v1.user_stats_data.config.app_id,
service2.v1.user_stats_data.config.app_id
);
assert_ne!(
service1.v1.user_approval.config.app_id,
service2.v1.user_approval.config.app_id
);
assert_ne!(
service1.v1.user_task.config.app_id,
service2.v1.user_task.config.app_id
);
assert_ne!(
service1.v1.user_task_remedy.config.app_id,
service2.v1.user_task_remedy.config.app_id
);
assert_ne!(
service1.v1.archive_rule.config.app_id,
service2.v1.archive_rule.config.app_id
);
assert_ne!(
service1.v1.leave_employ_expire_record.config.app_id,
service2.v1.leave_employ_expire_record.config.app_id
);
assert_ne!(
service1.v1.leave_accrual_record.config.app_id,
service2.v1.leave_accrual_record.config.app_id
);
}
#[test]
fn test_attendance_service_sub_services_accessible() {
let config = Config::default();
let service = AttendanceService::new(config.clone());
assert_eq!(service.v1.shift.config.app_id, config.app_id);
assert_eq!(service.v1.user_daily_shift.config.app_id, config.app_id);
assert_eq!(service.v1.group.config.app_id, config.app_id);
assert_eq!(service.v1.user_setting.config.app_id, config.app_id);
assert_eq!(service.v1.user_stats_data.config.app_id, config.app_id);
assert_eq!(service.v1.user_approval.config.app_id, config.app_id);
assert_eq!(service.v1.user_task.config.app_id, config.app_id);
assert_eq!(service.v1.user_task_remedy.config.app_id, config.app_id);
assert_eq!(service.v1.archive_rule.config.app_id, config.app_id);
assert_eq!(
service.v1.leave_employ_expire_record.config.app_id,
config.app_id
);
assert_eq!(service.v1.leave_accrual_record.config.app_id, config.app_id);
}
#[test]
fn test_attendance_service_config_cloning() {
let config = Config::builder()
.app_id("clone_test_app")
.app_secret("clone_test_secret")
.build();
let service = AttendanceService::new(config.clone());
assert_eq!(service.v1.shift.config.app_id, "clone_test_app");
assert_eq!(service.v1.shift.config.app_secret, "clone_test_secret");
assert_eq!(
service.v1.user_daily_shift.config.app_secret,
"clone_test_secret"
);
assert_eq!(service.v1.group.config.app_id, "clone_test_app");
assert_eq!(
service.v1.user_setting.config.app_secret,
"clone_test_secret"
);
assert_eq!(service.v1.user_stats_data.config.app_id, "clone_test_app");
assert_eq!(
service.v1.user_approval.config.app_secret,
"clone_test_secret"
);
assert_eq!(service.v1.user_task.config.app_id, "clone_test_app");
assert_eq!(
service.v1.user_task_remedy.config.app_secret,
"clone_test_secret"
);
assert_eq!(service.v1.archive_rule.config.app_id, "clone_test_app");
assert_eq!(
service.v1.leave_employ_expire_record.config.app_secret,
"clone_test_secret"
);
assert_eq!(
service.v1.leave_accrual_record.config.app_id,
"clone_test_app"
);
}
#[test]
fn test_attendance_service_timeout_propagation() {
let config = Config::builder()
.req_timeout(Duration::from_secs(360))
.build();
let service = AttendanceService::new(config);
assert_eq!(
service.v1.shift.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.user_daily_shift.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.group.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.user_setting.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.user_stats_data.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.user_approval.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.user_task.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.user_task_remedy.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.archive_rule.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.leave_employ_expire_record.config.req_timeout,
Some(Duration::from_secs(360))
);
assert_eq!(
service.v1.leave_accrual_record.config.req_timeout,
Some(Duration::from_secs(360))
);
}
#[test]
fn test_attendance_service_multiple_instances() {
let config = Config::default();
let service1 = AttendanceService::new(config.clone());
let service2 = AttendanceService::new(config.clone());
assert_eq!(
service1.v1.shift.config.app_id,
service2.v1.shift.config.app_id
);
assert_eq!(
service1.v1.shift.config.app_secret,
service2.v1.shift.config.app_secret
);
assert_eq!(
service1.v1.user_daily_shift.config.app_id,
service2.v1.user_daily_shift.config.app_id
);
assert_eq!(
service1.v1.group.config.app_secret,
service2.v1.group.config.app_secret
);
assert_eq!(
service1.v1.user_setting.config.app_id,
service2.v1.user_setting.config.app_id
);
assert_eq!(
service1.v1.user_stats_data.config.app_secret,
service2.v1.user_stats_data.config.app_secret
);
assert_eq!(
service1.v1.user_approval.config.app_id,
service2.v1.user_approval.config.app_id
);
assert_eq!(
service1.v1.user_task.config.app_secret,
service2.v1.user_task.config.app_secret
);
assert_eq!(
service1.v1.user_task_remedy.config.app_id,
service2.v1.user_task_remedy.config.app_id
);
assert_eq!(
service1.v1.archive_rule.config.app_secret,
service2.v1.archive_rule.config.app_secret
);
assert_eq!(
service1.v1.leave_employ_expire_record.config.app_id,
service2.v1.leave_employ_expire_record.config.app_id
);
assert_eq!(
service1.v1.leave_accrual_record.config.app_secret,
service2.v1.leave_accrual_record.config.app_secret
);
}
#[test]
fn test_attendance_service_config_consistency() {
let config = Config::builder()
.app_id("consistency_test")
.app_secret("consistency_secret")
.req_timeout(Duration::from_secs(370))
.build();
let service = AttendanceService::new(config);
let configs = [
&service.v1.shift.config,
&service.v1.user_daily_shift.config,
&service.v1.group.config,
&service.v1.user_setting.config,
&service.v1.user_stats_data.config,
&service.v1.user_approval.config,
&service.v1.user_task.config,
&service.v1.user_task_remedy.config,
&service.v1.archive_rule.config,
&service.v1.leave_employ_expire_record.config,
&service.v1.leave_accrual_record.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(370)));
}
}
}