use crate::config::DatabaseConfig;
use crate::error::ServiceResult;
use super::sqlx::{Database, build_pool_eager, build_pool_lazy};
pub fn connect(config: &DatabaseConfig) -> ServiceResult<Database> {
let pool = build_pool_lazy(config)?;
Ok(Database::from_pool(pool))
}
pub async fn connect_eager(config: &DatabaseConfig) -> ServiceResult<Database> {
let pool = build_pool_eager(config).await?;
Ok(Database::from_pool(pool))
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_connect_bad_url_returns_database_error() {
let config = DatabaseConfig {
url: "not-a-valid-postgres-url".to_string(),
max_connections: 5,
connect_timeout: 5,
};
let err = connect(&config).unwrap_err();
match err {
crate::error::ServiceError::Database(_) => {}
other => panic!("expected ServiceError::Database, got {other:?}"),
}
}
#[tokio::test]
async fn test_connect_lazy_valid_url_succeeds_without_server() {
let config = DatabaseConfig {
url: "postgres://user:pw@localhost:9998/db".to_string(),
max_connections: 2,
connect_timeout: 1,
};
assert!(
connect(&config).is_ok(),
"connect_lazy should succeed for a valid URL without a live server"
);
}
}