tupa-cli 0.8.2

Command-line interface for TupaLang
use assert_cmd::Command;
use std::time::Instant;

fn repo_root() -> std::path::PathBuf {
    std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..")
}

fn run_e2e_enabled() -> bool {
    std::env::var("TUPA_RUN_E2E").as_deref() == Ok("1")
}

#[test]
fn run_fraud_detection_plan_only_and_run() {
    if !run_e2e_enabled() {
        eprintln!("skipping run_fraud_detection_plan_only_and_run (set TUPA_RUN_E2E=1)");
        return;
    }

    let root = repo_root();
    let mut gen = Command::new(env!("CARGO_BIN_EXE_tupa"));
    gen.current_dir(&root)
        .args([
            "codegen",
            "--plan-only",
            "examples/pipeline/fraud_complete.tp",
        ])
        .assert()
        .success();

    let mut run = Command::new(env!("CARGO_BIN_EXE_tupa"));
    run.current_dir(&root)
        .args([
            "run",
            "--plan",
            "fraud_complete.plan.json",
            "--pipeline",
            "FraudDetection",
            "--input",
            "examples/pipeline/tx.json",
        ])
        .assert()
        .success()
        .stdout(predicates::str::contains("\"status\": \"pass\""));
}

#[test]
fn run_credit_decision_report_contains_approved() {
    if !run_e2e_enabled() {
        eprintln!("skipping run_credit_decision_report_contains_approved (set TUPA_RUN_E2E=1)");
        return;
    }

    let root = repo_root();
    let tmp_path = root.join("tmp_input_i64.json");
    std::fs::write(&tmp_path, "100").unwrap();

    let mut run = Command::new(env!("CARGO_BIN_EXE_tupa"));
    run.current_dir(&root)
        .args([
            "run",
            "--pipeline",
            "CreditDecision",
            "--input",
            tmp_path.to_str().unwrap(),
            "examples/pipeline/credit_decision.tp",
        ])
        .assert()
        .success()
        .stdout(predicates::str::contains("\"status\": \"pass\""));

    let _ = std::fs::remove_file(&tmp_path);
}

#[test]
fn perf_codegen_fraud_medium_under_target() {
    let root = repo_root();
    let start = Instant::now();
    let mut gen = Command::new(env!("CARGO_BIN_EXE_tupa"));
    gen.current_dir(&root)
        .args(["codegen", "examples/pipeline/fraud_complete.tp"])
        .assert()
        .success();

    let elapsed = start.elapsed();
    println!(
        "perf: codegen fraud_complete took {} ms",
        elapsed.as_millis()
    );
    assert!(
        elapsed.as_millis() <= 500,
        "codegen took {} ms (> 500ms threshold)",
        elapsed.as_millis()
    );
}

#[test]
#[ignore]
fn perf_run_fraud_medium_under_target() {
    let root = repo_root();
    let start = Instant::now();
    let mut run = Command::new(env!("CARGO_BIN_EXE_tupa"));
    run.current_dir(&root)
        .args([
            "run",
            "--pipeline",
            "FraudDetection",
            "--input",
            "examples/pipeline/tx.json",
            "examples/pipeline/fraud_complete.tp",
        ])
        .assert()
        .success();

    let elapsed = start.elapsed();
    println!("perf: run fraud_complete took {} ms", elapsed.as_millis());
    assert!(
        elapsed.as_millis() <= 500,
        "run took {} ms (> 500ms threshold)",
        elapsed.as_millis()
    );
}