use std::collections::HashMap;
use std::time::Duration;
#[derive(Clone)]
pub struct ElectricityMapsConfig {
pub api_endpoint: String,
pub auth_token: String,
pub poll_interval: Duration,
pub region_map: HashMap<String, String>,
}
impl std::fmt::Debug for ElectricityMapsConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ElectricityMapsConfig")
.field("api_endpoint", &self.api_endpoint)
.field("auth_token", &"[REDACTED]")
.field("poll_interval", &self.poll_interval)
.field("region_map", &self.region_map)
.finish()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn sample_config() -> ElectricityMapsConfig {
let mut region_map = HashMap::new();
region_map.insert("eu-west-3".to_string(), "FR".to_string());
region_map.insert("us-east-1".to_string(), "US-MIDA-PJM".to_string());
ElectricityMapsConfig {
api_endpoint: "https://api.electricitymap.org/v3".to_string(),
auth_token: "super-secret-token-do-not-log".to_string(),
poll_interval: Duration::from_secs(300),
region_map,
}
}
#[test]
fn debug_impl_redacts_auth_token() {
let cfg = sample_config();
let debug_output = format!("{cfg:?}");
assert!(
!debug_output.contains("super-secret-token-do-not-log"),
"auth token must not appear in Debug output: {debug_output}"
);
assert!(
debug_output.contains("[REDACTED]"),
"Debug output should mention [REDACTED]: {debug_output}"
);
}
#[test]
fn debug_impl_preserves_non_secret_fields() {
let cfg = sample_config();
let debug_output = format!("{cfg:?}");
assert!(debug_output.contains("api_endpoint"));
assert!(debug_output.contains("https://api.electricitymap.org/v3"));
assert!(debug_output.contains("poll_interval"));
assert!(debug_output.contains("region_map"));
assert!(debug_output.contains("eu-west-3"));
assert!(debug_output.contains("FR"));
}
#[test]
fn clone_preserves_all_fields() {
let cfg = sample_config();
let cloned = cfg.clone();
assert_eq!(cfg.api_endpoint, cloned.api_endpoint);
assert_eq!(cfg.auth_token, cloned.auth_token);
assert_eq!(cfg.poll_interval, cloned.poll_interval);
assert_eq!(cfg.region_map, cloned.region_map);
}
}