Added unit tests

This commit is contained in:
2025-09-09 17:52:07 -06:00
parent 82e2e33608
commit 3bb9055f80
6 changed files with 305 additions and 2 deletions
Generated
+78
View File
@@ -536,6 +536,12 @@ dependencies = [
"litrs", "litrs",
] ]
[[package]]
name = "downcast"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
[[package]] [[package]]
name = "dyn-clone" name = "dyn-clone"
version = "1.0.20" version = "1.0.20"
@@ -591,6 +597,12 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "fragile"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619"
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.7" version = "0.14.7"
@@ -651,6 +663,7 @@ dependencies = [
"indoc", "indoc",
"log", "log",
"log4rs", "log4rs",
"mockall",
"rpassword", "rpassword",
"secrecy", "secrecy",
"serde", "serde",
@@ -903,6 +916,12 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.175" version = "0.2.175"
@@ -1024,6 +1043,33 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6" checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6"
[[package]]
name = "mockall"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48"
dependencies = [
"cfg-if",
"downcast",
"fragile",
"lazy_static",
"mockall_derive",
"predicates",
"predicates-tree",
]
[[package]]
name = "mockall_derive"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2"
dependencies = [
"cfg-if",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "num-conv" name = "num-conv"
version = "0.1.0" version = "0.1.0"
@@ -1181,6 +1227,32 @@ dependencies = [
"zerocopy", "zerocopy",
] ]
[[package]]
name = "predicates"
version = "3.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573"
dependencies = [
"anstyle",
"predicates-core",
]
[[package]]
name = "predicates-core"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa"
[[package]]
name = "predicates-tree"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c"
dependencies = [
"predicates-core",
"termtree",
]
[[package]] [[package]]
name = "proc-macro-error-attr2" name = "proc-macro-error-attr2"
version = "2.0.0" version = "2.0.0"
@@ -1641,6 +1713,12 @@ dependencies = [
"windows-sys 0.60.2", "windows-sys 0.60.2",
] ]
[[package]]
name = "termtree"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683"
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.16" version = "2.0.16"
+11
View File
@@ -40,10 +40,21 @@ dialoguer = "0.12.0"
chrono = "0.4.42" chrono = "0.4.42"
indoc = "2.0.6" indoc = "2.0.6"
[dev-dependencies]
mockall = "0.12.1"
[[bin]] [[bin]]
bench = false bench = false
name = "gman" name = "gman"
[[test]]
name = "mod_tests"
path = "tests/providers/mod_tests.rs"
[[test]]
name = "local_tests"
path = "tests/providers/local_tests.rs"
[profile.release] [profile.release]
lto = true lto = true
strip = true strip = true
+2 -2
View File
@@ -7,7 +7,7 @@ use std::borrow::Cow;
use std::path::PathBuf; use std::path::PathBuf;
use validator::{Validate, ValidationError}; use validator::{Validate, ValidationError};
#[derive(Debug, Clone, Validate, Serialize, Deserialize)] #[derive(Debug, Clone, Validate, Serialize, Deserialize, PartialEq, Eq)]
#[validate(schema(function = "flags_or_none", skip_on_field_errors = false))] #[validate(schema(function = "flags_or_none", skip_on_field_errors = false))]
pub struct RunConfig { pub struct RunConfig {
#[validate(required)] #[validate(required)]
@@ -51,7 +51,7 @@ fn flags_or_none(run_config: &RunConfig) -> Result<(), ValidationError> {
} }
#[serde_as] #[serde_as]
#[derive(Debug, Clone, Validate, Serialize, Deserialize)] #[derive(Debug, Clone, Validate, Serialize, Deserialize, PartialEq, Eq)]
pub struct Config { pub struct Config {
#[serde_as(as = "DisplayFromStr")] #[serde_as(as = "DisplayFromStr")]
pub provider: SupportedProvider, pub provider: SupportedProvider,
+166
View File
@@ -0,0 +1,166 @@
#[cfg(test)]
mod tests {
use gman::config::{Config, RunConfig};
use gman::providers::local::LocalProvider;
use gman::providers::SupportedProvider;
use validator::Validate;
#[test]
fn test_run_config_valid() {
let run_config = RunConfig {
name: Some("test".to_string()),
secrets: Some(vec!["secret1".to_string()]),
flag: None,
flag_position: None,
arg_format: None,
};
assert!(run_config.validate().is_ok());
}
#[test]
fn test_run_config_missing_name() {
let run_config = RunConfig {
name: None,
secrets: Some(vec!["secret1".to_string()]),
flag: None,
flag_position: None,
arg_format: None,
};
assert!(run_config.validate().is_err());
}
#[test]
fn test_run_config_missing_secrets() {
let run_config = RunConfig {
name: Some("test".to_string()),
secrets: None,
flag: None,
flag_position: None,
arg_format: None,
};
assert!(run_config.validate().is_err());
}
#[test]
fn test_run_config_invalid_flag_position() {
let run_config = RunConfig {
name: Some("test".to_string()),
secrets: Some(vec!["secret1".to_string()]),
flag: Some("--test-flag".to_string()),
flag_position: Some(0),
arg_format: Some("{key}={value}".to_string()),
};
assert!(run_config.validate().is_err());
}
#[test]
fn test_run_config_flags_or_none_all_some() {
let run_config = RunConfig {
name: Some("test".to_string()),
secrets: Some(vec!["secret1".to_string()]),
flag: Some("--test-flag".to_string()),
flag_position: Some(1),
arg_format: Some("{key}={value}".to_string()),
};
assert!(run_config.validate().is_ok());
}
#[test]
fn test_run_config_flags_or_none_all_none() {
let run_config = RunConfig {
name: Some("test".to_string()),
secrets: Some(vec!["secret1".to_string()]),
flag: None,
flag_position: None,
arg_format: None,
};
assert!(run_config.validate().is_ok());
}
#[test]
fn test_run_config_flags_or_none_partial_some() {
let run_config = RunConfig {
name: Some("test".to_string()),
secrets: Some(vec!["secret1".to_string()]),
flag: Some("--test-flag".to_string()),
flag_position: None,
arg_format: None,
};
assert!(run_config.validate().is_err());
}
#[test]
fn test_run_config_flags_or_none_missing_placeholder() {
let run_config = RunConfig {
name: Some("test".to_string()),
secrets: Some(vec!["secret1".to_string()]),
flag: Some("--test-flag".to_string()),
flag_position: Some(1),
arg_format: Some("key=value".to_string()),
};
assert!(run_config.validate().is_err());
}
#[test]
fn test_config_valid() {
let config = Config {
provider: SupportedProvider::Local(LocalProvider),
password_file: None,
git_branch: None,
git_remote_url: None,
git_user_name: None,
git_user_email: Some("test@example.com".to_string()),
git_executable: None,
run_configs: None,
};
assert!(config.validate().is_ok());
}
#[test]
fn test_config_invalid_email() {
let config = Config {
provider: SupportedProvider::Local(LocalProvider),
password_file: None,
git_branch: None,
git_remote_url: None,
git_user_name: None,
git_user_email: Some("test".to_string()),
git_executable: None,
run_configs: None,
};
assert!(config.validate().is_err());
}
#[test]
fn test_config_default() {
let config = Config::default();
assert_eq!(
config.provider,
SupportedProvider::Local(LocalProvider)
);
assert_eq!(config.git_branch, Some("main".to_string()));
}
#[test]
fn test_config_extract_provider() {
let config = Config::default();
let provider = config.extract_provider();
assert_eq!(provider.name(), "LocalProvider");
}
#[test]
fn test_config_local_provider_password_file() {
let path = Config::local_provider_password_file();
let expected_path = dirs::home_dir().map(|p| p.join(".gman_password"));
if let Some(p) = &expected_path {
if !p.exists() {
assert_eq!(path, None);
} else {
assert_eq!(path, expected_path);
}
} else {
assert_eq!(path, None);
}
}
}
+12
View File
@@ -0,0 +1,12 @@
use gman::providers::local::LocalProviderConfig;
#[test]
fn test_local_provider_config_default() {
let config = LocalProviderConfig::default();
let expected_path = dirs::home_dir()
.map(|p| p.join(".gman_vault"))
.and_then(|p| p.to_str().map(|s| s.to_string()))
.unwrap_or_else(|| ".gman_vault".into());
assert_eq!(config.vault_path, expected_path);
}
+36
View File
@@ -0,0 +1,36 @@
use gman::providers::{ParseProviderError, SupportedProvider};
use gman::providers::local::LocalProvider;
use std::str::FromStr;
#[test]
fn test_supported_provider_from_str_valid() {
assert_eq!(
SupportedProvider::from_str("local").unwrap(),
SupportedProvider::Local(LocalProvider)
);
assert_eq!(
SupportedProvider::from_str("LOCAL").unwrap(),
SupportedProvider::Local(LocalProvider)
);
}
#[test]
fn test_supported_provider_from_str_invalid() {
let err = SupportedProvider::from_str("invalid").unwrap_err();
assert_eq!(
err.to_string(),
"unsupported provider 'invalid'"
);
}
#[test]
fn test_supported_provider_display() {
let provider = SupportedProvider::Local(LocalProvider);
assert_eq!(provider.to_string(), "local");
}
#[test]
fn test_parse_provider_error_display() {
let err = ParseProviderError::Unsupported("test".to_string());
assert_eq!(err.to_string(), "unsupported provider 'test'");
}