use super::{QUIET_INJECTION, has_explicit_status_hints_override, status_hints_off};
use crate::command_test_support::{git_output, os_arguments, remove, repository_with_tracked_file};
use crate::rule_argument_rewrite::ArgumentRewrite;
use std::ffi::OsString;
use std::path::PathBuf;
use std::process::Output;
fn decide(values: &[&str]) -> ArgumentRewrite {
return status_hints_off(os_arguments(values).as_slice());
}
fn overridden(values: &[&str]) -> bool {
return has_explicit_status_hints_override(os_arguments(values).as_slice());
}
#[test]
fn detects_an_explicit_override_before_the_subcommand_only() {
assert!(overridden(&["-c", "advice.statusHints=true", "status"]));
assert!(overridden(&["-c", "advice.statusHints", "status"]));
assert!(overridden(&["-c", "Advice.StatusHints=true", "status"]));
assert!(!overridden(&["status", "-c", "advice.statusHints=true"]));
assert!(!overridden(&["status"]));
assert!(overridden(&["-c", "advice.statusHints=true", "commit"]));
assert!(overridden(&["-c", "advice.statusHints=true"]));
assert!(overridden(&["-c", "advice.statusHints=true", "--version"]));
assert!(!overridden(&[]));
}
#[test]
fn passes_non_status_commands_through_unchanged() {
for values in [
vec!["commit", "-m", "message", "file.ts"],
vec![],
vec!["--version", "status"],
vec!["-C", "status", "log"],
vec!["--bogus", "status"],
vec!["-c"],
] {
assert_eq!(
decide(values.as_slice()),
ArgumentRewrite::Unchanged,
"{values:?}"
);
}
}
#[test]
fn injects_the_advice_override_before_status() {
assert_eq!(
decide(&["status"]),
ArgumentRewrite::Rewritten(os_arguments(&["-c", "advice.statusHints=false", "status"]))
);
assert_eq!(
decide(&["-C", "/tmp/repo", "status", "--short"]),
ArgumentRewrite::Rewritten(os_arguments(&[
"-C",
"/tmp/repo",
"-c",
"advice.statusHints=false",
"status",
"--short"
]))
);
assert_eq!(QUIET_INJECTION, &["-c", "advice.statusHints=false"]);
}
#[test]
fn skips_injection_when_the_caller_set_the_key() {
for values in [
vec!["-c", "advice.statusHints=true", "status"],
vec!["-c", "advice.statusHints", "status"],
vec!["--config-env=advice.statusHints=HINTS", "status"],
] {
assert_eq!(
decide(values.as_slice()),
ArgumentRewrite::Unchanged,
"{values:?}"
);
}
assert_eq!(
decide(&["status", "-c", "advice.statusHints=true"]),
ArgumentRewrite::Rewritten(os_arguments(&[
"-c",
"advice.statusHints=false",
"status",
"-c",
"advice.statusHints=true"
]))
);
}
#[test]
fn the_injected_pair_silences_git_hints() {
let (directory, root): (PathBuf, PathBuf) = repository_with_tracked_file("status-hints");
std::fs::write(root.join("tracked.txt"), b"two\n").expect("modify tracked file");
let plain: Output = git_output(root.as_path(), os_arguments(&["status"]).as_slice());
assert!(String::from_utf8_lossy(&plain.stdout).contains("use \"git add"));
let arguments: Vec<OsString> = if let ArgumentRewrite::Rewritten(list) = decide(&["status"]) {
list
} else {
panic!("expected a rewrite");
};
let quiet: Output = git_output(root.as_path(), arguments.as_slice());
assert!(quiet.status.success());
let text: String = String::from_utf8_lossy(&quiet.stdout).into_owned();
assert!(
text.contains("tracked.txt") && !text.contains("use \"git add"),
"{text}"
);
remove(directory.as_path());
}