#![allow(deprecated, clippy::unwrap_used)]
use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
use tempfile::TempDir;
fn batuta_cmd() -> Command {
let mut cmd = Command::cargo_bin("batuta").unwrap();
cmd.arg("--unsafe-skip-drift-check");
cmd
}
#[test]
fn test_analyze_workflow() {
let mut cmd = batuta_cmd();
cmd.arg("analyze")
.arg("--languages")
.arg(".")
.assert()
.success()
.stdout(predicate::str::contains("Analysis Results"))
.stdout(predicate::str::contains("Rust"));
}
#[test]
fn test_workflow_state_tracking() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("main.rs"), "fn main() { println!(\"test\"); }").unwrap();
let state_file = temp_dir.path().join(".batuta-state.json");
let mut cmd = batuta_cmd();
cmd.current_dir(temp_dir.path()).arg("analyze").arg("--languages").arg(".").assert().success();
assert!(state_file.exists(), "State file should be created");
let state_content = fs::read_to_string(&state_file).unwrap();
assert!(state_content.contains("Analysis"));
assert!(state_content.contains("Completed"));
}
#[test]
fn test_status_command() {
let mut cmd = batuta_cmd();
cmd.arg("status").assert().success().stdout(predicate::str::contains("Workflow Status"));
}
#[test]
fn test_report_generation_markdown() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
let test_file = src_dir.join("main.py");
fs::write(&test_file, "import numpy as np\nx = np.array([1, 2, 3])\n").unwrap();
batuta_cmd().arg("analyze").arg(&src_dir).current_dir(temp_dir.path()).assert().success();
let report_path = temp_dir.path().join("report.md");
let mut cmd = batuta_cmd();
cmd.arg("report")
.arg("--format")
.arg("markdown")
.arg("--output")
.arg(&report_path)
.current_dir(temp_dir.path())
.assert()
.success()
.stdout(predicate::str::contains("Report generated successfully"));
assert!(report_path.exists(), "Report file should be created");
let content = fs::read_to_string(&report_path).unwrap();
assert!(content.contains("# Migration Report"));
assert!(content.contains("## Summary"));
}
#[test]
fn test_report_generation_json() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
let test_file = src_dir.join("main.py");
fs::write(&test_file, "import numpy as np\nx = np.array([1, 2, 3])\n").unwrap();
batuta_cmd().arg("analyze").arg(&src_dir).current_dir(temp_dir.path()).assert().success();
let report_path = temp_dir.path().join("report.json");
let mut cmd = batuta_cmd();
cmd.arg("report")
.arg("--format")
.arg("json")
.arg("--output")
.arg(&report_path)
.current_dir(temp_dir.path())
.assert()
.success();
assert!(report_path.exists());
let content = fs::read_to_string(&report_path).unwrap();
let _: serde_json::Value = serde_json::from_str(&content).expect("Report should be valid JSON");
}
#[test]
fn test_report_generation_html() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
let test_file = src_dir.join("main.py");
fs::write(&test_file, "import numpy as np\nx = np.array([1, 2, 3])\n").unwrap();
batuta_cmd().arg("analyze").arg(&src_dir).current_dir(temp_dir.path()).assert().success();
let report_path = temp_dir.path().join("report.html");
batuta_cmd()
.arg("report")
.arg("--format")
.arg("html")
.arg("--output")
.arg(report_path.to_str().unwrap())
.current_dir(temp_dir.path())
.assert()
.success();
assert!(report_path.exists(), "Report file should exist at {:?}", report_path);
let content = fs::read_to_string(&report_path).unwrap();
assert!(content.contains("<!DOCTYPE html>"));
assert!(content.contains("<html"));
assert!(content.contains("Migration Report"));
}
#[test]
fn test_reset_workflow() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("lib.rs"), "pub fn test() {}").unwrap();
batuta_cmd().current_dir(temp_dir.path()).arg("analyze").arg(".").assert().success();
let mut cmd = batuta_cmd();
cmd.current_dir(temp_dir.path())
.arg("reset")
.arg("--yes")
.assert()
.success()
.stdout(predicate::str::contains("reset successfully"));
}
#[test]
fn test_help_command() {
let mut cmd = batuta_cmd();
cmd.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("orchestration"))
.stdout(predicate::str::contains("analyze"))
.stdout(predicate::str::contains("transpile"))
.stdout(predicate::str::contains("optimize"))
.stdout(predicate::str::contains("validate"))
.stdout(predicate::str::contains("build"));
}
#[test]
fn test_version_command() {
let mut cmd = batuta_cmd();
cmd.arg("--version").assert().success().stdout(predicate::str::contains("batuta"));
}
#[test]
fn test_renacer_validation() {
use batuta::pipeline::{PipelineContext, PipelineStage, ValidationStage};
use std::path::PathBuf;
use tokio::runtime::Runtime;
let temp_dir = TempDir::new().unwrap();
let ctx = PipelineContext::new(PathBuf::from(temp_dir.path()), PathBuf::from(temp_dir.path()));
let stage = ValidationStage::new(true, false);
let rt = Runtime::new().unwrap();
let result = rt.block_on(stage.execute(ctx));
assert!(result.is_ok(), "ValidationStage should handle missing binaries gracefully");
let final_ctx = result.unwrap();
assert!(
final_ctx.metadata.contains_key("validation_completed"),
"Validation should mark completion in metadata"
);
}
#[test]
fn test_init_command_default() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("main.py"), "print('hello')").unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("init")
.arg("--source")
.arg(".")
.assert()
.success()
.stdout(predicate::str::contains("Initializing Batuta project"))
.stdout(predicate::str::contains("Configuration Summary"));
let config_path = temp_dir.path().join("batuta.toml");
assert!(config_path.exists(), "batuta.toml should be created");
let config_content = fs::read_to_string(&config_path).unwrap();
assert!(config_content.contains("[project]"));
assert!(config_content.contains("[transpilation]"));
assert!(config_content.contains("[optimization]"));
}
#[test]
fn test_init_command_custom_output() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("test.rs"), "fn main() {}").unwrap();
let output_dir = temp_dir.path().join("custom-output");
batuta_cmd()
.current_dir(temp_dir.path())
.arg("init")
.arg("--source")
.arg(".")
.arg("--output")
.arg(&output_dir)
.assert()
.success();
assert!(output_dir.exists());
assert!(output_dir.join("src").exists());
let config_path = temp_dir.path().join("batuta.toml");
let config_content = fs::read_to_string(&config_path).unwrap();
assert!(config_content.contains("custom-output"));
}
#[test]
fn test_analyze_with_tdg() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("main.rs"), "fn main() { println!(\"test\"); }").unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("analyze")
.arg("--tdg")
.arg(".")
.assert()
.success()
.stdout(predicate::str::contains("TDG Score"));
}
#[test]
fn test_analyze_with_dependencies() {
let temp_dir = TempDir::new().unwrap();
fs::write(temp_dir.path().join("requirements.txt"), "numpy>=1.20.0\npandas\n").unwrap();
fs::write(temp_dir.path().join("main.py"), "import numpy\nimport pandas\n").unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("analyze")
.arg("--dependencies")
.arg(".")
.assert()
.success()
.stdout(predicate::str::contains("Dependencies"));
}
#[test]
fn test_analyze_with_all_flags() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("lib.rs"), "pub fn test() {}").unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("analyze")
.arg("--tdg")
.arg("--languages")
.arg("--dependencies")
.arg(".")
.assert()
.success()
.stdout(predicate::str::contains("Analysis Results"))
.stdout(predicate::str::contains("TDG Score"))
.stdout(predicate::str::contains("Language Detection"));
}
#[test]
fn test_analyze_nonexistent_path() {
batuta_cmd()
.arg("analyze")
.arg("--languages")
.arg("/nonexistent/path/that/does/not/exist")
.assert()
.failure();
}
#[test]
fn test_transpile_without_analysis() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("transpile")
.assert()
.success() .stdout(predicate::str::contains("Analysis phase not completed"));
}
#[test]
fn test_optimize_without_transpile() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("optimize")
.assert()
.code(1) .stderr(predicate::str::contains("Transpilation phase not completed"));
}
#[test]
fn test_validate_without_optimize() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("validate")
.assert()
.code(1) .stderr(predicate::str::contains("Optimization phase not completed"));
}
#[test]
fn test_build_without_validate() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("build")
.assert()
.code(1) .stderr(predicate::str::contains("Validation phase not completed"));
}
#[test]
fn test_optimize_profiles() {
let profiles = vec!["fast", "balanced", "aggressive"];
for profile in profiles {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("optimize")
.arg("--profile")
.arg(profile)
.assert()
.code(1)
.stdout(predicate::str::contains("Optimizing code"));
}
}
#[test]
fn test_optimize_with_gpu_simd() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("optimize")
.arg("--enable-gpu")
.arg("--enable-simd")
.arg("--gpu-threshold")
.arg("1000")
.assert()
.code(1)
.stdout(predicate::str::contains("Optimizing code"));
}
#[test]
fn test_validate_with_flags() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("validate")
.arg("--trace-syscalls")
.arg("--diff-output")
.arg("--run-original-tests")
.arg("--benchmark")
.assert()
.code(1)
.stdout(predicate::str::contains("Validating equivalence"));
}
#[test]
fn test_build_variants() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("build")
.arg("--release")
.assert()
.code(1)
.stdout(predicate::str::contains("Building Rust project"));
batuta_cmd()
.current_dir(temp_dir.path())
.arg("build")
.arg("--wasm")
.assert()
.code(1)
.stdout(predicate::str::contains("Building Rust project"));
batuta_cmd()
.current_dir(temp_dir.path())
.arg("build")
.arg("--target")
.arg("x86_64-unknown-linux-gnu")
.assert()
.code(1)
.stdout(predicate::str::contains("Building Rust project"));
}
#[test]
fn test_parf_command_basic() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("lib.rs"), "pub fn test_function() {}").unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("parf")
.arg("src")
.assert()
.success()
.stdout(predicate::str::contains("PARF Analysis"));
}
#[test]
fn test_parf_patterns() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("lib.rs"), "// TODO: implement this\npub fn test() {}").unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("parf")
.arg("src")
.arg("--patterns")
.assert()
.success()
.stdout(predicate::str::contains("Code Patterns Detected"));
}
#[test]
fn test_parf_dependencies() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("main.rs"), "mod lib;\nfn main() {}").unwrap();
fs::write(src_dir.join("lib.rs"), "pub fn test() {}").unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("parf")
.arg("src")
.arg("--dependencies")
.assert()
.success()
.stdout(predicate::str::contains("Dependencies"));
}
#[test]
fn test_parf_find_references() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("lib.rs"), "pub fn my_function() {}\nfn caller() { my_function(); }")
.unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("parf")
.arg("src")
.arg("--find")
.arg("my_function")
.assert()
.success()
.stdout(predicate::str::contains("References"));
}
#[test]
fn test_parf_output_formats() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("lib.rs"), "pub fn test() {}").unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("parf")
.arg("src")
.arg("--patterns")
.arg("--format")
.arg("json")
.assert()
.success();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("parf")
.arg("src")
.arg("--patterns")
.arg("--format")
.arg("markdown")
.assert()
.success();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("parf")
.arg("src")
.arg("--patterns")
.arg("--format")
.arg("text")
.assert()
.success();
}
#[test]
fn test_parf_output_file() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("lib.rs"), "pub fn test() {}").unwrap();
let output_file = temp_dir.path().join("parf-report.txt");
batuta_cmd()
.current_dir(temp_dir.path())
.arg("parf")
.arg("src")
.arg("--patterns")
.arg("--output")
.arg(&output_file)
.assert()
.success()
.stdout(predicate::str::contains("Report written to"));
assert!(output_file.exists(), "PARF report file should be created");
}
#[test]
fn test_verbose_flag() {
batuta_cmd().arg("--verbose").arg("status").assert().success();
}
#[test]
fn test_debug_flag() {
batuta_cmd().arg("--debug").arg("status").assert().success();
}
#[test]
fn test_report_generation_text() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
let test_file = src_dir.join("main.py");
fs::write(&test_file, "import numpy as np\nx = np.array([1, 2, 3])\n").unwrap();
batuta_cmd().arg("analyze").arg(&src_dir).current_dir(temp_dir.path()).assert().success();
let report_path = temp_dir.path().join("report.txt");
batuta_cmd()
.arg("report")
.arg("--format")
.arg("text")
.arg("--output")
.arg(&report_path)
.current_dir(temp_dir.path())
.assert()
.success();
assert!(report_path.exists());
let content = fs::read_to_string(&report_path).unwrap();
assert!(content.contains("MIGRATION REPORT"));
}
#[test]
fn test_transpile_missing_config() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("transpile")
.assert()
.success()
.stdout(predicate::str::contains("Transpiling code"));
}
#[test]
fn test_report_without_workflow() {
let temp_dir = TempDir::new().unwrap();
let report_path = temp_dir.path().join("report.html");
batuta_cmd()
.current_dir(temp_dir.path())
.arg("report")
.arg("--output")
.arg(&report_path)
.assert()
.code(1)
.stdout(predicate::str::contains("report"));
}
#[test]
fn test_reset_empty_workflow() {
let temp_dir = TempDir::new().unwrap();
batuta_cmd()
.current_dir(temp_dir.path())
.arg("reset")
.arg("--yes")
.assert()
.success()
.stdout(predicate::str::contains("No workflow state found"));
}
#[test]
fn test_stack_help() {
batuta_cmd()
.arg("stack")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("PAIML Stack dependency orchestration"))
.stdout(predicate::str::contains("check"))
.stdout(predicate::str::contains("release"))
.stdout(predicate::str::contains("status"))
.stdout(predicate::str::contains("sync"));
}
#[test]
fn test_stack_check_help() {
batuta_cmd()
.arg("stack")
.arg("check")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Check dependency health"))
.stdout(predicate::str::contains("--strict"))
.stdout(predicate::str::contains("--verify-published"))
.stdout(predicate::str::contains("--format"));
}
#[test]
fn test_stack_release_help() {
batuta_cmd()
.arg("stack")
.arg("release")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Prepare a stack release"))
.stdout(predicate::str::contains("--dry-run"))
.stdout(predicate::str::contains("--bump"))
.stdout(predicate::str::contains("--publish"));
}
#[test]
fn test_stack_status_help() {
batuta_cmd()
.arg("stack")
.arg("status")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Show stack status"))
.stdout(predicate::str::contains("--simple"))
.stdout(predicate::str::contains("--tree"));
}
#[test]
fn test_stack_sync_help() {
batuta_cmd()
.arg("stack")
.arg("sync")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Sync stack dependencies"))
.stdout(predicate::str::contains("--dry-run"))
.stdout(predicate::str::contains("--align"));
}
#[test]
fn test_stack_check_current_workspace() {
batuta_cmd()
.arg("stack")
.arg("check")
.assert()
.success()
.stdout(predicate::str::contains("PAIML Stack Health Check"));
}
#[test]
fn test_stack_release_no_crate() {
batuta_cmd()
.arg("stack")
.arg("release")
.arg("--dry-run")
.assert()
.success()
.stdout(predicate::str::contains("Specify a crate name or use --all"));
}
#[test]
fn test_stack_sync_no_crate() {
batuta_cmd()
.arg("stack")
.arg("sync")
.arg("--dry-run")
.assert()
.success()
.stdout(predicate::str::contains("Specify a crate name or use --all"));
}
#[test]
fn test_stack_check_json_format() {
batuta_cmd()
.arg("stack")
.arg("check")
.arg("--format")
.arg("json")
.assert()
.success()
.stdout(predicate::str::contains("\"timestamp\""))
.stdout(predicate::str::contains("\"summary\""));
}
#[test]
fn test_stack_status_tree() {
batuta_cmd()
.arg("stack")
.arg("status")
.arg("--tree")
.assert()
.success()
.stdout(predicate::str::contains("Dependency Tree"));
}
#[test]
fn test_sovereign_blake3_content_addressing() {
use blake3;
let model_data = b"transformer weights and biases";
let hash = blake3::hash(model_data);
let hash_hex = hash.to_hex().to_string();
assert_eq!(hash_hex.len(), 64);
let hash2 = blake3::hash(model_data);
assert_eq!(hash.as_bytes(), hash2.as_bytes());
let different_data = b"different model weights";
let different_hash = blake3::hash(different_data);
assert_ne!(hash.as_bytes(), different_hash.as_bytes());
}
#[test]
fn test_sovereign_ed25519_signatures() {
use pacha::signing::{sign_model, verify_model, SigningKey};
let model_data = b"model weights for signing";
let signing_key = SigningKey::generate();
let signature = sign_model(model_data, &signing_key).expect("Signing should succeed");
let verify_result = verify_model(model_data, &signature);
assert!(verify_result.is_ok(), "Signature should be valid");
let tampered_data = b"tampered model weights";
let tampered_verify_result = verify_model(tampered_data, &signature);
assert!(tampered_verify_result.is_err(), "Tampered data should fail verification");
}
#[test]
fn test_sovereign_chacha20_encryption() {
use pacha::crypto::{decrypt_model, encrypt_model, is_encrypted};
let model_data = b"sensitive model weights";
let passphrase = "secure-passphrase-123";
let encrypted = encrypt_model(model_data, passphrase).expect("Encryption should succeed");
assert_ne!(&encrypted[..], model_data);
assert!(is_encrypted(&encrypted), "Data should be marked as encrypted");
let decrypted = decrypt_model(&encrypted, passphrase).expect("Decryption should succeed");
assert_eq!(&decrypted[..], model_data, "Decrypted data should match original");
let wrong_passphrase = "wrong-passphrase";
let decrypt_result = decrypt_model(&encrypted, wrong_passphrase);
assert!(decrypt_result.is_err(), "Wrong passphrase should fail decryption");
}
#[test]
fn test_sovereign_privacy_tier_enforcement() {
use batuta::serve::{BackendSelector, PrivacyTier, ServingBackend};
let sovereign_selector = BackendSelector::new().with_privacy(PrivacyTier::Sovereign);
assert!(
sovereign_selector.is_valid(ServingBackend::Realizar),
"Realizar should be valid in Sovereign tier"
);
assert!(
sovereign_selector.is_valid(ServingBackend::Ollama),
"Ollama should be valid in Sovereign tier"
);
assert!(
sovereign_selector.is_valid(ServingBackend::LlamaCpp),
"LlamaCpp should be valid in Sovereign tier"
);
assert!(
!sovereign_selector.is_valid(ServingBackend::OpenAI),
"OpenAI should be BLOCKED in Sovereign tier"
);
assert!(
!sovereign_selector.is_valid(ServingBackend::Anthropic),
"Anthropic should be BLOCKED in Sovereign tier"
);
assert!(
!sovereign_selector.is_valid(ServingBackend::AzureOpenAI),
"AzureOpenAI should be BLOCKED in Sovereign tier"
);
}
#[test]
fn test_private_privacy_tier_enforcement() {
use batuta::serve::{BackendSelector, PrivacyTier, ServingBackend};
let private_selector = BackendSelector::new().with_privacy(PrivacyTier::Private);
assert!(
private_selector.is_valid(ServingBackend::Realizar),
"Realizar should be valid in Private tier"
);
assert!(
private_selector.is_valid(ServingBackend::AzureOpenAI),
"AzureOpenAI should be valid in Private tier"
);
assert!(
!private_selector.is_valid(ServingBackend::OpenAI),
"Public OpenAI should be BLOCKED in Private tier"
);
}
#[test]
fn test_sovereign_backend_poka_yoke() {
use batuta::serve::{BackendSelector, PrivacyTier, ServingBackend};
let selector = BackendSelector::new().with_privacy(PrivacyTier::Sovereign);
let openai_validation = selector.validate(ServingBackend::OpenAI);
assert!(openai_validation.is_err(), "OpenAI validation should return error in Sovereign tier");
let error_msg = openai_validation.unwrap_err().to_string();
assert!(
error_msg.contains("Tier") || error_msg.contains("tier") || error_msg.contains("privacy"),
"Error should mention tier violation"
);
let realizar_validation = selector.validate(ServingBackend::Realizar);
assert!(realizar_validation.is_ok(), "Realizar validation should succeed in Sovereign tier");
}
#[test]
fn test_sovereign_backend_recommendation() {
use batuta::serve::{BackendSelector, PrivacyTier};
let sovereign_selector = BackendSelector::new().with_privacy(PrivacyTier::Sovereign);
let recommendations = sovereign_selector.recommend();
assert!(!recommendations.is_empty(), "Should have backend recommendations");
for backend in &recommendations {
assert!(
sovereign_selector.is_valid(*backend),
"All recommendations should be valid for Sovereign tier"
);
}
}
#[test]
fn test_sovereign_full_workflow() {
use batuta::serve::{BackendSelector, PrivacyTier, ServingBackend};
use blake3;
use pacha::crypto::{decrypt_model, encrypt_model};
use pacha::signing::{sign_model, verify_model, SigningKey};
let model_data = b"production ML model weights";
let content_hash = blake3::hash(model_data);
assert_eq!(content_hash.to_hex().to_string().len(), 64);
let signing_key = SigningKey::generate();
let signature = sign_model(model_data, &signing_key).expect("Signing should succeed");
let passphrase = "distribution-key";
let encrypted = encrypt_model(model_data, passphrase).unwrap();
let received_encrypted = encrypted.clone();
let decrypted = decrypt_model(&received_encrypted, passphrase).unwrap();
assert_eq!(&decrypted[..], model_data);
let verify_result = verify_model(&decrypted, &signature);
assert!(verify_result.is_ok(), "Model should be authentic after decryption");
let received_hash = blake3::hash(&decrypted);
assert_eq!(
received_hash.as_bytes(),
content_hash.as_bytes(),
"Content hash should match after decryption"
);
let selector = BackendSelector::new().with_privacy(PrivacyTier::Sovereign);
let recommendations = selector.recommend();
assert!(!recommendations.is_empty());
let selected = recommendations[0];
assert!(
matches!(
selected,
ServingBackend::Realizar
| ServingBackend::Ollama
| ServingBackend::LlamaCpp
| ServingBackend::Llamafile
),
"Selected backend should be local in Sovereign mode"
);
}
#[test]
fn test_oracle_format_code_recipe() {
batuta_cmd()
.arg("oracle")
.arg("--recipe")
.arg("ml-random-forest")
.arg("--format")
.arg("code")
.assert()
.success()
.stdout(predicate::str::contains("use "));
}
#[test]
fn test_oracle_format_code_no_ansi() {
let output = batuta_cmd()
.arg("oracle")
.arg("--recipe")
.arg("ml-random-forest")
.arg("--format")
.arg("code")
.output()
.expect("failed to execute");
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(!stdout.contains('\x1b'), "Code output must not contain ANSI escape sequences");
}
#[test]
fn test_oracle_format_code_nl_query() {
batuta_cmd()
.arg("oracle")
.arg("Train a random forest classifier")
.arg("--format")
.arg("code")
.assert()
.success()
.stdout(predicate::str::contains("aprender"));
}
#[test]
fn test_oracle_format_code_no_code_exits_1() {
batuta_cmd().arg("oracle").arg("--list").arg("--format").arg("code").assert().code(1);
}