Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/test-helper-service-coverage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@googleworkspace/cli": patch
---

Add tests for helper module dispatch and service alias resolution edge cases
49 changes: 49 additions & 0 deletions src/helpers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,52 @@ pub fn get_helper(service: &str) -> Option<Box<dyn Helper>> {
_ => 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());
}
}
51 changes: 51 additions & 0 deletions src/services.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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
);
}
}
}
}
Loading