use predicates::prelude::*;
use tempfile::TempDir;
use crate::harness;
const GROUP_HEADINGS: &[&str] = &[
"read and write data",
"browse and exchange (porcelain)",
"low-level git ref operations (plumbing)",
"setup and configuration",
];
const SUBGROUP_LABELS: &[&str] = &["(strings)", "(lists)", "(sets)"];
const VISIBLE_COMMANDS: &[&str] = &[
"set",
"get",
"rm",
"list:push",
"set:add",
"show",
"inspect",
"log",
"stats",
"push",
"pull",
"serialize",
"materialize",
"remote",
"config",
"teardown",
];
const HIDDEN_COMMANDS: &[&str] = &[
"import",
"watch",
"promisor",
"prune",
"local-prune",
"config:prune",
];
#[test]
fn top_level_help_is_curated_for_every_invocation() {
let dir = TempDir::new().unwrap();
for invocation in [&[][..], &["-h"], &["--help"], &["help"]] {
let mut cmd = harness::git_meta(dir.path());
let mut assertion = cmd.args(invocation).assert().success();
for heading in GROUP_HEADINGS {
assertion = assertion.stdout(predicate::str::contains(*heading));
}
for label in SUBGROUP_LABELS {
assertion = assertion.stdout(predicate::str::contains(*label));
}
for name in VISIBLE_COMMANDS {
assertion = assertion.stdout(predicate::str::contains(*name));
}
for name in HIDDEN_COMMANDS {
assertion = assertion.stdout(predicate::str::contains(*name).not());
}
}
}
#[test]
fn porcelain_group_lists_push_pull_before_inspection_commands() {
let dir = TempDir::new().unwrap();
harness::git_meta(dir.path())
.assert()
.success()
.stdout(predicate::function(|out: &str| {
let push = out.find(" push ").expect("push line missing");
let pull = out.find(" pull ").expect("pull line missing");
let show = out.find(" show ").expect("show line missing");
let stats = out.find(" stats ").expect("stats line missing");
push < pull && pull < show && show < stats
}))
.stdout(predicate::str::contains(
"Pull remote metadata and merge into local database\n\n show",
));
}
#[test]
fn hidden_commands_remain_invokable() {
let dir = TempDir::new().unwrap();
harness::git_meta(dir.path())
.args(["import", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("Import metadata"));
}
#[test]
fn subcommand_help_still_uses_clap() {
let dir = TempDir::new().unwrap();
harness::git_meta(dir.path())
.args(["set", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("Usage: git-meta set"))
.stdout(predicate::str::contains("<TARGET>"));
}
#[test]
fn top_level_help_omits_color_when_not_a_tty() {
let dir = TempDir::new().unwrap();
harness::git_meta(dir.path())
.env_remove("CLICOLOR_FORCE")
.assert()
.success()
.stdout(predicate::str::contains("\x1b[").not());
}
#[test]
fn top_level_help_emits_color_when_forced() {
let dir = TempDir::new().unwrap();
harness::git_meta(dir.path())
.env_remove("NO_COLOR")
.env("CLICOLOR_FORCE", "1")
.assert()
.success()
.stdout(predicate::str::contains("\x1b[1musage:\x1b[0m"))
.stdout(predicate::str::contains(
"\x1b[1m\x1b[33mread and write data\x1b[0m",
))
.stdout(predicate::str::contains("\x1b[2m(strings)\x1b[0m"))
.stdout(predicate::str::contains("\x1b[2m(lists)\x1b[0m"))
.stdout(predicate::str::contains("\x1b[2m(sets)\x1b[0m"))
.stdout(predicate::str::contains("\x1b[32mset"))
.stdout(predicate::str::contains("\x1b[2mRun 'git meta"));
}
#[test]
fn no_color_overrides_clicolor_force() {
let dir = TempDir::new().unwrap();
harness::git_meta(dir.path())
.env("NO_COLOR", "1")
.env("CLICOLOR_FORCE", "1")
.assert()
.success()
.stdout(predicate::str::contains("\x1b[").not());
}