alopex-cli 0.6.0

Command-line interface for Alopex DB
pub mod detector;
pub mod exit_code;

#[allow(unused_imports)]
pub use detector::{BatchMode, BatchModeSource};
#[allow(unused_imports)]
pub use exit_code::{ExitCode, ExitCodeCollector};

#[cfg(test)]
mod tests {
    use super::*;
    use clap::Parser;

    use crate::cli::Cli;

    fn parse_cli(args: &[&str]) -> Cli {
        Cli::try_parse_from(args).expect("cli parse")
    }

    #[test]
    fn detect_batch_mode_sources() {
        let base = parse_cli(&["alopex", "kv", "list"]);
        let explicit_cli = parse_cli(&["alopex", "--batch", "kv", "list"]);

        let explicit = BatchMode::detect_with(&explicit_cli, true, Some("batch"));
        let env = BatchMode::detect_with(&base, true, Some("batch"));
        let pipe = BatchMode::detect_with(&base, false, None);
        let default = BatchMode::detect_with(&base, true, None);

        assert_eq!(explicit.source, BatchModeSource::Explicit);
        assert_eq!(env.source, BatchModeSource::Environment);
        assert_eq!(pipe.source, BatchModeSource::PipeDetected);
        assert_eq!(default.source, BatchModeSource::Default);
    }

    #[test]
    fn should_prompt_requires_destructive_action() {
        let cli = parse_cli(&["alopex", "kv", "list"]);
        let mode = BatchMode {
            is_batch: false,
            is_tty: true,
            source: BatchModeSource::Default,
        };

        assert!(mode.should_prompt(&cli, true));
        assert!(!mode.should_prompt(&cli, false));
    }

    #[test]
    fn exit_code_collector_reports_warning_on_mixed_results() {
        let mut collector = ExitCodeCollector::new();
        collector.record_success();
        collector.record_error();

        assert_eq!(collector.finalize(), ExitCode::Warning);
    }
}