use std::path::{Path, PathBuf};
use assert_cmd::Command;
fn repo_root() -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR"))
.join("..")
.join("..")
.canonicalize()
.expect("workspace root resolves")
}
fn rigg() -> Command {
let mut cmd = Command::cargo_bin("rigg").expect("binary builds");
cmd.env("RIGG_NO_UPDATE_CHECK", "1");
cmd.env_remove("RIGG_ENV");
cmd
}
fn generate(args: &[&str]) -> String {
let out = rigg().args(args).assert().success();
String::from_utf8(out.get_output().stdout.clone()).expect("generator prints UTF-8")
}
fn normalized(text: &str) -> String {
text.lines()
.map(str::trim_end)
.collect::<Vec<_>>()
.join("\n")
.trim()
.to_string()
}
fn generated_region(file: &Path, name: &str) -> String {
let text = std::fs::read_to_string(file)
.unwrap_or_else(|e| panic!("{} is readable: {e}", file.display()));
let start = format!("<!-- generated:{name}:start -->");
let end = format!("<!-- generated:{name}:end -->");
let open = text
.find(&start)
.unwrap_or_else(|| panic!("{} has no `{start}` marker", file.display()));
let body = open + start.len();
let close = text[body..]
.find(&end)
.unwrap_or_else(|| panic!("{} has no `{end}` marker", file.display()))
+ body;
text[body..close].to_string()
}
fn regen_hint(name: &str) -> &'static str {
match name {
"infra-table" => {
"run: cargo run -q --bin rigg -- dev infra-table \
and replace the text between the markers"
}
"mcp-tools" => {
"run: cargo run -q --bin rigg -- mcp tools --markdown \
and replace the text between the markers"
}
other => panic!("no regeneration hint for region `{other}`"),
}
}
fn assert_region_current(file: &Path, name: &str, generated: &str) {
let on_disk = normalized(&generated_region(file, name));
let fresh = normalized(generated);
assert_eq!(
on_disk,
fresh,
"\n{} region `{name}` is out of date — {}\n",
file.display(),
regen_hint(name)
);
}
#[test]
fn cli_reference_is_current() {
let file = repo_root().join("docs").join("reference").join("cli.md");
let on_disk = std::fs::read_to_string(&file)
.unwrap_or_else(|e| panic!("{} is readable: {e}", file.display()));
assert_eq!(
normalized(&on_disk),
normalized(&generate(&["dev", "cli-reference"])),
"\n{} is out of date — run: cargo run -q --bin rigg -- dev cli-reference > docs/reference/cli.md\n",
file.display()
);
}
#[test]
fn infra_table_is_current() {
let file = repo_root()
.join("docs")
.join("reference")
.join("resource-files.md");
assert_region_current(&file, "infra-table", &generate(&["dev", "infra-table"]));
}
#[test]
fn mcp_tool_table_is_current() {
let file = repo_root().join("MCP.md");
assert_region_current(
&file,
"mcp-tools",
&generate(&["mcp", "tools", "--markdown"]),
);
}
#[test]
fn docs_commands_parse() {
let root = repo_root();
let out = rigg()
.args(["dev", "docs-check", "--root"])
.arg(&root)
.assert()
.success();
let stdout = String::from_utf8(out.get_output().stdout.clone()).expect("UTF-8");
assert!(
stdout.trim_end().ends_with("docs-check: ok"),
"docs-check did not report ok:\n{stdout}"
);
}
#[test]
fn relative_links_resolve() {
let root = repo_root();
let out = rigg()
.args(["dev", "docs-check", "--root"])
.arg(&root)
.assert()
.success();
let stdout = String::from_utf8(out.get_output().stdout.clone()).expect("UTF-8");
assert!(
stdout.trim_end().ends_with("docs-check: ok"),
"docs-check did not report ok:\n{stdout}"
);
}