forjar 1.4.2

Rust-native Infrastructure as Code — bare-metal first, BLAKE3 state, provenance tracing
Documentation
//! Coverage boost: validate_safety, validate_governance, validate_ordering_b, validate_ownership.

use super::validate_governance::*;
use super::validate_ordering_b::*;
use super::validate_ownership::*;
use super::validate_safety::*;
use std::io::Write;

fn write_temp_config(yaml: &str) -> tempfile::NamedTempFile {
    let mut f = tempfile::NamedTempFile::new().unwrap();
    f.write_all(yaml.as_bytes()).unwrap();
    f.flush().unwrap();
    f
}

fn basic_config() -> &'static str {
    r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  pkg_nginx:
    type: package
    machine: m
    provider: apt
    packages: [nginx]
  svc_nginx:
    type: service
    machine: m
    name: nginx
    depends_on: [pkg_nginx]
"#
}

// ── validate_safety ─────────────────────────────────

#[test]
fn test_circular_deps_no_cycles() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_circular_deps(f.path(), false);
    assert!(result.is_ok());
}

#[test]
fn test_circular_deps_no_cycles_json() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_circular_deps(f.path(), true);
    assert!(result.is_ok());
}

#[test]
fn test_circular_deps_with_cycle() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  a:
    type: package
    machine: m
    provider: apt
    packages: [a]
    depends_on: [b]
  b:
    type: package
    machine: m
    provider: apt
    packages: [b]
    depends_on: [a]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_circular_deps(f.path(), false);
    // Should succeed but report cycles
    let _ = result;
}

#[test]
fn test_circular_deps_with_cycle_json() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  a:
    type: package
    machine: m
    provider: apt
    packages: [a]
    depends_on: [b]
  b:
    type: package
    machine: m
    provider: apt
    packages: [b]
    depends_on: [a]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_circular_deps(f.path(), true);
    let _ = result;
}

#[test]
fn test_machine_refs_valid() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_machine_refs(f.path(), false);
    assert!(result.is_ok());
}

#[test]
fn test_machine_refs_valid_json() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_machine_refs(f.path(), true);
    assert!(result.is_ok());
}

#[test]
fn test_machine_refs_invalid() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  pkg:
    type: package
    machine: nonexistent
    provider: apt
    packages: [curl]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_machine_refs(f.path(), false);
    let _ = result; // May Err or Ok with findings
}

#[test]
fn test_machine_refs_invalid_json() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  pkg:
    type: package
    machine: nonexistent
    provider: apt
    packages: [curl]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_machine_refs(f.path(), true);
    let _ = result;
}

#[test]
fn test_circular_deps_missing_file() {
    let result =
        cmd_validate_check_circular_deps(std::path::Path::new("/nonexistent.yaml"), false);
    assert!(result.is_err());
}

// ── validate_governance ─────────────────────────────

#[test]
fn test_naming_pattern_valid() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_naming_pattern(f.path(), false, "^[a-z_]+$");
    assert!(result.is_ok());
}

#[test]
fn test_naming_pattern_valid_json() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_naming_pattern(f.path(), true, "^[a-z_]+$");
    assert!(result.is_ok());
}

#[test]
fn test_naming_pattern_violation() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  MyBadName:
    type: package
    machine: m
    provider: apt
    packages: [curl]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_resource_naming_pattern(f.path(), false, "^[a-z_]+$");
    let _ = result;
}

#[test]
fn test_naming_pattern_violation_json() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  MyBadName:
    type: package
    machine: m
    provider: apt
    packages: [curl]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_resource_naming_pattern(f.path(), true, "^[a-z_]+$");
    let _ = result;
}

#[test]
fn test_provider_support_valid() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_provider_support(f.path(), false);
    assert!(result.is_ok());
}

#[test]
fn test_provider_support_valid_json() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_provider_support(f.path(), true);
    assert!(result.is_ok());
}

// ── validate_ordering_b ─────────────────────────────

#[test]
fn test_dep_refs_valid() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_dependency_refs(f.path(), false);
    assert!(result.is_ok());
}

#[test]
fn test_dep_refs_valid_json() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_dependency_refs(f.path(), true);
    assert!(result.is_ok());
}

#[test]
fn test_dep_refs_broken() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  svc:
    type: service
    machine: m
    name: nginx
    depends_on: [nonexistent_resource]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_resource_dependency_refs(f.path(), false);
    let _ = result;
}

#[test]
fn test_dep_refs_broken_json() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  svc:
    type: service
    machine: m
    name: nginx
    depends_on: [nonexistent_resource]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_resource_dependency_refs(f.path(), true);
    let _ = result;
}

#[test]
fn test_trigger_refs_valid() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_trigger_refs(f.path(), false);
    assert!(result.is_ok());
}

#[test]
fn test_trigger_refs_valid_json() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_trigger_refs(f.path(), true);
    assert!(result.is_ok());
}

// ── validate_ownership ──────────────────────────────

#[test]
fn test_naming_convention_valid() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_naming_convention(f.path(), false);
    assert!(result.is_ok());
}

#[test]
fn test_naming_convention_valid_json() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_naming_convention(f.path(), true);
    assert!(result.is_ok());
}

#[test]
fn test_naming_convention_violations() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  "My Bad Resource":
    type: package
    machine: m
    provider: apt
    packages: [curl]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_resource_naming_convention(f.path(), false);
    let _ = result;
}

#[test]
fn test_naming_convention_violations_json() {
    let yaml = r#"
version: "1.0"
name: t
machines:
  m:
    hostname: m
    addr: 127.0.0.1
resources:
  "My Bad Resource":
    type: package
    machine: m
    provider: apt
    packages: [curl]
"#;
    let f = write_temp_config(yaml);
    let result = cmd_validate_check_resource_naming_convention(f.path(), true);
    let _ = result;
}

#[test]
fn test_idempotency_check() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_idempotency(f.path(), false);
    assert!(result.is_ok());
}

#[test]
fn test_idempotency_check_json() {
    let f = write_temp_config(basic_config());
    let result = cmd_validate_check_resource_idempotency(f.path(), true);
    assert!(result.is_ok());
}