use std::path::{Path, PathBuf};
fn tests_dir() -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR")).join("tests")
}
fn workflow() -> String {
let path = Path::new(env!("CARGO_MANIFEST_DIR"))
.join("..")
.join(".github/workflows/ci.yml");
std::fs::read_to_string(&path).expect("read .github/workflows/ci.yml")
}
fn ignored_test_binaries() -> Vec<String> {
let mut out = Vec::new();
for entry in std::fs::read_dir(tests_dir()).expect("read tests/") {
let path = entry.expect("dir entry").path();
if path.extension().is_none_or(|e| e != "rs") {
continue;
}
let body = std::fs::read_to_string(&path).expect("read test file");
let has_ignored = body
.lines()
.any(|line| line.trim_start().starts_with("#[ignore"));
if has_ignored {
out.push(
path.file_stem()
.expect("file stem")
.to_string_lossy()
.into_owned(),
);
}
}
out.sort();
out
}
#[test]
fn every_ignored_test_binary_is_named_in_ci() {
let ci = workflow();
let mut missing = Vec::new();
for name in ignored_test_binaries() {
if !ci.contains(&format!("--test {name}")) {
missing.push(name);
}
}
assert!(
missing.is_empty(),
"these autumn-admin-plugin test binaries hold `#[ignore]`d tests but no \
`--test <name>` line in .github/workflows/ci.yml, so CI never runs them \
(this crate gets no bare `--ignored` sweep — see CLAUDE.md):\n {}",
missing.join("\n ")
);
}
#[test]
fn every_ci_named_admin_plugin_test_binary_exists() {
let ci = workflow();
let mut missing = Vec::new();
for line in ci.lines() {
if !line.contains("-p autumn-admin-plugin") {
continue;
}
let Some((_, tail)) = line.split_once("--test ") else {
continue;
};
let name = tail.split_whitespace().next().unwrap_or_default();
if name.is_empty() {
continue;
}
if !tests_dir().join(format!("{name}.rs")).exists() {
missing.push(name.to_owned());
}
}
missing.sort();
missing.dedup();
assert!(
missing.is_empty(),
".github/workflows/ci.yml names these autumn-admin-plugin test binaries, \
but tests/<name>.rs does not exist:\n {}",
missing.join("\n ")
);
}