alopex-cli 0.6.0

Command-line interface for Alopex DB
use std::fs;

use alopex_cli::batch::{BatchMode, BatchModeSource};
use alopex_cli::cli::{LifecycleCommand, OutputFormat};
use alopex_cli::output::formatter::create_formatter;
use alopex_cli::tui::admin::actions::{
    execute_local_action, AdminAction, AdminCommand, AdminRequest,
};
use alopex_cli::tui::admin::write_non_tty_fallback;
use alopex_cli::ui::mode::UiMode;
use alopex_embedded::Database;
use tempfile::tempdir;

#[cfg_attr(not(feature = "lane_ci"), ignore)]
#[test]
fn admin_non_tty_fallback_uses_formatter() {
    let mut output = Vec::new();
    write_non_tty_fallback(&mut output, OutputFormat::Json).expect("fallback output");
    let value: serde_json::Value = serde_json::from_slice(&output).expect("json");
    let rows = value.as_array().expect("array");
    assert_eq!(rows.len(), 1);
    let row = rows[0].as_object().expect("row object");
    assert_eq!(row.get("Status").and_then(|v| v.as_str()), Some("Error"));
    let message = row
        .get("Message")
        .and_then(|v| v.as_str())
        .unwrap_or_default();
    assert!(message.contains("Admin UI is unavailable without a TTY."));
}

#[cfg_attr(not(feature = "lane_ci"), ignore)]
#[test]
fn admin_dispatches_lifecycle_archive() {
    let temp = tempdir().expect("tempdir");
    let data_dir = temp.path();
    fs::write(data_dir.join("data.txt"), "payload").expect("seed data");

    let db = Database::open_in_memory().expect("db");
    let batch_mode = BatchMode {
        is_batch: true,
        is_tty: false,
        source: BatchModeSource::Explicit,
    };
    let request = AdminRequest {
        action: AdminAction::Archive,
        command: AdminCommand::Lifecycle(LifecycleCommand::Archive),
        limit: None,
        quiet: false,
        ui_mode: UiMode::Batch,
        connection_label: "local".to_string(),
        output: OutputFormat::Json,
        data_dir: Some(data_dir.to_path_buf()),
    };
    let mut output = Vec::new();
    let formatter = create_formatter(OutputFormat::Json);
    execute_local_action(&db, &batch_mode, request, &mut output, formatter).expect("archive");

    assert!(data_dir.join(".lifecycle/archive/latest").exists());
}