diff --git a/crates/pgls_cli/src/commands/dblint.rs b/crates/pgls_cli/src/commands/dblint.rs index b9ce13044..36dc048c3 100644 --- a/crates/pgls_cli/src/commands/dblint.rs +++ b/crates/pgls_cli/src/commands/dblint.rs @@ -6,6 +6,7 @@ use crate::{CliDiagnostic, CliSession, VcsIntegration}; use pgls_analyse::RuleCategoriesBuilder; use pgls_configuration::PartialConfiguration; use pgls_diagnostics::Error; +use pgls_diagnostics::category; use pgls_workspace::features::diagnostics::{PullDatabaseDiagnosticsParams, PullDiagnosticsResult}; pub fn dblint( @@ -44,5 +45,23 @@ pub fn dblint( None, ); - session.report("dblint", cli_options, &report) + let exit_result = enforce_exit_codes(cli_options, &report); + session.report("dblint", cli_options, &report)?; + exit_result +} + +fn enforce_exit_codes(cli_options: &CliOptions, payload: &Report) -> Result<(), CliDiagnostic> { + let errors = payload.errors; + let warnings = payload.warnings; + let category = category!("check"); + + if errors > 0 { + return Err(CliDiagnostic::check_error(category)); + } + + if warnings > 0 && cli_options.error_on_warnings { + return Err(CliDiagnostic::check_warnings(category)); + } + + Ok(()) } diff --git a/crates/pgls_cli/tests/assert_dblint.rs b/crates/pgls_cli/tests/assert_dblint.rs index 558449dae..675f21688 100644 --- a/crates/pgls_cli/tests/assert_dblint.rs +++ b/crates/pgls_cli/tests/assert_dblint.rs @@ -28,6 +28,17 @@ async fn dblint_empty_database_snapshot(test_db: PgPool) { assert_snapshot!(output); } +#[sqlx::test(migrator = "pgls_test_utils::MIGRATIONS")] +#[cfg_attr( + target_os = "windows", + ignore = "snapshot expectations only validated on unix-like platforms" +)] +async fn dblint_error_on_warnings_empty_database_snapshot(test_db: PgPool) { + let url = get_database_url(&test_db); + let output = run_dblint(&url, &["--error-on-warnings"]); + assert_snapshot!(output); +} + #[sqlx::test(migrator = "pgls_test_utils::MIGRATIONS")] #[cfg_attr( target_os = "windows", @@ -45,6 +56,27 @@ async fn dblint_detects_issues_snapshot(test_db: PgPool) { assert_snapshot!(output); } +#[sqlx::test(migrator = "pgls_test_utils::MIGRATIONS")] +#[cfg_attr( + target_os = "windows", + ignore = "snapshot expectations only validated on unix-like platforms" +)] +async fn dblint_error_on_warnings_detects_issues_snapshot(test_db: PgPool) { + // Setup: create duplicate non-unique indexes (triggers duplicateIndex warning) + sqlx::raw_sql( + "CREATE TABLE test_duplicate_idx (id int primary key, email text); + CREATE INDEX idx_duplicate_a ON test_duplicate_idx (email); + CREATE INDEX idx_duplicate_b ON test_duplicate_idx (email);", + ) + .execute(&test_db) + .await + .expect("Failed to create test schema"); + + let url = get_database_url(&test_db); + let output = run_dblint(&url, &["--error-on-warnings"]); + assert_snapshot!(output); +} + #[test] #[cfg_attr( target_os = "windows", diff --git a/crates/pgls_cli/tests/snapshots/assert_dblint__dblint_error_on_warnings_detects_issues_snapshot.snap b/crates/pgls_cli/tests/snapshots/assert_dblint__dblint_error_on_warnings_detects_issues_snapshot.snap new file mode 100644 index 000000000..504eeca8c --- /dev/null +++ b/crates/pgls_cli/tests/snapshots/assert_dblint__dblint_error_on_warnings_detects_issues_snapshot.snap @@ -0,0 +1,48 @@ +--- +source: crates/pgls_cli/tests/assert_dblint.rs +expression: output +snapshot_kind: text +--- +status: failure +stdout: +Command completed in . +Found 1 warning(s). +stderr: +splinter/performance/duplicateIndex ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + ! Table \`public.test_duplicate_idx\` has identical indexes {idx_duplicate_a,idx_duplicate_b}. Drop all except one of them + + Detects cases where two ore more identical indexes exist. + + i table: public.test_duplicate_idx + + {"indexes":["idx_duplicate_a","idx_duplicate_b"]} + + i Remediation: https://supabase.com/docs/guides/database/database-linter?lint=0009_duplicate_index + + +splinter/performance/unusedIndex ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i Index \`idx_duplicate_a\` on table \`public.test_duplicate_idx\` has not been used + + Detects if an index has never been used and may be a candidate for removal. + + i table: public.test_duplicate_idx + + i Remediation: https://supabase.com/docs/guides/database/database-linter?lint=0005_unused_index + + +splinter/performance/unusedIndex ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i Index \`idx_duplicate_b\` on table \`public.test_duplicate_idx\` has not been used + + Detects if an index has never been used and may be a candidate for removal. + + i table: public.test_duplicate_idx + + i Remediation: https://supabase.com/docs/guides/database/database-linter?lint=0005_unused_index + + +check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Some warnings were emitted while running checks. diff --git a/crates/pgls_cli/tests/snapshots/assert_dblint__dblint_error_on_warnings_empty_database_snapshot.snap b/crates/pgls_cli/tests/snapshots/assert_dblint__dblint_error_on_warnings_empty_database_snapshot.snap new file mode 100644 index 000000000..9d9e6c858 --- /dev/null +++ b/crates/pgls_cli/tests/snapshots/assert_dblint__dblint_error_on_warnings_empty_database_snapshot.snap @@ -0,0 +1,9 @@ +--- +source: crates/pgls_cli/tests/assert_dblint.rs +expression: output +snapshot_kind: text +--- +status: success +stdout: +Command completed in . +stderr: