#![allow(clippy::unwrap_used, clippy::expect_used, clippy::use_debug)]
use figment::{Figment, providers::Serialized};
use modkit_db::{DbConnConfig, DbManager, GlobalDatabaseConfig, PoolCfg};
use std::collections::HashMap;
use std::time::Duration;
use tempfile::TempDir;
#[tokio::test]
async fn test_dbmanager_no_global_config() {
let figment = Figment::new();
let temp_dir = TempDir::new().unwrap();
let home_dir = temp_dir.path().to_path_buf();
let manager = DbManager::from_figment(figment, home_dir).unwrap();
let result = manager.get("test_module").await.unwrap();
assert!(result.is_none());
}
#[tokio::test]
async fn test_dbmanager_module_no_database() {
let figment = Figment::new().merge(Serialized::defaults(serde_json::json!({
"modules": {
"test_module": {
"config": {
"some_setting": "value"
}
}
}
})));
let temp_dir = TempDir::new().unwrap();
let home_dir = temp_dir.path().to_path_buf();
let manager = DbManager::from_figment(figment, home_dir).unwrap();
let result = manager.get("test_module").await.unwrap();
assert!(result.is_none());
}
#[tokio::test]
async fn test_dbmanager_server_merge() {
let mut servers = HashMap::new();
servers.insert(
"test_server".to_owned(),
DbConnConfig {
engine: None,
dsn: None,
host: Some("localhost".to_owned()),
port: Some(5432),
user: Some("serveruser".to_owned()),
password: Some("serverpass".to_owned()),
dbname: Some("serverdb".to_owned()),
params: Some({
let mut params = HashMap::new();
params.insert("ssl".to_owned(), "require".to_owned());
params
}),
file: None,
path: None,
pool: Some(PoolCfg {
max_conns: Some(20),
acquire_timeout: Some(Duration::from_secs(1)),
..Default::default()
}),
server: None,
},
);
let global_config = GlobalDatabaseConfig {
servers,
auto_provision: Some(false),
};
let figment = Figment::new().merge(Serialized::defaults(serde_json::json!({
"database": global_config,
"modules": {
"test_module": {
"database": {
"server": "test_server",
"dbname": "moduledb", "params": {
"application_name": "test_module" }
}
}
}
})));
let temp_dir = TempDir::new().unwrap();
let home_dir = temp_dir.path().to_path_buf();
let manager = DbManager::from_figment(figment, home_dir).unwrap();
let result = manager.get("test_module").await;
assert!(
result.is_err(),
"Expected connection error, but got success"
);
}
#[tokio::test]
async fn test_dbmanager_missing_server_reference() {
let figment = Figment::new().merge(Serialized::defaults(serde_json::json!({
"modules": {
"test_module": {
"database": {
"server": "nonexistent_server"
}
}
}
})));
let temp_dir = TempDir::new().unwrap();
let home_dir = temp_dir.path().to_path_buf();
let manager = DbManager::from_figment(figment, home_dir).unwrap();
let result = manager.get("test_module").await;
println!("Result: {result:?}");
assert!(result.is_err());
let error = result.unwrap_err();
assert!(
error
.to_string()
.contains("Referenced server 'nonexistent_server' not found")
);
}