use super::*;
#[test]
#[serial]
fn run_loop_aborts_immediately_on_queue_lock_error() -> Result<()> {
let fixture = support::setup_run_loop_fixture(vec![])?;
let _lock = queue::acquire_queue_lock(&fixture.repo_root, "test lock holder", false)?;
let (result, elapsed) = support::run_loop_once(&fixture.resolved);
let err = result.expect_err("expected run_loop to fail with lock error");
let err_msg = format!("{:#}", err);
anyhow::ensure!(
err_msg.contains("Queue lock already held"),
"expected 'Queue lock already held' in error: {err_msg}"
);
anyhow::ensure!(
!err_msg.contains("50 consecutive failures"),
"run loop hit 50-failure abort instead of returning immediately: {err_msg}"
);
anyhow::ensure!(
elapsed < Duration::from_secs(1),
"run loop took too long ({elapsed:?}), should have failed immediately"
);
Ok(())
}
#[test]
#[serial]
fn run_loop_aborts_immediately_on_queue_validation_error() -> Result<()> {
let fixture = support::setup_run_loop_fixture(vec!["RQ-9999".to_string()])?;
let (result, elapsed) = support::run_loop_once(&fixture.resolved);
let err = result.expect_err("expected run_loop to fail with validation error");
let err_msg = format!("{:#}", err);
anyhow::ensure!(
err_msg.contains("relationship"),
"expected 'relationship' in error: {err_msg}"
);
anyhow::ensure!(
err_msg.contains("non-existent") || err_msg.contains("RQ-9999"),
"expected 'non-existent' or task ID in error: {err_msg}"
);
anyhow::ensure!(
!err_msg.contains("50 consecutive failures"),
"run loop hit 50-failure abort instead of returning immediately: {err_msg}"
);
anyhow::ensure!(
elapsed < Duration::from_secs(1),
"run loop took too long ({elapsed:?}), should have failed immediately"
);
Ok(())
}