grafatui 0.1.11

A Grafana-like TUI for Prometheus
use std::fs;
use std::path::PathBuf;
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};

fn write_dashboard(name: &str, json: &str) -> PathBuf {
    let stamp = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_nanos();
    let path = std::env::temp_dir().join(format!("grafatui-{name}-{stamp}.json"));
    fs::write(&path, json).unwrap();
    path
}

#[test]
fn validate_strict_exits_nonzero_when_warnings_exist() {
    let path = write_dashboard(
        "strict",
        r#"{
            "title": "Warnings",
            "panels": [
                { "type": "text", "title": "Notes" }
            ]
        }"#,
    );

    let output = Command::new(env!("CARGO_BIN_EXE_grafatui"))
        .args(["--validate", "--strict", "--grafana-json"])
        .arg(&path)
        .output()
        .unwrap();
    fs::remove_file(path).unwrap();

    assert!(!output.status.success());
    let stderr = String::from_utf8(output.stderr).unwrap();
    assert!(stderr.contains("warning[grafana.import.skipped_panel]"));
    assert!(stderr.contains("validation failed with 1 warning(s)"));
}

#[test]
fn validate_json_outputs_machine_readable_summary() {
    let path = write_dashboard(
        "json",
        r#"{
            "title": "JSON Warnings",
            "panels": [
                { "type": "text", "title": "Notes" },
                {
                    "type": "timeseries",
                    "title": "CPU",
                    "targets": [
                        { "expr": "helper_query", "hide": true },
                        { "expr": "visible_query" }
                    ]
                }
            ]
        }"#,
    );

    let output = Command::new(env!("CARGO_BIN_EXE_grafatui"))
        .args(["--validate", "--format", "json", "--grafana-json"])
        .arg(&path)
        .output()
        .unwrap();
    fs::remove_file(path).unwrap();

    assert!(output.status.success());
    assert!(output.stderr.is_empty());

    let stdout = String::from_utf8(output.stdout).unwrap();
    let summary: serde_json::Value = serde_json::from_str(&stdout).unwrap();
    assert_eq!(summary["title"], "JSON Warnings");
    assert_eq!(summary["panel_count"], 1);
    assert_eq!(summary["diagnostics"][0]["code"], "skipped_panel");
    assert_eq!(summary["diagnostics"].as_array().unwrap().len(), 1);
}