- Add metrics table to sidebar after schedule generation - Add scheduler status indicator to sidebar - Refactor report() to consume `ResidentMetrics` - Delete unused preview component - Beautify css across wizard steps
145 lines
4.7 KiB
Rust
145 lines
4.7 KiB
Rust
mod common;
|
|
|
|
#[cfg(test)]
|
|
mod integration_tests {
|
|
use crate::common::validate_all_constraints;
|
|
use rota_lib::{
|
|
config::UserConfig,
|
|
fixtures::{
|
|
complex_config, hard_config, manual_shifts_heavy_config, maximal_config, minimal_config,
|
|
},
|
|
schedule::MonthlySchedule,
|
|
scheduler::Scheduler,
|
|
workload::WorkloadTracker,
|
|
};
|
|
use rstest::rstest;
|
|
|
|
#[ctor::ctor]
|
|
fn global_setup() {
|
|
env_logger::builder()
|
|
.filter_level(log::LevelFilter::Info)
|
|
.init();
|
|
}
|
|
|
|
#[rstest]
|
|
fn test_minimal_config(
|
|
#[values(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)] month_idx: u8,
|
|
mut minimal_config: UserConfig,
|
|
) -> anyhow::Result<()> {
|
|
minimal_config.update_month(month_idx);
|
|
let scheduler = Scheduler::new_with_config(minimal_config.clone());
|
|
let mut schedule = MonthlySchedule::new();
|
|
let mut tracker = WorkloadTracker::default();
|
|
|
|
let solved = scheduler.run(&mut schedule, &mut tracker)?;
|
|
println!(
|
|
"{}",
|
|
schedule.report(&schedule.metrics(&minimal_config, &tracker))
|
|
);
|
|
assert!(solved);
|
|
validate_all_constraints(&schedule, &tracker, &minimal_config);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[rstest]
|
|
fn test_maximal_config(
|
|
#[values(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)] month_idx: u8,
|
|
mut maximal_config: UserConfig,
|
|
) -> anyhow::Result<()> {
|
|
maximal_config.update_month(month_idx);
|
|
let scheduler = Scheduler::new_with_config(maximal_config.clone());
|
|
let mut schedule = MonthlySchedule::new();
|
|
let mut tracker = WorkloadTracker::default();
|
|
|
|
let solved = scheduler.run(&mut schedule, &mut tracker)?;
|
|
println!(
|
|
"{}",
|
|
schedule.report(&schedule.metrics(&maximal_config, &tracker))
|
|
);
|
|
assert!(solved);
|
|
validate_all_constraints(&schedule, &tracker, &maximal_config);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[rstest]
|
|
fn test_manual_shifts_heavy_config(
|
|
#[values(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)] month_idx: u8,
|
|
mut manual_shifts_heavy_config: UserConfig,
|
|
) -> anyhow::Result<()> {
|
|
manual_shifts_heavy_config.update_month(month_idx);
|
|
let scheduler = Scheduler::new_with_config(manual_shifts_heavy_config.clone());
|
|
let mut schedule = MonthlySchedule::new();
|
|
let mut tracker = WorkloadTracker::default();
|
|
|
|
let solved = scheduler.run(&mut schedule, &mut tracker)?;
|
|
println!(
|
|
"{}",
|
|
schedule.report(&schedule.metrics(&manual_shifts_heavy_config, &tracker))
|
|
);
|
|
assert!(solved);
|
|
validate_all_constraints(&schedule, &tracker, &manual_shifts_heavy_config);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[rstest]
|
|
fn test_complex_config(
|
|
#[values(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)] month_idx: u8,
|
|
mut complex_config: UserConfig,
|
|
) -> anyhow::Result<()> {
|
|
complex_config.update_month(month_idx);
|
|
let scheduler = Scheduler::new_with_config(complex_config.clone());
|
|
let mut schedule = MonthlySchedule::new();
|
|
let mut tracker = WorkloadTracker::default();
|
|
|
|
let solved = scheduler.run(&mut schedule, &mut tracker)?;
|
|
println!(
|
|
"{}",
|
|
schedule.report(&schedule.metrics(&complex_config, &tracker))
|
|
);
|
|
assert!(solved);
|
|
validate_all_constraints(&schedule, &tracker, &complex_config);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[rstest]
|
|
fn test_hard_config(
|
|
#[values(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)] month_idx: u8,
|
|
mut hard_config: UserConfig,
|
|
) -> anyhow::Result<()> {
|
|
hard_config.update_month(month_idx);
|
|
let scheduler = Scheduler::new_with_config(hard_config.clone());
|
|
let mut schedule = MonthlySchedule::new();
|
|
let mut tracker = WorkloadTracker::default();
|
|
|
|
let solved = scheduler.run(&mut schedule, &mut tracker)?;
|
|
println!(
|
|
"{}",
|
|
schedule.report(&schedule.metrics(&hard_config, &tracker))
|
|
);
|
|
assert!(solved);
|
|
validate_all_constraints(&schedule, &tracker, &hard_config);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[rstest]
|
|
fn test_export_pipeline(minimal_config: UserConfig) -> anyhow::Result<()> {
|
|
let scheduler = Scheduler::new_with_config(minimal_config.clone());
|
|
let mut schedule = MonthlySchedule::new();
|
|
let mut tracker = WorkloadTracker::default();
|
|
assert!(scheduler.run(&mut schedule, &mut tracker)?);
|
|
|
|
schedule.export_as_docx(&minimal_config)?;
|
|
|
|
let metadata = std::fs::metadata("rota.docx")?;
|
|
assert!(metadata.len() > 0);
|
|
std::fs::remove_file("rota.docx")?;
|
|
|
|
Ok(())
|
|
}
|
|
}
|