use assert_cmd::Command;
use std::fs;
fn ansi_present(s: &str) -> bool {
s.contains('\x1b')
}
#[test]
fn list_data_goes_to_stdout_stderr_is_empty() {
let tmp = tempfile::tempdir().unwrap();
fs::create_dir(tmp.path().join(".git")).unwrap();
let assert = Command::cargo_bin("upskill")
.unwrap()
.current_dir(tmp.path())
.args(["list", "--project"])
.assert()
.success();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
let stderr = String::from_utf8(assert.get_output().stderr.clone()).unwrap();
assert!(
stdout.contains("no items installed"),
"expected data on stdout, got: {stdout:?}"
);
assert!(
stderr.is_empty(),
"expected stderr empty for success path, got: {stderr:?}"
);
}
#[test]
fn add_invalid_source_writes_error_to_stderr_not_stdout() {
let tmp = tempfile::tempdir().unwrap();
let assert = Command::cargo_bin("upskill")
.unwrap()
.current_dir(tmp.path())
.args(["add", "not a valid source"])
.assert()
.failure()
.code(2);
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
let stderr = String::from_utf8(assert.get_output().stderr.clone()).unwrap();
assert!(
stdout.is_empty(),
"expected stdout empty for usage error, got: {stdout:?}"
);
assert!(
stderr.contains("error:"),
"expected `error:` prefix on stderr, got: {stderr:?}"
);
}
#[test]
fn list_stdout_has_no_ansi_when_piped() {
let tmp = tempfile::tempdir().unwrap();
fs::create_dir(tmp.path().join(".git")).unwrap();
let assert = Command::cargo_bin("upskill")
.unwrap()
.current_dir(tmp.path())
.args(["list", "--project"])
.assert()
.success();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
assert!(
!ansi_present(&stdout),
"stdout must not contain ANSI escapes when piped, got: {stdout:?}"
);
}
#[test]
fn add_invalid_source_stderr_has_no_ansi_under_no_color_env() {
let tmp = tempfile::tempdir().unwrap();
let assert = Command::cargo_bin("upskill")
.unwrap()
.current_dir(tmp.path())
.env("NO_COLOR", "1")
.args(["add", "not a valid source"])
.assert()
.failure()
.code(2);
let stderr = String::from_utf8(assert.get_output().stderr.clone()).unwrap();
assert!(
!ansi_present(&stderr),
"NO_COLOR=1 must strip ANSI from stderr, got: {stderr:?}"
);
}