use lmrc_postgres::{PostgresConfig, PostgresManager};
use std::env;
fn should_run_integration_tests() -> bool {
env::var("TEST_SSH_HOST").is_ok()
}
fn get_test_config() -> (String, String, Option<String>, Option<String>) {
let host = env::var("TEST_SSH_HOST").expect("TEST_SSH_HOST not set");
let user = env::var("TEST_SSH_USER").unwrap_or_else(|_| "root".to_string());
let password = env::var("TEST_SSH_PASSWORD").ok();
let key_path = env::var("TEST_SSH_KEY_PATH").ok();
(host, user, password, key_path)
}
fn build_test_manager() -> PostgresManager {
let (host, user, password, key_path) = get_test_config();
let config = PostgresConfig::builder()
.version("15")
.database_name("test_db")
.username("test_user")
.password("test_password")
.listen_addresses("0.0.0.0/0")
.port(5432)
.build()
.expect("Failed to build config");
let mut builder = PostgresManager::builder()
.config(config)
.server_ip(host)
.ssh_user(user);
if let Some(pwd) = password {
builder = builder.ssh_password(pwd);
} else if let Some(key) = key_path {
builder = builder.ssh_key_path(key);
}
builder.build().expect("Failed to build manager")
}
#[tokio::test]
#[ignore] async fn test_full_lifecycle() {
if !should_run_integration_tests() {
eprintln!("Skipping integration test - TEST_SSH_HOST not set");
return;
}
let manager = build_test_manager();
println!("Testing installation...");
manager.install().await.expect("Installation failed");
let installed = manager.is_installed().await.expect("Check failed");
assert!(installed, "PostgreSQL should be installed");
let version = manager
.get_installed_version()
.await
.expect("Version check failed");
assert_eq!(version, Some("15".to_string()));
println!("Testing configuration...");
manager.configure().await.expect("Configuration failed");
println!("Testing connection...");
manager
.test_connection()
.await
.expect("Connection test failed");
println!("Testing uninstall...");
manager.uninstall(true).await.expect("Uninstall failed");
let installed = manager.is_installed().await.expect("Check failed");
assert!(!installed, "PostgreSQL should be uninstalled");
println!("Full lifecycle test completed successfully!");
}
#[tokio::test]
#[ignore]
async fn test_idempotent_installation() {
if !should_run_integration_tests() {
return;
}
let manager = build_test_manager();
manager.install().await.expect("First installation failed");
manager.install().await.expect("Second installation failed");
let installed = manager.is_installed().await.expect("Check failed");
assert!(installed);
manager.uninstall(true).await.ok();
}
#[tokio::test]
#[ignore]
async fn test_diff_detection() {
if !should_run_integration_tests() {
return;
}
let manager = build_test_manager();
manager.setup().await.expect("Setup failed");
let diff = manager.diff().await.expect("Diff failed");
println!("Diff: {}", diff);
manager.uninstall(true).await.ok();
}