#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
use crate::integrations::infra::Database;
use crate::integrations::infra::{Cache, Config};
use crate::InklogConfig;
use trait_kit::core::capability::CapabilityKey;
use trait_kit::core::config::ConfigKey as ConfigKeyTrait;
pub struct ConfigCapabilityKey;
impl CapabilityKey for ConfigCapabilityKey {
type Capability = dyn Config;
const NAME: &'static str = "config";
}
pub struct CacheCapabilityKey;
impl CapabilityKey for CacheCapabilityKey {
type Capability = dyn Cache;
const NAME: &'static str = "cache";
}
#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
pub struct DatabaseCapabilityKey;
#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
impl CapabilityKey for DatabaseCapabilityKey {
type Capability = dyn Database;
const NAME: &'static str = "database";
}
pub struct InklogConfigKey;
impl ConfigKeyTrait for InklogConfigKey {
type Config = InklogConfig;
const NAME: &'static str = "inklog_config";
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn config_capability_key_name() {
assert_eq!(ConfigCapabilityKey::NAME, "config");
}
#[test]
fn cache_capability_key_name() {
assert_eq!(CacheCapabilityKey::NAME, "cache");
}
#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
#[test]
fn database_capability_key_name() {
assert_eq!(DatabaseCapabilityKey::NAME, "database");
}
#[test]
fn inklog_config_key_name() {
assert_eq!(InklogConfigKey::NAME, "inklog_config");
}
#[test]
fn kit_registers_config_capability() {
use crate::integrations::infra::MockConfig;
use std::sync::Arc;
use trait_kit::kit::Kit;
let kit = Kit::new();
let config: Arc<dyn Config> = Arc::new(MockConfig::new());
kit.provide::<ConfigCapabilityKey>(config).unwrap();
assert!(kit.contains::<ConfigCapabilityKey>());
let retrieved = kit.require::<ConfigCapabilityKey>().unwrap();
assert!(retrieved.get_string("any").is_none() || retrieved.get_string("any").is_some());
}
#[test]
fn kit_registers_cache_capability() {
use crate::integrations::infra::MockCache;
use std::sync::Arc;
use trait_kit::kit::Kit;
let kit = Kit::new();
let cache: Arc<dyn Cache> = Arc::new(MockCache::new());
kit.provide::<CacheCapabilityKey>(cache).unwrap();
assert!(kit.contains::<CacheCapabilityKey>());
}
#[test]
fn kit_stores_inklog_config() {
use trait_kit::kit::Kit;
let kit = Kit::new();
let config = InklogConfig::default();
kit.set_config::<InklogConfigKey>(config);
assert!(kit.contains_config::<InklogConfigKey>());
let handle = kit.config::<InklogConfigKey>().unwrap();
assert_eq!(handle.load().global.level, "info");
}
#[test]
fn kit_config_handle_supports_hot_reload() {
use trait_kit::kit::Kit;
let kit = Kit::new();
kit.set_config::<InklogConfigKey>(InklogConfig::default());
let handle = kit.config::<InklogConfigKey>().unwrap();
let mut new_config = InklogConfig::default();
new_config.global.level = "debug".to_string();
handle.set(new_config);
assert_eq!(handle.load().global.level, "debug");
}
#[test]
fn duplicate_capability_registration_fails() {
use crate::integrations::infra::MockCache;
use std::sync::Arc;
use trait_kit::kit::Kit;
let kit = Kit::new();
let cache: Arc<dyn Cache> = Arc::new(MockCache::new());
kit.provide::<CacheCapabilityKey>(cache).unwrap();
let second: Arc<dyn Cache> = Arc::new(MockCache::new());
assert!(kit.provide::<CacheCapabilityKey>(second).is_err());
}
#[test]
fn missing_capability_returns_error() {
use trait_kit::kit::Kit;
let kit = Kit::new();
assert!(kit.require::<CacheCapabilityKey>().is_err());
}
}