use pgdrift::commands::discover;
use pgdrift::output::OutputFormat;
use pgdrift_db::fixtures;
use pgdrift_db::test_utils::TestDb;
#[tokio::test]
async fn test_discover_single_column() {
let test_db = TestDb::new().await.expect("Failed to create test database");
fixtures::create_users_consistent(&test_db.pool)
.await
.expect("Failed to create fixture");
let result = discover::run(test_db.database_url(), OutputFormat::Json).await;
assert!(
result.is_ok(),
"Discover command failed: {:?}",
result.err()
);
test_db.cleanup().await.expect("Failed to cleanup");
}
#[tokio::test]
async fn test_discover_multiple_columns() {
let test_db = TestDb::new().await.expect("Failed to create test database");
fixtures::create_users_consistent(&test_db.pool)
.await
.expect("Failed to create users fixture");
fixtures::create_products_schema_evolution(&test_db.pool)
.await
.expect("Failed to create products fixture");
fixtures::create_users_ghost_keys(&test_db.pool)
.await
.expect("Failed to create sparse users fixture");
let result = discover::run(test_db.database_url(), OutputFormat::Json).await;
assert!(
result.is_ok(),
"Discover command failed: {:?}",
result.err()
);
test_db.cleanup().await.expect("Failed to cleanup");
}
#[tokio::test]
async fn test_discover_output_formats() {
let test_db = TestDb::new().await.expect("Failed to create test database");
fixtures::create_users_consistent(&test_db.pool)
.await
.expect("Failed to create fixture");
for format in [
OutputFormat::Table,
OutputFormat::Json,
OutputFormat::Markdown,
] {
let result = discover::run(test_db.database_url(), format.clone()).await;
assert!(
result.is_ok(),
"Discover command failed for {:?} format: {:?}",
format,
result.err()
);
}
test_db.cleanup().await.expect("Failed to cleanup");
}
#[tokio::test]
async fn test_discover_no_jsonb_columns() {
let test_db = TestDb::new().await.expect("Failed to create test database");
sqlx::query(
"CREATE TABLE regular_table (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER
)",
)
.execute(&test_db.pool)
.await
.expect("Failed to create table");
let result = discover::run(test_db.database_url(), OutputFormat::Json).await;
assert!(
result.is_ok(),
"Discover command should succeed even with no JSONB columns"
);
test_db.cleanup().await.expect("Failed to cleanup");
}
#[tokio::test]
async fn test_discover_invalid_database_url() {
let result = discover::run(
"postgres://invalid:invalid@localhost:9999/invalid",
OutputFormat::Json,
)
.await;
assert!(result.is_err(), "Expected error for invalid database URL");
}
#[tokio::test]
async fn test_discover_excludes_system_schemas() {
let test_db = TestDb::new().await.expect("Failed to create test database");
fixtures::create_users_consistent(&test_db.pool)
.await
.expect("Failed to create fixture");
let result = discover::run(test_db.database_url(), OutputFormat::Json).await;
assert!(
result.is_ok(),
"Discover command failed: {:?}",
result.err()
);
test_db.cleanup().await.expect("Failed to cleanup");
}
#[tokio::test]
async fn test_discover_different_jsonb_structures() {
let test_db = TestDb::new().await.expect("Failed to create test database");
fixtures::create_users_nested(&test_db.pool)
.await
.expect("Failed to create nested fixture");
fixtures::create_users_type_inconsistency(&test_db.pool)
.await
.expect("Failed to create type inconsistency fixture");
let result = discover::run(test_db.database_url(), OutputFormat::Json).await;
assert!(
result.is_ok(),
"Discover command failed: {:?}",
result.err()
);
test_db.cleanup().await.expect("Failed to cleanup");
}