mod common;
use common::Repo;
#[test]
fn list_reports_the_settings_in_effect() {
let r = Repo::new();
let out = r.run(&["list"]).output();
assert!(out.contains("commit style"), "{out}");
for row in ["gitmoji", "subject max", "description max", "body wrap"] {
assert!(out.contains(row), "{row} missing from: {out}");
}
}
#[test]
fn the_defaults_are_shown_and_so_is_the_way_to_change_them() {
let r = Repo::new();
let out = r.run(&["list"]).output();
assert!(out.contains("none"), "the default placement: {out}");
assert!(out.contains("72"), "the default subject limit: {out}");
assert!(out.contains("amont setup"), "no pointer at all: {out}");
}
#[test]
fn a_configured_value_names_its_key_and_scope() {
let r = Repo::new();
r.git(&["config", "amont.commit.gitmoji", "suffix"]);
let out = r.run(&["list"]).output();
assert!(out.contains("suffix"), "{out}");
assert!(out.contains("amont.commit.gitmoji"), "{out}");
assert!(out.contains("local"), "the scope was not reported: {out}");
}
#[test]
fn narrowing_to_one_stage_still_shows_the_commit_style() {
let r = Repo::new();
let out = r.run(&["list", "--stage", "pre-push"]).output();
assert!(out.contains("commit style"), "{out}");
}
#[test]
fn the_json_carries_the_same_answer() {
let r = Repo::new();
r.git(&["config", "amont.commit.subjectMax", "100"]);
let out = r.run(&["list", "--json"]).stdout;
assert!(out.contains("\"commit_style\""), "{out}");
assert!(out.contains("\"value\":100"), "{out}");
assert!(out.contains("\"default\":72"), "{out}");
assert!(out.contains("\"overridden\":true"), "{out}");
}
#[test]
fn an_incoherent_pair_is_reported_by_list_and_not_by_the_hook() {
let r = Repo::new();
r.git(&["config", "amont.commit.subjectMax", "52"]);
r.git(&["config", "amont.commit.descriptionMax", "50"]);
let listed = r.run(&["list"]).output();
assert!(listed.contains("can never bind"), "{listed}");
r.write("MSG", "feat: a short one\n");
let hooked = r.hook("commit-msg", &["MSG"]).output();
assert!(
!hooked.contains("can never bind"),
"the hook should not lecture: {hooked}"
);
}
#[test]
fn setup_without_a_terminal_prints_the_commands_and_succeeds() {
let r = Repo::new();
let run = r.run(&["setup"]);
assert!(run.passed(), "exit {}: {}", run.code, run.output());
assert!(run.stderr.contains("not a terminal"), "{}", run.stderr);
for key in [
"amont.commit.gitmoji",
"amont.commit.subjectMax",
"amont.commit.descriptionMax",
"amont.commit.bodyWrap",
] {
assert!(run.stdout.contains(key), "{key} missing: {}", run.stdout);
}
assert!(!run.stdout.contains("not a terminal"), "{}", run.stdout);
}
#[test]
fn the_printed_commands_carry_the_current_values() {
let r = Repo::new();
r.git(&["config", "amont.commit.gitmoji", "replace"]);
let out = r.run(&["setup"]).stdout;
assert!(out.contains("amont.commit.gitmoji replace"), "{out}");
}
#[test]
fn setup_refuses_contradictory_scopes() {
let r = Repo::new();
let run = r.run(&["setup", "--local", "--global"]);
assert!(!run.passed());
assert!(run.output().contains("contradict"), "{}", run.output());
}
#[test]
fn setup_rejects_an_argument_it_does_not_know() {
let r = Repo::new();
let run = r.run(&["setup", "--wat"]);
assert!(!run.passed());
assert!(run.output().contains("--wat"), "{}", run.output());
assert!(run.output().contains("usage"), "{}", run.output());
}
#[test]
fn help_names_the_new_verb() {
let r = Repo::new();
let out = r.run(&["--help"]).output();
assert!(out.contains("amont setup"), "{out}");
}