1pub mod detector;
2pub mod exit_code;
3
4#[allow(unused_imports)]
5pub use detector::{BatchMode, BatchModeSource};
6#[allow(unused_imports)]
7pub use exit_code::{
8 ClusterManagementOutcome, DistributedReadOutcome, ExitCode, ExitCodeCollector,
9};
10
11#[cfg(test)]
12mod tests {
13 use super::*;
14 use clap::Parser;
15
16 use crate::cli::Cli;
17
18 fn parse_cli(args: &[&str]) -> Cli {
19 Cli::try_parse_from(args).expect("cli parse")
20 }
21
22 #[test]
23 fn detect_batch_mode_sources() {
24 let base = parse_cli(&["alopex", "kv", "list"]);
25 let explicit_cli = parse_cli(&["alopex", "--batch", "kv", "list"]);
26
27 let explicit = BatchMode::detect_with(&explicit_cli, true, Some("batch"));
28 let env = BatchMode::detect_with(&base, true, Some("batch"));
29 let pipe = BatchMode::detect_with(&base, false, None);
30 let default = BatchMode::detect_with(&base, true, None);
31
32 assert_eq!(explicit.source, BatchModeSource::Explicit);
33 assert_eq!(env.source, BatchModeSource::Environment);
34 assert_eq!(pipe.source, BatchModeSource::PipeDetected);
35 assert_eq!(default.source, BatchModeSource::Default);
36 }
37
38 #[test]
39 fn should_prompt_requires_destructive_action() {
40 let cli = parse_cli(&["alopex", "kv", "list"]);
41 let mode = BatchMode {
42 is_batch: false,
43 is_tty: true,
44 source: BatchModeSource::Default,
45 };
46
47 assert!(mode.should_prompt(&cli, true));
48 assert!(!mode.should_prompt(&cli, false));
49 }
50
51 #[test]
52 fn exit_code_collector_reports_warning_on_mixed_results() {
53 let mut collector = ExitCodeCollector::new();
54 collector.record_success();
55 collector.record_error();
56
57 assert_eq!(collector.finalize(), ExitCode::Warning);
58 }
59}