Sha256: f6062fabb0b3297514724702c25841d3a9cbe7ada5839f5c2e0f0c82320b532f

Contents?: true

Size: 1.74 KB

Versions: 6

Compression:

Stored size: 1.74 KB

Contents

module QueriesHelper
  def assert_no_queries(ignored_sql = nil, &block)
    assert_queries(0, ignored_sql, &block)
  end

  def assert_queries(num = 1, ignored_sql = nil)
    counter = SQLCounter.new(ignored_sql)
    subscriber = ActiveSupport::Notifications.subscribe('sql.active_record', counter)
    yield counter
    queries = counter.log.size == 0 ? '' : "\nQueries:\n#{counter.log.join("\n")}"
    assert_equal num, counter.log.size, "#{counter.log.size} instead of #{num} queries were executed.#{queries}"
  ensure
    ActiveSupport::Notifications.unsubscribe(subscriber)
  end

  class SQLCounter
    cattr_accessor :ignored_sql
    self.ignored_sql = [
      /^PRAGMA (?!(table_info))/,
      /^SELECT currval/,
      /^SELECT CAST/,
      /^SELECT @@IDENTITY/,
      /^SELECT @@ROWCOUNT/,
      /^SELECT @@FOREIGN_KEY_CHECKS/,
      /^SET FOREIGN_KEY_CHECKS/,
      /^SAVEPOINT/,
      /^ROLLBACK TO SAVEPOINT/,
      /^RELEASE SAVEPOINT/,
      /^SHOW max_identifier_length/,
      /^BEGIN/,
      /^COMMIT/,
      /^SHOW FULL FIELDS/,
      /^SHOW TABLES LIKE/,
    ]

    # FIXME: this needs to be refactored so specific database can add their own
    # ignored SQL.  This ignored SQL is for Oracle.
    ignored_sql.concat [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im]

    attr_reader :ignore
    attr_reader :log

    def initialize(ignore = nil)
      @ignore =  ignore || self.class.ignored_sql
      @log = []
    end

    def call(_name, _start, _finish, _message_id, values)
      sql = values[:sql]

      # FIXME: this seems bad. we should probably have a better way to indicate
      # the query was cached
      return if 'CACHE' == values[:name] || ignore.any? { |x| x =~ sql }
      log << sql
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
shipit-engine-0.2.3 test/helpers/queries_helper.rb
shipit-engine-0.2.2 test/helpers/queries_helper.rb
shipit-engine-0.2.1 test/helpers/queries_helper.rb
shipit-engine-0.2.0 test/helpers/queries_helper.rb
shipit-engine-0.1.0 test/helpers/queries_helper.rb
shipit-engine-0.0.1.pre test/helpers/queries_helper.rb