use std::path::Path;
use std::process::{Command, Stdio};
use tempfile::TempDir;
const ALINT: &str = env!("CARGO_BIN_EXE_alint");
fn fixture_repo() -> TempDir {
let tmp = tempfile::Builder::new()
.prefix("alint-styling-test-")
.tempdir()
.expect("tempdir create");
std::fs::write(
tmp.path().join(".alint.yml"),
b"version: 1\n\
extends:\n \
- alint://bundled/oss-baseline@v1\n\
facts:\n \
- id: has_node\n \
any_file_exists: package.json\n\
rules:\n \
- id: must-have-license\n \
kind: file_exists\n \
paths: LICENSE\n \
level: warning\n \
policy_url: https://opensource.guide/legal/\n",
)
.unwrap();
std::fs::write(
tmp.path().join("package.json"),
br#"{"name":"alint-styling-fixture","version":"0.0.0"}"#,
)
.unwrap();
tmp
}
fn run(args: &[&str], cwd: &Path) -> (Vec<u8>, Vec<u8>) {
let out = Command::new(ALINT)
.args(args)
.current_dir(cwd)
.stdin(Stdio::null())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()
.expect("alint exec");
(out.stdout, out.stderr)
}
fn assert_has_ansi(label: &str, args: &[&str], stdout: &[u8]) {
let s = std::str::from_utf8(stdout).expect("utf8 stdout");
assert!(
s.contains("\x1b["),
"[{label}] (alint {}) expected ANSI SGR escapes in stdout, got:\n{s}",
args.join(" "),
);
}
fn assert_no_ansi(label: &str, args: &[&str], stdout: &[u8]) {
let s = std::str::from_utf8(stdout).expect("utf8 stdout");
assert!(
!s.contains("\x1b["),
"[{label}] (alint {}) expected NO ANSI SGR escapes in stdout, got:\n{s:?}",
args.join(" "),
);
}
fn human_output_subcommands() -> Vec<(&'static str, Vec<&'static str>)> {
vec![
("check", vec!["check"]),
("list", vec!["list"]),
("explain", vec!["explain", "must-have-license"]),
("fix", vec!["fix", "--dry-run"]),
("facts", vec!["facts"]),
("suggest", vec!["suggest", "--quiet", "--include-bundled"]),
]
}
#[test]
fn every_human_command_emits_ansi_when_color_is_always() {
let tmp = fixture_repo();
for (name, base_args) in human_output_subcommands() {
let mut args = base_args.clone();
args.extend(["--color", "always"]);
let (stdout, _stderr) = run(&args, tmp.path());
assert_has_ansi(name, &args, &stdout);
}
}
#[test]
fn every_human_command_strips_ansi_when_color_is_never() {
let tmp = fixture_repo();
for (name, base_args) in human_output_subcommands() {
let mut args = base_args.clone();
args.extend(["--color", "never"]);
let (stdout, _stderr) = run(&args, tmp.path());
assert_no_ansi(name, &args, &stdout);
}
}
#[test]
fn every_human_command_strips_ansi_under_default_color_over_pipe() {
let tmp = fixture_repo();
for (name, base_args) in human_output_subcommands() {
let (stdout, _stderr) = run(&base_args, tmp.path());
assert_no_ansi(name, &base_args, &stdout);
}
}