From 9340f25aa58e8f7fe745978024fb8e1a0eb4f800 Mon Sep 17 00:00:00 2001 From: Bortlesboat Date: Thu, 5 Mar 2026 07:43:40 -0500 Subject: [PATCH] test: add coverage for helper dispatch and service alias resolution - Add tests for get_helper() in helpers/mod.rs: all known services, unknown services, case sensitivity, script alias, helper_only default - Add tests for resolve_service() edge cases: all aliases exhaustively, case sensitivity, empty string, error message content, duplicate alias detection --- .changeset/test-helper-service-coverage.md | 5 +++ src/helpers/mod.rs | 49 +++++++++++++++++++++ src/services.rs | 51 ++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 .changeset/test-helper-service-coverage.md diff --git a/.changeset/test-helper-service-coverage.md b/.changeset/test-helper-service-coverage.md new file mode 100644 index 0000000..64f023d --- /dev/null +++ b/.changeset/test-helper-service-coverage.md @@ -0,0 +1,5 @@ +--- +"@googleworkspace/cli": patch +--- + +Add tests for helper module dispatch and service alias resolution edge cases diff --git a/src/helpers/mod.rs b/src/helpers/mod.rs index 378f1ea..a8c7f33 100644 --- a/src/helpers/mod.rs +++ b/src/helpers/mod.rs @@ -63,3 +63,52 @@ pub fn get_helper(service: &str) -> Option> { _ => None, } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_helper_known_services() { + let known = [ + "gmail", + "sheets", + "docs", + "chat", + "drive", + "calendar", + "script", + "apps-script", + "workspaceevents", + "modelarmor", + "workflow", + ]; + for service in known { + assert!( + get_helper(service).is_some(), + "expected helper for '{service}'" + ); + } + } + + #[test] + fn test_get_helper_unknown_returns_none() { + assert!(get_helper("unknown").is_none()); + assert!(get_helper("").is_none()); + assert!(get_helper("Gmail").is_none()); // case-sensitive + } + + #[test] + fn test_get_helper_script_alias() { + // Both "script" and "apps-script" should return a helper + assert!(get_helper("script").is_some()); + assert!(get_helper("apps-script").is_some()); + } + + #[test] + fn test_helper_default_not_helper_only() { + // Default implementation of helper_only() should return false + let helper = get_helper("gmail").unwrap(); + assert!(!helper.helper_only()); + } +} diff --git a/src/services.rs b/src/services.rs index 067831c..273e44a 100644 --- a/src/services.rs +++ b/src/services.rs @@ -214,6 +214,19 @@ mod tests { ); } + #[test] + fn test_resolve_service_all_aliases() { + // Verify every alias in SERVICES resolves correctly + for entry in SERVICES { + for alias in entry.aliases { + let (api_name, version) = resolve_service(alias) + .unwrap_or_else(|_| panic!("alias '{}' should resolve", alias)); + assert_eq!(api_name, entry.api_name, "alias '{}' wrong api_name", alias); + assert_eq!(version, entry.version, "alias '{}' wrong version", alias); + } + } + } + #[test] fn test_resolve_service_unknown() { let err = resolve_service("unknown_service"); @@ -223,4 +236,42 @@ mod tests { _ => panic!("Expected Validation error"), } } + + #[test] + fn test_resolve_service_case_sensitive() { + // Service names should be case-sensitive + assert!(resolve_service("Drive").is_err()); + assert!(resolve_service("GMAIL").is_err()); + } + + #[test] + fn test_resolve_service_empty_string() { + assert!(resolve_service("").is_err()); + } + + #[test] + fn test_resolve_service_error_lists_known_services() { + let err = resolve_service("nonexistent"); + match err.unwrap_err() { + GwsError::Validation(msg) => { + assert!(msg.contains("drive"), "error should list 'drive': {msg}"); + assert!(msg.contains("gmail"), "error should list 'gmail': {msg}"); + } + _ => panic!("Expected Validation error"), + } + } + + #[test] + fn test_no_duplicate_aliases() { + let mut seen = std::collections::HashSet::new(); + for entry in SERVICES { + for alias in entry.aliases { + assert!( + seen.insert(*alias), + "duplicate alias '{}' found in SERVICES", + alias + ); + } + } + } }