use clap::Parser;
use std::fs;
use std::path::PathBuf;
use stern4rust::args::Args;
use stern4rust::run_outcome::RunOutcome;
use stern4rust::runner::Runner;
const THIS_CRATE: &str = "cargo-stern4rust";
fn args_from(parts: &[&str]) -> Args {
Args::parse_from(parts.iter().map(|part| (*part).to_string()))
}
fn header_file(name: &str, contents: &str) -> PathBuf {
let path = std::env::temp_dir().join(format!("stern4rust_header_{name}.txt"));
fs::write(&path, contents).expect("write the header file");
path
}
fn run_with_header(name: &str, contents: &str) -> RunOutcome {
let path = header_file(name, contents);
Runner::run(args_from(&[
"cargo-stern4rust",
"--manifest-path",
"Cargo.toml",
"--package",
THIS_CRATE,
"--header-file",
&path.to_string_lossy(),
]))
.expect("the run itself should succeed")
}
#[test]
fn run_against_an_unknown_package_is_an_error() {
let path = header_file("unknown_package", "// Copyright 2025\n");
let args = args_from(&[
"cargo-stern4rust",
"--manifest-path",
"Cargo.toml",
"--package",
"no-such-package",
"--header-file",
&path.to_string_lossy(),
]);
let result = Runner::run(args);
assert!(result.is_err());
}
#[test]
fn run_against_this_crate_with_a_header_it_does_not_carry_reports_rules_broken() {
let outcome = run_with_header("foreign", "// Copyright 1999 Someone Else\n");
assert_eq!(outcome, RunOutcome::RulesBroken);
}
#[test]
fn run_against_this_crate_with_its_own_header_is_clean() {
let outcome = run_with_header(
"own",
"// Copyright 2025 Umberto Gotti <umberto.gotti@umbertogotti.dev>\n\
// Licensed under the MIT License\n\
// SPDX-License-Identifier: MIT\n",
);
assert_eq!(outcome, RunOutcome::Clean);
}
#[test]
fn run_with_an_unreadable_header_file_is_an_error() {
let absent = std::env::temp_dir().join("stern4rust_header_absent.txt");
let _ = fs::remove_file(&absent);
let args = args_from(&[
"cargo-stern4rust",
"--manifest-path",
"Cargo.toml",
"--header-file",
&absent.to_string_lossy(),
]);
let result = Runner::run(args);
assert!(result.is_err());
}
#[test]
fn run_without_a_header_file_still_applies_the_rules_that_need_no_configuration() {
let args = args_from(&["cargo-stern4rust", "--manifest-path", "Cargo.toml"]);
let result = Runner::run(args);
assert!(result.is_ok());
}