moadim 1.7.6

Loop engine for AI agents — routines over REST, MCP, and a built-in web UI
#![allow(
    clippy::missing_docs_in_private_items,
    reason = "test helpers and fixtures do not need doc comments"
)]

use crate::routine_storage::routine_storage_migrations::seed_schedule_cron_from_legacy_toml;

#[test]
fn seed_schedule_cron_from_legacy_toml_writes_missing_sidecar() {
    let base =
        std::env::temp_dir().join(format!("moadim-rs-seed-schedule-{}", uuid::Uuid::new_v4()));
    std::fs::create_dir_all(&base).unwrap();
    std::fs::write(
        base.join("routine.toml"),
        r#"title = "Legacy"
agent = "claude"
schedule = "@weekly"
"#,
    )
    .unwrap();

    seed_schedule_cron_from_legacy_toml(&base);

    assert_eq!(
        std::fs::read_to_string(base.join("schedule.cron")).unwrap(),
        "@weekly\n"
    );
    let _ = std::fs::remove_dir_all(base);
}

#[test]
fn seed_schedule_cron_from_legacy_toml_preserves_existing_sidecar() {
    let base = std::env::temp_dir().join(format!(
        "moadim-rs-seed-schedule-existing-{}",
        uuid::Uuid::new_v4()
    ));
    std::fs::create_dir_all(&base).unwrap();
    std::fs::write(base.join("schedule.cron"), "@hourly\n").unwrap();
    std::fs::write(
        base.join("routine.toml"),
        r#"title = "Legacy"
agent = "claude"
schedule = "@weekly"
"#,
    )
    .unwrap();

    seed_schedule_cron_from_legacy_toml(&base);

    assert_eq!(
        std::fs::read_to_string(base.join("schedule.cron")).unwrap(),
        "@hourly\n"
    );
    let _ = std::fs::remove_dir_all(base);
}

#[test]
fn seed_schedule_cron_from_legacy_toml_ignores_missing_legacy_schedule() {
    let base = std::env::temp_dir().join(format!(
        "moadim-rs-seed-schedule-missing-{}",
        uuid::Uuid::new_v4()
    ));
    std::fs::create_dir_all(&base).unwrap();
    std::fs::write(
        base.join("routine.toml"),
        r#"title = "Legacy"
agent = "claude"
"#,
    )
    .unwrap();

    seed_schedule_cron_from_legacy_toml(&base);

    assert!(!base.join("schedule.cron").exists());
    let _ = std::fs::remove_dir_all(base);
}

#[test]
#[cfg(unix)]
fn seed_schedule_cron_from_legacy_toml_logs_write_failure() {
    use std::os::unix::fs::PermissionsExt;

    let base = std::env::temp_dir().join(format!(
        "moadim-rs-seed-schedule-write-fail-{}",
        uuid::Uuid::new_v4()
    ));
    std::fs::create_dir_all(&base).unwrap();
    std::fs::write(
        base.join("routine.toml"),
        r#"title = "Legacy"
agent = "claude"
schedule = "@weekly"
"#,
    )
    .unwrap();
    let original_perms = std::fs::metadata(&base).unwrap().permissions();
    std::fs::set_permissions(&base, std::fs::Permissions::from_mode(0o555)).unwrap();

    seed_schedule_cron_from_legacy_toml(&base);

    std::fs::set_permissions(&base, original_perms).unwrap();
    assert!(!base.join("schedule.cron").exists());
    let _ = std::fs::remove_dir_all(base);
}