module NPlusOneControl::MinitestHelper

Minitest assertions

Public Instance Methods

assert_perform_constant_number_of_queries( populate: nil, matching: nil, scale_factors: nil, warmup: nil ) { || ... } click to toggle source
# File lib/n_plus_one_control/minitest.rb, line 8
def assert_perform_constant_number_of_queries(
  populate: nil,
  matching: nil,
  scale_factors: nil,
  warmup: nil
)

  raise ArgumentError, "Block is required" unless block_given?

  warming_up warmup

  @executor = NPlusOneControl::Executor.new(
    population: populate || population_method,
    matching: matching || NPlusOneControl.default_matching,
    scale_factors: scale_factors || NPlusOneControl.default_scale_factors
  )

  queries = @executor.call { yield }

  counts = queries.map(&:last).map(&:size)

  assert counts.max == counts.min, NPlusOneControl.failure_message(:constant_queries, queries)
end
assert_perform_linear_number_of_queries( slope: 1, populate: nil, matching: nil, scale_factors: nil, warmup: nil ) { || ... } click to toggle source
# File lib/n_plus_one_control/minitest.rb, line 32
def assert_perform_linear_number_of_queries(
  slope: 1,
  populate: nil,
  matching: nil,
  scale_factors: nil,
  warmup: nil
)

  raise ArgumentError, "Block is required" unless block_given?

  warming_up warmup

  @executor = NPlusOneControl::Executor.new(
    population: populate || population_method,
    matching: matching || NPlusOneControl.default_matching,
    scale_factors: scale_factors || NPlusOneControl.default_scale_factors
  )

  queries = @executor.call { yield }

  assert linear?(queries, slope: slope), NPlusOneControl.failure_message(:linear_queries, queries)
end
current_scale() click to toggle source
# File lib/n_plus_one_control/minitest.rb, line 55
def current_scale
  @executor&.current_scale
end

Private Instance Methods

linear?(queries, slope:) click to toggle source
# File lib/n_plus_one_control/minitest.rb, line 69
def linear?(queries, slope:)
  queries.each_cons(2).all? do |pair|
    scales = pair.map(&:first)
    query_lists = pair.map(&:last)

    actual_slope = (query_lists[1].size - query_lists[0].size) / (scales[1] - scales[0])
    actual_slope <= slope
  end
end
population_method() click to toggle source
# File lib/n_plus_one_control/minitest.rb, line 65
def population_method
  methods.include?(:populate) ? method(:populate) : nil
end
warming_up(warmup) click to toggle source
# File lib/n_plus_one_control/minitest.rb, line 61
def warming_up(warmup)
  (warmup || methods.include?(:warmup) ? method(:warmup) : nil)&.call
end