Back to Repositories

Testing Query Statistics Implementation in PgHero

This test suite validates query statistics functionality in PgHero, covering core database monitoring and performance tracking capabilities. The tests ensure proper handling of query stats collection, reset operations, and historical data management across different PostgreSQL versions.

Test Coverage Overview

The test suite provides comprehensive coverage of PgHero’s query statistics features.

Key functionality tested includes:
  • Basic query stats availability and enablement
  • Stats reset operations at instance and database levels
  • Historical query stats capture and cleanup
  • Slow query monitoring
  • Version-specific functionality for PostgreSQL 12+

Implementation Analysis

The testing approach uses Minitest framework with systematic verification of database operations. Tests employ assert/refute patterns for boolean checks and error validation, with careful handling of version-specific features through skip conditions.

Technical implementation includes:
  • Database state manipulation
  • Query execution verification
  • Error case handling
  • Version-dependent feature testing

Technical Details

Testing infrastructure includes:
  • Minitest as the testing framework
  • ActiveRecord for database interactions
  • PostgreSQL version detection logic
  • Custom error handling for PgHero operations
  • Database cleanup and reset mechanisms

Best Practices Demonstrated

The test suite exemplifies robust testing practices through isolation of test cases and thorough error condition coverage. Notable practices include:
  • Version-specific test skipping
  • Proper test setup and teardown
  • Comprehensive error message validation
  • Systematic approach to feature verification
  • Clean separation of concerns in test organization

ankane/pghero

test/query_stats_test.rb

            
require_relative "test_helper"

class QueryStatsTest < Minitest::Test
  def test_query_stats
    assert database.query_stats
  end

  def test_query_stats_available
    assert database.query_stats_available?
  end

  def test_query_stats_enabled
    assert database.query_stats_enabled?
  end

  def test_query_stats_extension_enabled
    assert database.query_stats_extension_enabled?
  end

  def test_query_stats_readable?
    assert database.query_stats_readable?
  end

  def test_enable_query_stats
    assert database.disable_query_stats
    assert database.enable_query_stats
  end

  def test_reset_query_stats
    skip unless gte12?

    assert database.reset_query_stats
  end

  def test_reset_instance_query_stats
    assert database.reset_instance_query_stats
  end

  def test_reset_instance_query_stats_database
    skip unless gte12?

    assert database.reset_query_stats
    ActiveRecord::Base.connection.select_all("SELECT 1")
    assert database.query_stats.any? { |qs| qs[:query] == "SELECT $1" }

    assert database.reset_instance_query_stats(database: database.database_name)

    assert_equal 1, database.query_stats.size
    refute database.query_stats.any? { |qs| qs[:query] == "SELECT $1" }
  end

  def test_reset_instance_query_stats_database_invalid
    skip unless gte12?

    error = assert_raises(PgHero::Error) do
      database.reset_instance_query_stats(database: "pghero_test2")
    end
    assert_equal "Database not found: pghero_test2", error.message
  end

  def test_reset_query_stats_user
    skip unless gte12?

    assert database.reset_query_stats
    ActiveRecord::Base.connection.select_all("SELECT 1")
    assert database.query_stats.any? { |qs| qs[:query] == "SELECT $1" }

    assert database.reset_query_stats(user: database.current_user)

    assert_equal 1, database.query_stats.size
    refute database.query_stats.any? { |qs| qs[:query] == "SELECT $1" }
  end

  def test_reset_query_stats_user_invalid
    skip unless gte12?

    error = assert_raises(PgHero::Error) do
      database.reset_query_stats(user: "postgres2")
    end
    assert_equal "User not found: postgres2", error.message
  end

  def test_reset_query_stats_query_hash
    skip unless gte12?

    assert database.reset_query_stats
    ActiveRecord::Base.connection.select_all("SELECT 1")
    ActiveRecord::Base.connection.select_all("SELECT 1 + 1")

    assert database.query_stats.any? { |qs| qs[:query] == "SELECT $1" }
    assert database.query_stats.any? { |qs| qs[:query] == "SELECT $1 + $2" }

    query_hash = database.query_stats.find { |qs| qs[:query] == "SELECT $1" }[:query_hash]
    assert database.reset_query_stats(query_hash: query_hash)

    refute database.query_stats.any? { |qs| qs[:query] == "SELECT $1" }
    assert database.query_stats.any? { |qs| qs[:query] == "SELECT $1 + $2" }
  end

  def test_reset_query_stats_query_hash_invalid
    skip unless gte12?

    error = assert_raises(PgHero::Error) do
      database.reset_query_stats(query_hash: 0)
    end
    assert_equal "Invalid query hash: 0", error.message
  end

  def test_historical_query_stats_enabled
    assert database.historical_query_stats_enabled?
  end

  def test_capture_query_stats
    PgHero::QueryStats.delete_all
    refute PgHero::QueryStats.any?
    assert database.capture_query_stats
    assert PgHero::QueryStats.any?
    assert database.query_stats(historical: true)
  end

  def test_clean_query_stats
    assert database.clean_query_stats
  end

  def test_slow_queries
    assert database.slow_queries
  end

  def gte12?
    database.server_version_num >= 120000
  end
end