use std::collections::HashMap;
pub fn resolve_alias(name: &str, aliases: &HashMap<String, String>) -> String {
aliases
.get(name)
.cloned()
.unwrap_or_else(|| name.to_string())
}
pub fn resolve_identity(
name: &str,
roles: &HashMap<String, String>,
aliases: &HashMap<String, String>,
) -> String {
if let Some(resolved) = roles.get(name) {
return resolved.clone();
}
aliases
.get(name)
.cloned()
.unwrap_or_else(|| name.to_string())
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashMap;
fn make_aliases() -> HashMap<String, String> {
let mut m = HashMap::new();
m.insert("arch-atm".to_string(), "team-lead".to_string());
m.insert("dev".to_string(), "worker-1".to_string());
m
}
#[test]
fn test_resolve_alias_known_name() {
let aliases = make_aliases();
assert_eq!(resolve_alias("arch-atm", &aliases), "team-lead");
}
#[test]
fn test_resolve_alias_second_entry() {
let aliases = make_aliases();
assert_eq!(resolve_alias("dev", &aliases), "worker-1");
}
#[test]
fn test_resolve_alias_passthrough_unknown() {
let aliases = make_aliases();
assert_eq!(resolve_alias("team-lead", &aliases), "team-lead");
}
#[test]
fn test_resolve_alias_empty_map() {
let aliases = HashMap::new();
assert_eq!(resolve_alias("any-name", &aliases), "any-name");
}
#[test]
fn test_resolve_alias_case_sensitive() {
let aliases = make_aliases();
assert_eq!(resolve_alias("Arch-Atm", &aliases), "Arch-Atm");
assert_eq!(resolve_alias("ARCH-ATM", &aliases), "ARCH-ATM");
}
#[test]
fn test_resolve_alias_non_recursive() {
let mut aliases = HashMap::new();
aliases.insert("a".to_string(), "b".to_string());
aliases.insert("b".to_string(), "c".to_string());
assert_eq!(resolve_alias("a", &aliases), "b");
}
fn make_roles() -> HashMap<String, String> {
let mut m = HashMap::new();
m.insert("team-lead".to_string(), "arch-atm".to_string());
m
}
#[test]
fn test_resolve_identity_role_takes_precedence_over_alias() {
let mut roles = HashMap::new();
roles.insert("team-lead".to_string(), "arch-atm".to_string());
let mut aliases = HashMap::new();
aliases.insert("team-lead".to_string(), "other-identity".to_string());
assert_eq!(
resolve_identity("team-lead", &roles, &aliases),
"arch-atm",
"role should take precedence over alias for same key"
);
}
#[test]
fn test_resolve_identity_alias_used_when_no_role_matches() {
let roles = make_roles();
let aliases = make_aliases();
assert_eq!(resolve_identity("arch-atm", &roles, &aliases), "team-lead");
}
#[test]
fn test_resolve_identity_literal_fallback() {
let roles = make_roles();
let aliases = make_aliases();
assert_eq!(resolve_identity("unknown", &roles, &aliases), "unknown");
}
#[test]
fn test_resolve_identity_empty_maps_return_original() {
let roles: HashMap<String, String> = HashMap::new();
let aliases: HashMap<String, String> = HashMap::new();
assert_eq!(resolve_identity("any-name", &roles, &aliases), "any-name");
}
#[test]
fn test_resolve_identity_non_recursive() {
let mut roles = HashMap::new();
roles.insert("a".to_string(), "b".to_string());
let mut aliases = HashMap::new();
aliases.insert("b".to_string(), "c".to_string());
assert_eq!(resolve_identity("a", &roles, &aliases), "b");
}
#[test]
fn test_resolve_alias_empty_string_key() {
let mut aliases = HashMap::new();
aliases.insert(String::new(), "nobody".to_string());
assert_eq!(resolve_alias("", &aliases), "nobody");
}
}