use assert_cmd::Command;
use predicates::prelude::*;
use serial_test::serial;
use tempfile::TempDir;
#[allow(deprecated)]
fn cmd_isolado(xdg_home: &TempDir) -> Command {
let mut cmd = Command::cargo_bin("context7").unwrap();
cmd.env_clear()
.env("CONTEXT7_HOME", xdg_home.path())
.env("HOME", xdg_home.path());
cmd
}
#[test]
#[serial]
fn testa_health_sem_chaves_retorna_66() {
let dir = TempDir::new().unwrap();
cmd_isolado(&dir).arg("health").assert().code(66);
}
#[test]
#[serial]
fn testa_health_json_formato_parseavel() {
let dir = TempDir::new().unwrap();
let output = cmd_isolado(&dir)
.args(["--json", "health"])
.output()
.unwrap();
assert_eq!(output.status.code(), Some(66));
let stdout = String::from_utf8_lossy(&output.stdout);
let linha = stdout.lines().next().unwrap_or("");
let valor: serde_json::Value =
serde_json::from_str(linha).expect("stdout deve ser JSON válido em modo --json");
assert_eq!(valor["type"], "health", "campo 'type' deve ser 'health'");
assert!(
valor["timestamp"].is_string(),
"campo 'timestamp' deve existir"
);
assert_eq!(
valor["config_ok"], true,
"config_ok deve ser true (cliente HTTP criado)"
);
assert_eq!(valor["keys_count"], 0, "keys_count deve ser 0 sem chaves");
assert_eq!(
valor["api_alcancavel"], false,
"api_alcancavel deve ser false sem chaves"
);
}
#[test]
#[serial]
fn testa_health_quiet_silencia_stdout() {
let dir = TempDir::new().unwrap();
let output = cmd_isolado(&dir)
.args(["--quiet", "health"])
.output()
.unwrap();
assert_eq!(output.status.code(), Some(66));
assert!(
output.stdout.is_empty(),
"stdout deve estar vazio com --quiet, obteve: {:?}",
String::from_utf8_lossy(&output.stdout)
);
}
#[test]
#[serial]
fn testa_health_exibe_diagnostico_sem_chaves() {
let dir = TempDir::new().unwrap();
cmd_isolado(&dir).arg("health").assert().code(66).stdout(
predicate::str::contains("keys")
.or(predicate::str::contains("chaves"))
.or(predicate::str::contains("FAIL"))
.or(predicate::str::contains("[FAIL]")),
);
}