use u2secure::application::steps::{
AllSteps, AutoUpdatesStep, Fail2banStep, SshPasswordAuthStep, SshRootLoginStep,
SystemUpdateStep, UfwStep,
};
use u2secure::domain::audit::{AuditReport, AuditStatus, PackageManager};
use u2secure::domain::steps::{HardeningStep, StepKind};
use u2secure::infrastructure::system;
#[test]
fn test_all_steps_contains_all_kinds() {
let all = AllSteps::new();
let kinds: Vec<StepKind> = all.steps().iter().map(|s| s.kind()).collect();
assert_eq!(kinds.len(), 12);
assert!(kinds.contains(&StepKind::SystemUpdate));
assert!(kinds.contains(&StepKind::Ufw));
assert!(kinds.contains(&StepKind::RestartSsh));
}
fn make_report(
ssh_port: u16,
password_disabled: bool,
root_disabled: bool,
sudo_users: Vec<String>,
fail2ban: bool,
ufw: bool,
auto_updates: bool,
sys_up_to_date: bool,
) -> AuditReport {
AuditReport {
items: vec![],
is_root: true,
package_manager: PackageManager::Apt,
ssh_port,
password_auth_disabled: password_disabled,
root_login_disabled: root_disabled,
sudo_users,
fail2ban_installed: fail2ban,
ufw_enabled: ufw,
auto_updates_enabled: auto_updates,
system_up_to_date: sys_up_to_date,
}
}
#[test]
fn test_system_update_step_status() {
let step = SystemUpdateStep;
let report = make_report(22, false, false, vec![], false, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Safe);
let report = make_report(22, false, false, vec![], false, false, false, false);
assert_eq!(step.check_status(&report), AuditStatus::NeedsUpdate);
}
#[test]
fn test_root_login_step_status() {
let step = SshRootLoginStep;
let report = make_report(22, false, true, vec!["admin".into()], false, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Safe);
let report = make_report(22, false, false, vec!["admin".into()], false, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Missing);
}
#[test]
fn test_password_auth_step_status() {
let step = SshPasswordAuthStep;
let report = make_report(22, true, false, vec!["admin".into()], false, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Safe);
let report = make_report(22, false, false, vec!["admin".into()], false, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Missing);
}
#[test]
fn test_ufw_step_status() {
let step = UfwStep;
let report = make_report(22, false, false, vec![], false, true, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Safe);
let report = make_report(22, false, false, vec![], false, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Missing);
}
#[test]
fn test_fail2ban_step_status() {
let step = Fail2banStep;
let report = make_report(22, false, false, vec![], true, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Safe);
let report = make_report(22, false, false, vec![], false, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Missing);
}
#[test]
fn test_auto_updates_step_status() {
let step = AutoUpdatesStep;
let report = make_report(22, false, false, vec![], false, false, true, true);
assert_eq!(step.check_status(&report), AuditStatus::Safe);
let report = make_report(22, false, false, vec![], false, false, false, true);
assert_eq!(step.check_status(&report), AuditStatus::Missing);
}
#[test]
fn test_ssh_key_setup_step_own_implementation() {
let step = u2secure::application::steps::SshKeySetupStep;
assert_eq!(step.kind(), StepKind::SshKeySetup);
}
#[test]
fn test_detect_package_manager() {
let pm = system::detect_package_manager();
let _name = pm.name();
}
#[test]
fn test_detect_is_root_can_run() {
let _is_root = system::detect_is_root();
}
#[test]
fn test_which_existing_command() {
assert!(system::which("sh"));
assert!(system::which("echo"));
}
#[test]
fn test_which_non_existing_command() {
assert!(!system::which("nonexistent_cmd_xyz123"));
}
#[test]
fn test_password_auth_precondition() {
let step = SshPasswordAuthStep;
assert_eq!(step.kind(), StepKind::SshPasswordAuth);
}