use crate::{
cargo_affected, combined_output, git, git_head, init_git_with_initial_commit,
write_two_module_project,
};
#[test]
fn run_executes_full_suite_when_no_coverage_data() {
let tmp = tempfile::tempdir().unwrap();
let dir = tmp.path();
write_two_module_project(dir, "sample_cache_miss_no_coverage");
init_git_with_initial_commit(dir);
let run = cargo_affected(dir, &["affected", "run"]);
assert!(
run.status.success(),
"run with no coverage should succeed by running all: stderr=\n{}\nstdout=\n{}",
String::from_utf8_lossy(&run.stderr),
String::from_utf8_lossy(&run.stdout),
);
let combined = combined_output(&run);
assert!(
combined.contains("no coverage data yet") && combined.contains("running all tests"),
"expected cache-miss notice, got:\n{combined}"
);
for t in ["test_add", "test_multiply", "test_greet"] {
assert!(
combined.contains("PASS") && combined.contains(t),
"expected nextest to PASS {t}, got:\n{combined}"
);
}
}
#[test]
fn run_uses_selection_when_collect_sha_is_sibling() {
let tmp = tempfile::tempdir().unwrap();
let dir = tmp.path();
write_two_module_project(dir, "sample_cache_miss_sibling");
init_git_with_initial_commit(dir);
let init_sha = git_head(dir);
std::fs::write(dir.join("src/extra.rs"), "pub fn extra() -> i32 { 1 }\n").unwrap();
let lib_path = dir.join("src/lib.rs");
let lib = std::fs::read_to_string(&lib_path).unwrap();
std::fs::write(&lib_path, format!("{lib}pub mod extra;\n")).unwrap();
git(dir, &["add", "."]);
git(dir, &["commit", "-q", "-m", "add extra module"]);
let collect_commit = git_head(dir);
assert_ne!(init_sha, collect_commit);
let collect = cargo_affected(dir, &["affected", "collect"]);
assert!(
collect.status.success(),
"collect failed: {}",
String::from_utf8_lossy(&collect.stderr)
);
git(dir, &["reset", "--hard", "-q", &init_sha]);
let run = cargo_affected(dir, &["affected", "run"]);
assert!(
run.status.success(),
"run on sibling collect_sha should succeed: stderr=\n{}\nstdout=\n{}",
String::from_utf8_lossy(&run.stderr),
String::from_utf8_lossy(&run.stdout),
);
let combined = combined_output(&run);
assert!(
!combined.contains("running all tests"),
"sibling collect_sha must not trigger full-suite widening, got:\n{combined}"
);
assert!(
!combined.contains("not reachable from HEAD")
&& !combined.contains("not in the repo"),
"sibling collect_sha is reachable; should not emit the missing-sha notice, got:\n{combined}"
);
assert!(
combined.contains("tests to run") && combined.contains("affected"),
"expected the selection summary (tests to run / affected), got:\n{combined}"
);
}