use super::fixtures::*;
use crate::prompt::Error;
pub(super) const WORKTREE_ADD_INDEX: usize = 6;
const REV_PARSE_INDEX: usize = 13;
const TRANSCRIPT_ADD_INDEX: usize = REV_PARSE_INDEX + 1;
const TRANSCRIPT_COMMIT_INDEX: usize = TRANSCRIPT_ADD_INDEX + 1;
const TERMINAL_REV_PARSE_INDEX: usize = TRANSCRIPT_COMMIT_INDEX + 1;
#[test]
fn run_surfaces_worktree_create_failure() {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
let wt = worktree_path(repo.path());
std::fs::create_dir_all(wt.parent().unwrap()).unwrap();
std::fs::write(&wt, b"blocker").unwrap();
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(repo.path(), "hi", &adapter, &StubGit::ok()).unwrap_err();
assert!(matches!(err, Error::Io(_)), "got {err:?}");
}
#[test]
fn run_surfaces_goal_write_failure() {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
let wt = worktree_path(repo.path());
std::fs::create_dir_all(wt.join("goal.md")).unwrap();
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(repo.path(), "hi", &adapter, &StubGit::ok()).unwrap_err();
assert!(matches!(err, Error::Io(_)), "got {err:?}");
}
#[test]
fn run_surfaces_soul_write_failure() {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
let wt = worktree_path(repo.path());
std::fs::create_dir_all(wt.join("soul.md")).unwrap();
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(repo.path(), "hi", &adapter, &StubGit::ok()).unwrap_err();
assert!(matches!(err, Error::Io(_)), "got {err:?}");
}
#[test]
fn run_surfaces_rev_parse_failure() {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(
repo.path(),
"hi",
&adapter,
&StubGit::failing_at(REV_PARSE_INDEX),
)
.unwrap_err();
assert!(
matches!(
err,
Error::Git {
op: "rev-parse",
..
}
),
"got {err:?}"
);
}
#[test]
fn run_surfaces_step_dir_create_failure() {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
std::fs::write(repo.path().join("steps"), b"blocker").unwrap();
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(repo.path(), "hi", &adapter, &StubGit::ok()).unwrap_err();
assert!(matches!(err, Error::Io(_)), "got {err:?}");
}
#[test]
fn run_surfaces_request_write_failure() {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
let step_dir = repo.path().join("steps/ct-1-deadbeef/001");
std::fs::create_dir_all(step_dir.join("request.json")).unwrap();
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(repo.path(), "hi", &adapter, &StubGit::ok()).unwrap_err();
assert!(matches!(err, Error::Io(_)), "got {err:?}");
}
#[test]
fn run_surfaces_response_write_failure() {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
let step_dir = repo.path().join("steps/ct-1-deadbeef/001");
std::fs::create_dir_all(step_dir.join("response.json")).unwrap();
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(repo.path(), "hi", &adapter, &StubGit::ok()).unwrap_err();
assert!(matches!(err, Error::Io(_)), "got {err:?}");
}
#[test]
fn run_surfaces_meta_write_failure() {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
let step_dir = repo.path().join("steps/ct-1-deadbeef/001");
std::fs::create_dir_all(step_dir.join("meta.json")).unwrap();
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(repo.path(), "hi", &adapter, &StubGit::ok()).unwrap_err();
assert!(matches!(err, Error::Io(_)), "got {err:?}");
}
fn assert_run_fails_with_git_op(idx: usize, expected_op: &'static str) {
let repo = scaffold_repo(VALID_PER_REPO_PROVIDERS_YAML, Some("body"));
let adapter = StubAdapter::happy(&happy_response_bytes());
let err = run_with_stubs(repo.path(), "hi", &adapter, &StubGit::failing_at(idx)).unwrap_err();
match err {
Error::Git { op, .. } => assert_eq!(op, expected_op),
other => panic!("expected Error::Git op={expected_op}, got {other:?}"),
}
}
macro_rules! git_op_failure_test {
($name:ident, $idx:expr, $op:literal) => {
#[test]
fn $name() {
assert_run_fails_with_git_op($idx, $op);
}
};
}
git_op_failure_test!(
run_surfaces_transcript_add_failure,
TRANSCRIPT_ADD_INDEX,
"transcript add"
);
git_op_failure_test!(
run_surfaces_transcript_commit_failure,
TRANSCRIPT_COMMIT_INDEX,
"transcript commit"
);
git_op_failure_test!(
run_surfaces_terminal_deposit_rev_parse_failure,
TERMINAL_REV_PARSE_INDEX,
"rev-parse"
);