#![allow(unused_imports)]
use super::package::*;
use super::package_check::check_script;
use super::tests_package::make_apt_resource;
use crate::core::types::{MachineTarget, Resource, ResourceType};
#[test]
fn test_fj006_state_query_cargo_output_format() {
let mut r = make_apt_resource(&["pmat"]);
r.provider = Some("cargo".to_string());
let script = state_query_script(&r);
assert!(script.contains("pmat=installed"));
assert!(script.contains("echo 'pmat=MISSING'"));
}
#[cfg(unix)]
#[test]
fn cargo_observable_reports_a_deleted_binary_as_gone() {
use std::os::unix::fs::PermissionsExt;
let tmp = tempfile::tempdir().expect("tempdir");
let bin = tmp.path().join("bin");
std::fs::create_dir_all(&bin).unwrap();
let fake_cargo = bin.join("cargo");
std::fs::write(
&fake_cargo,
"#!/bin/sh\nprintf 'demo-crate v1.0.0:\\n demo-one\\n demo-two\\n'\n",
)
.unwrap();
std::fs::set_permissions(&fake_cargo, std::fs::Permissions::from_mode(0o755)).unwrap();
let mut r = make_apt_resource(&["demo-crate"]);
r.provider = Some("cargo".to_string());
let script = state_query_script(&r);
let run = |extra_bins: &[&str]| -> String {
for b in extra_bins {
let p = bin.join(b);
std::fs::write(&p, "#!/bin/sh\nexit 0\n").unwrap();
std::fs::set_permissions(&p, std::fs::Permissions::from_mode(0o755)).unwrap();
}
let path = format!("{}:/usr/bin:/bin", bin.to_str().unwrap());
let out = std::process::Command::new("/bin/sh")
.arg("-c")
.arg(&script)
.env("PATH", &path)
.output()
.expect("run observable");
String::from_utf8_lossy(&out.stdout).trim().to_string()
};
let gone = run(&[]);
assert!(
gone.contains("demo-one:GONE") && gone.contains("demo-two:GONE"),
"a registered crate with NO binaries must not read as healthy, got: {gone}"
);
let ok = run(&["demo-one", "demo-two"]);
assert!(
ok.contains("demo-one:ok") && ok.contains("demo-two:ok"),
"a fully installed crate must read as ok, got: {ok}"
);
assert_ne!(
gone, ok,
"the observable produces the SAME output whether the binaries exist or \
not — it cannot generate a drift signal"
);
}
#[test]
fn test_fj006_state_query_apt_output_format() {
let r = make_apt_resource(&["vim"]);
let script = state_query_script(&r);
assert!(script.contains("vim"));
assert!(script.contains("vim=MISSING"));
assert!(script.contains("dpkg-query -W"));
}
#[test]
fn test_fj006_multi_package_check_preserves_all() {
let r = make_apt_resource(&["a", "b", "c"]);
let script = check_script(&r);
let positions: Vec<usize> = ["a", "b", "c"]
.iter()
.map(|p| {
script
.find(&format!("dpkg -l '{p}'"))
.unwrap_or_else(|| panic!("package {p} is not checked at all:\n{script}"))
})
.collect();
assert!(
positions.windows(2).all(|w| w[0] < w[1]),
"packages are checked out of declared order:\n{script}"
);
}
#[test]
fn test_fj006_cargo_install_unconditional_force() {
let mut r = make_apt_resource(&["tool"]);
r.provider = Some("cargo".to_string());
let script = apply_script(&r);
assert!(script.contains("cargo install --force --locked --root"));
assert!(script.contains("'tool'"));
}
#[test]
fn test_fj006_apt_version_constraint() {
let mut r = make_apt_resource(&["nginx"]);
r.version = Some("1.18.0-0ubuntu1".to_string());
let script = apply_script(&r);
assert!(script.contains("'nginx=1.18.0-0ubuntu1'"));
assert!(script.contains("dpkg -l \"$pkg\""));
}
#[test]
fn test_fj006_cargo_version_constraint() {
let mut r = make_apt_resource(&["batuta"]);
r.provider = Some("cargo".to_string());
r.version = Some("0.3.0".to_string());
let script = apply_script(&r);
assert!(script.contains("cargo install --force --locked --root"));
assert!(script.contains("'batuta@0.3.0'"));
}
#[test]
fn test_fj006_uv_version_constraint() {
let mut r = make_apt_resource(&["ruff"]);
r.provider = Some("uv".to_string());
r.version = Some("0.4.0".to_string());
let script = apply_script(&r);
assert!(script.contains("uv tool install --force 'ruff==0.4.0'"));
}
#[test]
fn test_fj006_no_version_unchanged() {
let r = make_apt_resource(&["curl"]);
let script = apply_script(&r);
assert!(script.contains("'curl'"));
assert!(!script.contains("curl="));
}
#[test]
fn test_fj006_default_provider_is_apt() {
let mut r = make_apt_resource(&["curl"]);
r.provider = None; let script = apply_script(&r);
assert!(
script.contains("apt-get install"),
"default provider should be apt"
);
}
#[test]
fn test_fj006_default_state_is_present() {
let mut r = make_apt_resource(&["curl"]);
r.state = None; let script = apply_script(&r);
assert!(
script.contains("apt-get install"),
"default state should be present (install)"
);
assert!(!script.contains("apt-get remove"));
}
#[test]
fn test_fj006_apt_idempotent_check() {
let r = make_apt_resource(&["curl"]);
let script = apply_script(&r);
assert!(
script.contains("NEED_INSTALL=0"),
"must have idempotent check"
);
assert!(
script.contains("NEED_INSTALL=1"),
"must set flag when package missing"
);
}
#[test]
fn test_fj006_apt_postcondition_verify() {
let r = make_apt_resource(&["curl", "wget"]);
let script = apply_script(&r);
let last_dpkg = script.rfind("dpkg -l").unwrap();
let install = script.find("apt-get install").unwrap();
assert!(
last_dpkg > install,
"postcondition check must come after install"
);
}
#[test]
fn test_fj006_uv_absent_tolerant() {
let mut r = make_apt_resource(&["ruff"]);
r.provider = Some("uv".to_string());
r.state = Some("absent".to_string());
let script = apply_script(&r);
assert!(
script.contains("|| true"),
"uv uninstall should tolerate already-absent"
);
}
#[test]
fn test_fj006_cargo_absent_uninstalls() {
let mut r = make_apt_resource(&["tool"]);
r.provider = Some("cargo".to_string());
r.state = Some("absent".to_string());
let script = apply_script(&r);
assert!(
script.contains("cargo uninstall 'tool'"),
"a declared cargo removal must actually uninstall:\n{script}"
);
assert!(
!script.contains("unsupported"),
"cargo absent is supported now:\n{script}"
);
}
#[test]
fn an_unsupported_declaration_refuses_instead_of_converging() {
let mut r = make_apt_resource(&["tool"]);
r.provider = Some("nonesuch".to_string());
r.state = Some("present".to_string());
let script = apply_script(&r);
assert!(
script.contains("exit 1"),
"an unsupported declaration must exit non-zero:\n{script}"
);
assert!(
script.contains("provider=nonesuch"),
"the refusal must name the pair it could not handle:\n{script}"
);
}
#[test]
fn test_fj1005_cargo_bootstrap_rustup() {
let mut r = make_apt_resource(&["realizar"]);
r.provider = Some("cargo".to_string());
let script = apply_script(&r);
assert!(
script.contains("command -v cargo"),
"must check if cargo exists: {script}"
);
assert!(
script.contains("rustup.rs"),
"must bootstrap via rustup: {script}"
);
assert!(
script.contains("cargo install --force --locked --root"),
"must still install (with --root for cache): {script}"
);
assert!(
script.contains(".cargo/bin:$PATH"),
"must add cargo to PATH: {script}"
);
}
#[test]
fn test_pmat043_rustup_no_curl_pipe_to_sh() {
let mut r = make_apt_resource(&["realizar"]);
r.provider = Some("cargo".to_string());
let script = apply_script(&r);
assert!(
!script.contains("| sh"),
"must not pipe curl to sh (SEC008): {script}"
);
assert!(
!script.contains("| bash"),
"must not pipe curl to bash: {script}"
);
assert!(
script.contains("rustup-init"),
"should download rustup-init to a file: {script}"
);
}
#[test]
fn test_fj1008_cargo_install_limits_parallelism() {
let mut r = make_apt_resource(&["realizar"]);
r.provider = Some("cargo".to_string());
let script = apply_script(&r);
assert!(
script.contains("CARGO_BUILD_JOBS"),
"cargo install must set CARGO_BUILD_JOBS to limit parallelism: {script}"
);
assert!(
script.contains("nproc"),
"must derive job limit from nproc: {script}"
);
}
#[test]
fn test_fj_cargo_install_from_source() {
let mut r = make_apt_resource(&["apr-cli"]);
r.provider = Some("cargo".to_string());
r.source = Some("/build/apr-cli".to_string());
let script = apply_script(&r);
assert!(
script.contains("cargo install --force --locked --path '/build/apr-cli'"),
"cargo source must use --path: {script}"
);
assert!(
!script.contains("cargo install --force --locked 'apr-cli'"),
"cargo source must NOT use crate name for install: {script}"
);
}
#[test]
fn test_fj_cargo_source_ignores_version() {
let mut r = make_apt_resource(&["apr-cli"]);
r.provider = Some("cargo".to_string());
r.source = Some("/build/apr-cli".to_string());
r.version = Some("0.1.0".to_string());
let script = apply_script(&r);
assert!(
script.contains("cargo install --force --locked --path '/build/apr-cli'"),
"cargo source+version must still use --path: {script}"
);
assert!(
!script.contains("@0.1.0"),
"cargo source must ignore version: {script}"
);
}
#[test]
fn test_fj_cargo_source_check_uses_binary_name() {
let mut r = make_apt_resource(&["apr-cli"]);
r.provider = Some("cargo".to_string());
r.source = Some("/build/apr-cli".to_string());
let script = check_script(&r);
assert!(
script.contains("'^apr-cli v'"),
"check must identify the crate by name even with source: {script}"
);
assert!(
!script.contains("command -v"),
"PATH lookup cannot answer this"
);
}
#[test]
fn test_fj036_package_cargo_install_with_version() {
let mut r = make_apt_resource(&["ripgrep"]);
r.provider = Some("cargo".to_string());
r.version = Some("14.1.0".to_string());
let script = apply_script(&r);
assert!(
script.contains("cargo install --force --locked --root"),
"cargo install with version must use --root for cache: {script}"
);
assert!(
script.contains("'ripgrep@14.1.0'"),
"cargo install with version must use @version syntax: {script}"
);
}
#[test]
fn test_fj036_package_uv_install() {
let mut r = make_apt_resource(&["ruff", "black"]);
r.provider = Some("uv".to_string());
let script = apply_script(&r);
assert!(
script.contains("uv tool install --force 'ruff'"),
"uv provider must generate uv tool install: {script}"
);
assert!(
script.contains("uv tool install --force 'black'"),
"uv provider must install all packages: {script}"
);
assert!(
script.contains("set -euo pipefail"),
"uv install must start with safety flags: {script}"
);
}
#[test]
fn test_apply_script_arm_apt_present() {
let r = make_apt_resource(&["curl"]);
let script = apply_script(&r);
assert!(script.contains("apt-get install"), "apt present: {script}");
}
#[test]
fn test_apply_script_arm_apt_absent() {
let mut r = make_apt_resource(&["curl"]);
r.state = Some("absent".to_string());
let script = apply_script(&r);
assert!(script.contains("apt-get remove"), "apt absent: {script}");
}
#[test]
fn test_apply_script_arm_apt_latest() {
let mut r = make_apt_resource(&["docker-ce", "docker-ce-cli"]);
r.state = Some("latest".to_string());
let script = apply_script(&r);
assert!(
script.contains("apt-get update"),
"apt latest must refresh lists: {script}"
);
assert!(
script.contains("apt-get install"),
"apt latest must install/upgrade: {script}"
);
assert!(
script.contains("docker-ce") && script.contains("docker-ce-cli"),
"apt latest must reference all packages: {script}"
);
assert!(
!script.contains("unsupported"),
"apt latest must not fall through to unsupported arm: {script}"
);
assert!(
script.contains("set -euo pipefail"),
"apt latest must use safety flags: {script}"
);
assert!(
script.contains("dpkg -l"),
"apt latest must verify postcondition via dpkg: {script}"
);
assert!(
script.contains("apt-get update -qq || true"),
"apt latest must tolerate apt-get update failures: {script}"
);
}
#[test]
fn test_apply_script_arm_cargo_present() {
let mut r = make_apt_resource(&["tool"]);
r.provider = Some("cargo".to_string());
let script = apply_script(&r);
assert!(script.contains("cargo install"), "cargo present: {script}");
}
#[test]
fn test_apply_script_arm_uv_present() {
let mut r = make_apt_resource(&["ruff"]);
r.provider = Some("uv".to_string());
let script = apply_script(&r);
assert!(script.contains("uv tool install"), "uv present: {script}");
}
#[test]
fn test_apply_script_arm_uv_absent() {
let mut r = make_apt_resource(&["ruff"]);
r.provider = Some("uv".to_string());
r.state = Some("absent".to_string());
let script = apply_script(&r);
assert!(script.contains("uv tool uninstall"), "uv absent: {script}");
}
#[test]
fn test_apply_script_arm_other_provider_other_state() {
let mut r = make_apt_resource(&["foo"]);
r.provider = Some("pip".to_string());
r.state = Some("present".to_string());
let script = apply_script(&r);
assert!(script.contains("unsupported"), "other arm: {script}");
}