diff --git a/cli/src/cli.rs b/cli/src/cli.rs index 75a2e17d..1bf6f587 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -8,7 +8,7 @@ const HELP_TEMPLATE: &'static str = r#" {all-args}{after-help} "#; -#[derive(Parser)] +#[derive(Parser, Debug)] #[command(author, version, about, long_about=None, disable_help_flag=true, help_template=HELP_TEMPLATE)] pub struct Cli { #[arg( @@ -43,3 +43,66 @@ pub struct Cli { #[arg(long, help="Print help information", action=ArgAction::Help)] pub help: Option, } + +#[cfg(test)] +mod tests { + use crate::cli::Cli; + use clap::error::ErrorKind; + use clap::Parser; + + #[test] + fn test_no_user_args_picks_default_values() { + let args = vec!["skysh"]; + let cli: Cli = Cli::parse_from(args.into_iter()); + assert_eq!(cli.host, "127.0.0.1"); + assert_eq!(cli.port, 2003); + assert_eq!(cli.expressions, None); + assert_eq!(cli.ssl_cert, None); + } + + #[test] + fn test_invalid_arg_fails_validation() { + let args = vec!["skysh", "-p", "asd"]; + let cli_result: Result = Cli::try_parse_from(args.into_iter()); + + assert!(cli_result.is_err()); + assert_eq!(cli_result.unwrap_err().kind(), ErrorKind::ValueValidation); + + let args = vec!["skysh", "-h", "-1"]; + let cli_result: Result = Cli::try_parse_from(args.into_iter()); + + assert!(cli_result.is_err()); + assert_eq!(cli_result.unwrap_err().kind(), ErrorKind::UnknownArgument); + } + + #[test] + fn test_arg_override_works_as_expected() { + let args = vec![ + "skysh", + "-p", + "666", + "-h", + "devil", + "--sslcert", + "/tmp/mycert.pem", + "-e", + "SET X 100", + "GET X", + "UPDATE X 42", + ]; + let cli: Cli = Cli::parse_from(args.into_iter()); + + assert_eq!(cli.host, "devil"); + assert_eq!(cli.port, 666); + assert_eq!(cli.ssl_cert, Some("/tmp/mycert.pem".into())); + assert_eq!( + cli.expressions, + Some(vec![ + "SET X 100".into(), + "GET X".into(), + "UPDATE X 42".into() + ]) + ) + } + +}