use super::*;
#[test]
fn task_update_without_id_updates_all_tasks() -> Result<()> {
let dir = temp_dir_outside_repo();
let (status, stdout, stderr) =
run_in_dir(dir.path(), &["init", "--force", "--non-interactive"]);
anyhow::ensure!(
status.success(),
"ralph init failed\nstdout:\n{stdout}\nstderr:\n{stderr}"
);
write_queue_with_two_tasks(dir.path())?;
let script = "#!/bin/sh\ncat >/dev/null\necho run >> .ralph/runner_calls.txt\nexit 0\n";
let runner_path = create_fake_runner(dir.path(), "codex", script)?;
configure_runner(dir.path(), "codex", "gpt-5.3-codex", Some(&runner_path))?;
let (status, stdout, stderr) = run_in_dir(dir.path(), &["task", "update"]);
anyhow::ensure!(
status.success(),
"expected task update to succeed\nstdout:\n{stdout}\nstderr:\n{stderr}"
);
let calls_path = dir.path().join(".ralph/runner_calls.txt");
let calls = std::fs::read_to_string(&calls_path).context("read runner calls")?;
let call_count = calls.lines().count();
anyhow::ensure!(
call_count == 2,
"expected runner to be invoked for each task, got {call_count}"
);
Ok(())
}
#[test]
fn task_update_without_id_fails_on_empty_queue() -> Result<()> {
let dir = temp_dir_outside_repo();
let (status, stdout, stderr) =
run_in_dir(dir.path(), &["init", "--force", "--non-interactive"]);
anyhow::ensure!(
status.success(),
"ralph init failed\nstdout:\n{stdout}\nstderr:\n{stderr}"
);
write_empty_queue(dir.path())?;
let (status, _stdout, stderr) = run_in_dir(dir.path(), &["task", "update"]);
anyhow::ensure!(!status.success(), "expected task update to fail");
anyhow::ensure!(
stderr.contains("No tasks in queue to update"),
"expected empty-queue error, got:\n{stderr}"
);
Ok(())
}