#[cfg(test)]
mod tests {
use crate::FoxyLoader;
use crate::config::{ConfigProvider, ConfigError};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug)]
struct MockConfigProvider {
values: HashMap<String, Value>,
}
impl MockConfigProvider {
fn new() -> Self {
let mut values = HashMap::new();
values.insert("server.port".to_string(), serde_json::json!(8080));
values.insert("server.host".to_string(), serde_json::json!("127.0.0.1"));
Self { values }
}
}
impl ConfigProvider for MockConfigProvider {
fn has(&self, key: &str) -> bool {
self.values.contains_key(key)
}
fn provider_name(&self) -> &str {
"mock"
}
fn get_raw(&self, key: &str) -> Result<Option<Value>, ConfigError> {
Ok(self.values.get(key).cloned())
}
}
#[tokio::test]
async fn test_loader_with_config_file() {
let provider = MockConfigProvider::new();
let loader = FoxyLoader::new()
.with_provider(provider);
let foxy = loader.build().await.unwrap();
let config = foxy.config();
assert_eq!(config.get::<u64>("server.port").unwrap().unwrap(), 8080);
assert_eq!(config.get::<String>("server.host").unwrap().unwrap(), "127.0.0.1");
}
#[tokio::test]
async fn test_loader_with_layered_config() {
let provider1 = MockConfigProvider::new();
let mut provider2_values = HashMap::new();
provider2_values.insert("server.port".to_string(), serde_json::json!(9000));
let provider2 = MockConfigProvider { values: provider2_values };
let config = crate::config::Config::builder()
.with_provider(provider1)
.with_provider(provider2)
.build();
assert_eq!(config.get::<u64>("server.port").unwrap().unwrap(), 9000); assert_eq!(config.get::<String>("server.host").unwrap().unwrap(), "127.0.0.1"); }
}