use async_trait::async_trait;
use klauthed_core::config::{Config, DatabaseConfig};
use klauthed_core::wiring::{AppContext, Starter, StarterError};
#[derive(Debug, Default, Clone)]
pub struct DataStarter;
#[async_trait]
impl Starter for DataStarter {
fn name(&self) -> &str {
"data"
}
async fn configure(&self, config: &Config, ctx: &mut AppContext) -> Result<(), StarterError> {
if let Some(database) = config.get_optional::<DatabaseConfig>("database")? {
let pool = crate::db::connect(&database).await?;
ctx.register(pool);
}
Ok(())
}
}
#[cfg(all(test, feature = "sqlite"))]
mod tests {
use super::*;
use klauthed_core::config::provider::MemoryProvider;
use klauthed_core::config::{ConfigBuilder, Profile};
use klauthed_core::wiring::AppBuilder;
use serde_json::json;
#[tokio::test]
async fn registers_an_anypool_from_the_database_section() {
let config = ConfigBuilder::new(Profile::Test)
.with_provider(
MemoryProvider::new()
.set("database", json!({ "system": "sqlite", "url": "sqlite::memory:" })),
)
.build()
.await
.unwrap();
let ctx = AppBuilder::new(config).with_starter(DataStarter).build().await.unwrap();
let pool = ctx.require::<sqlx::AnyPool>().unwrap();
assert!(!pool.is_closed());
}
#[tokio::test]
async fn no_database_section_is_a_noop() {
let config = ConfigBuilder::new(Profile::Test)
.with_provider(MemoryProvider::new().set("unrelated", json!(true)))
.build()
.await
.unwrap();
let ctx = AppBuilder::new(config).with_starter(DataStarter).build().await.unwrap();
assert!(ctx.get::<sqlx::AnyPool>().is_none());
}
}