diff --git a/src/cli.rs b/src/cli.rs index 722023f..efc0d13 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,6 +1,6 @@ use clap::Parser; -#[derive(Debug, Parser)] +#[derive(Debug, PartialEq, Parser)] #[command(name = "onx")] #[command(version)] #[command(about)] diff --git a/src/lib.rs b/src/lib.rs index d2e8b59..fe87acc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -56,3 +56,74 @@ pub fn render_cli_error(err: &CliError, pretty: bool) -> String { render_error(err, pretty) .unwrap_or_else(|_| "{\"error\":{\"code\":1,\"message\":\"Unexpected error.\"}}".to_string()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_cli_from_when_called_with_valid_program_name_it_should_return_cli() { + let result = parse_cli_from(["test"]); + + assert_eq!( + result, + Ok(Cli { + api_key: None, + base_url: None, + pretty: false + }) + ); + } + + #[test] + fn parse_cli_from_when_called_with_unknown_flag_it_should_return_usage_error() { + let result = parse_cli_from(["test", "--bogus"]); + + assert!(result.is_err()); + assert_eq!(result.as_ref().unwrap_err().code, 2); + assert!( + result + .as_ref() + .unwrap_err() + .message + .contains("unexpected argument") + ); + } + + #[test] + fn parse_cli_from_when_called_with_help_flag_it_should_return_info_with_code_0() { + let result = parse_cli_from(["test", "--help"]); + + let err = result.unwrap_err(); + + assert_eq!(err.code, 0); + assert!(err.message.contains(env!("CARGO_PKG_DESCRIPTION"))); + } + + #[test] + fn parse_cli_from_when_called_with_version_flag_it_should_return_info_with_code_0() { + let result = parse_cli_from(["test", "--version"]); + + let err = result.unwrap_err(); + + assert_eq!(err.code, 0); + assert!(err.message.contains(env!("CARGO_PKG_NAME"))); + assert!(err.message.contains(env!("CARGO_PKG_VERSION"))); + } + + #[test] + fn render_cli_error_when_called_with_error_it_should_render_json() { + let error = CliError { + code: 1, + message: String::from("Something went wrong"), + }; + + let result = render_cli_error(&error, false); + + assert_eq!( + result, + r#"{"error":{"code":1,"message":"Something went wrong"}}"# + ); + } +} + diff --git a/src/output.rs b/src/output.rs index 67497ae..20fa183 100644 --- a/src/output.rs +++ b/src/output.rs @@ -31,3 +31,49 @@ pub fn render_error(err: &CliError, pretty: bool) -> CliResult { render_json(&envelope, pretty) } + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + + #[test] + fn render_json_when_called_without_pretty_it_should_print_value() { + let data = json!({ + "name": "Stevan", + }); + + let result = render_json(&data, false); + + let expected = Ok(String::from(r#"{"name":"Stevan"}"#)); + assert_eq!(result, expected); + } + + #[test] + fn render_json_when_called_with_pretty_it_should_pretty_print_value() { + let data = json!({ + "name": "Stevan", + }); + + let result = render_json(&data, true); + + let expected = Ok(String::from("{\n \"name\": \"Stevan\"\n}")); + assert_eq!(result, expected); + } + + #[test] + fn render_error_when_called_with_error_it_should_render_properly() { + let error = CliError { + code: 1, + message: String::from("This is a test"), + }; + + let result = render_error(&error, false); + + let expected = Ok(String::from( + r#"{"error":{"code":1,"message":"This is a test"}}"#, + )); + assert_eq!(result, expected); + } +} +