#![allow(unused_imports)]
use super::package::*;
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("echo 'pmat=installed'"));
assert!(script.contains("echo 'pmat=MISSING'"));
}
#[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);
assert!(script.contains("dpkg -l 'a'"));
assert!(script.contains("dpkg -l 'b'"));
assert!(script.contains("dpkg -l 'c'"));
assert_eq!(script.matches('\n').count(), 2);
}
#[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_unsupported() {
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("unsupported"),
"cargo absent should be unsupported"
);
}
#[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("command -v 'apr-cli'"),
"check_script must use package name even with source: {script}"
);
}
#[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}");
}