use super::*;
#[test]
fn test_delete_work_safeguard_active() -> TestResult {
let (temp_dir, date) = init_project_with_date()?;
let wi1 = first_work_id(&date);
let commands: Vec<Vec<String>> = vec![
work_new_active("Active work item"),
work_add_acceptance(&wi1, "chore: Test criterion"),
work_delete_force(&wi1),
];
let output = run_dynamic_commands(temp_dir.path(), &commands)?;
assert_delete_snapshot!(normalize_output(&output, temp_dir.path(), &date)?);
Ok(())
}
#[test]
fn test_delete_work_safeguard_done() -> TestResult {
let (temp_dir, date) = init_project_with_date()?;
let wi1 = first_work_id(&date);
let commands: Vec<Vec<String>> = vec![
work_new_active("Completed work item"),
work_add_acceptance(&wi1, "chore: Test criterion"),
work_tick_acceptance_done(&wi1, 0),
work_move_done(&wi1),
work_delete_force(&wi1),
];
let output = run_dynamic_commands(temp_dir.path(), &commands)?;
assert_delete_snapshot!(normalize_output(&output, temp_dir.path(), &date)?);
Ok(())
}
#[test]
fn test_delete_work_success_queue() -> TestResult {
let (temp_dir, date) = init_project_with_date()?;
let wi1 = first_work_id(&date);
let commands: Vec<Vec<String>> = vec![
work_new("Keep this work item"),
work_new("Delete this work item"),
command(&["work", "list"]),
work_delete_force(&wi1),
command(&["work", "list"]),
command(&["check"]),
];
let output = run_dynamic_commands(temp_dir.path(), &commands)?;
assert_delete_snapshot!(normalize_output(&output, temp_dir.path(), &date)?);
Ok(())
}
#[test]
fn test_delete_work_safeguard_referenced() -> TestResult {
let (temp_dir, date) = init_project_with_date()?;
let wi1 = first_work_id(&date);
let wi2 = work_id(&date, 2);
let setup_commands: Vec<Vec<String>> = vec![
work_new("Referenced work item"),
work_new("Work item with reference"),
work_add_field(&wi2, "refs", &wi1),
];
let _ = run_dynamic_commands(temp_dir.path(), &setup_commands)?;
let delete_commands: Vec<Vec<String>> = vec![work_delete_force(&wi1)];
let output = run_dynamic_commands(temp_dir.path(), &delete_commands)?;
assert_delete_snapshot!(normalize_output(&output, temp_dir.path(), &date)?);
Ok(())
}
#[test]
fn test_delete_work_safeguard_depended_on() -> TestResult {
let (temp_dir, date) = init_project_with_date()?;
let wi1 = first_work_id(&date);
let wi2 = work_id(&date, 2);
let setup_commands: Vec<Vec<String>> = vec![
work_new("Dependency work item"),
work_new("Dependent work item"),
work_add_dependency(&wi2, &wi1),
];
let _ = run_dynamic_commands(temp_dir.path(), &setup_commands)?;
let output = run_dynamic_commands(temp_dir.path(), &[work_delete_force(&wi1)])?;
assert!(output.contains("exit: 1"), "output: {}", output);
assert!(
output.contains("Cannot delete work item"),
"output: {}",
output
);
assert!(output.contains(&wi2), "output: {}", output);
Ok(())
}
#[test]
fn test_delete_work_aborts_when_governed_referrers_fail_to_load() -> TestResult {
let (temp_dir, date) = init_project_with_date()?;
let work_id = first_work_id(&date);
run_dynamic_commands(temp_dir.path(), &[work_new("Keep on load failure")])?;
let work_path = fs::read_dir(temp_dir.path().join("gov/work"))?
.next()
.ok_or("missing work item")??
.path();
let rfc_dir = temp_dir.path().join("gov/rfc/RFC-0001");
fs::create_dir_all(rfc_dir.join("clauses"))?;
fs::write(rfc_dir.join("rfc.toml"), "not valid TOML")?;
let output = run_dynamic_commands(temp_dir.path(), &[work_delete_force(&work_id)])?;
assert!(output.contains("exit: 1"), "{output}");
assert!(work_path.exists(), "load failure must abort deletion");
Ok(())
}