malvin 0.2.5

Non-interactive research and coding agent
use crate::MALVIN_CONFIG_REL;
use crate::artifacts::{
    MalvinConfigWorkspaceBackup, backup_workspace_malvin_config_workspace_if_present,
    restore_workspace_malvin_config_workspace_backup,
};
use crate::test_utils::with_isolated_home;

#[test]
fn malvin_config_workspace_backup_skips_when_file_missing() {
    with_isolated_home(|work| {
        assert_eq!(
            backup_workspace_malvin_config_workspace_if_present(work).unwrap(),
            MalvinConfigWorkspaceBackup::Missing
        );
    });
}

#[test]
fn malvin_config_workspace_backup_round_trip_restores_workspace_file() {
    with_isolated_home(|work| {
        std::fs::create_dir_all(work.join(".malvin")).unwrap();
        let cfg = work.join(MALVIN_CONFIG_REL);
        std::fs::write(&cfg, "ORIGINAL\n").unwrap();
        let backup = backup_workspace_malvin_config_workspace_if_present(work).unwrap();
        std::fs::write(&cfg, "MODIFIED\n").unwrap();
        restore_workspace_malvin_config_workspace_backup(work, &backup).unwrap();
        assert_eq!(std::fs::read_to_string(&cfg).unwrap(), "ORIGINAL\n");
    });
}

#[test]
fn malvin_config_workspace_backup_missing_removes_agent_created_file() {
    with_isolated_home(|work| {
        std::fs::create_dir_all(work.join(".malvin")).unwrap();
        let backup = backup_workspace_malvin_config_workspace_if_present(work).unwrap();
        let cfg = work.join(MALVIN_CONFIG_REL);
        std::fs::write(&cfg, "CREATED\n").unwrap();
        restore_workspace_malvin_config_workspace_backup(work, &backup).unwrap();
        assert!(!cfg.exists());
    });
}