log_subscriber_test.rb 2.15 KB
require_relative "test_helper"

class LogSubscriberTest < Minitest::Test
  def test_create
    output = capture_logs do
      Product.create!(name: "Product A")
    end
    assert_match "Product Store", output
  end

  def test_update
    product = Product.create!(name: "Product A")
    output = capture_logs do
      product.reindex(:search_name)
    end
    assert_match "Product Update", output
  end

  def test_destroy
    product = Product.create!(name: "Product A")
    output = capture_logs do
      product.destroy
    end
    assert_match "Product Remove", output
  end

  def test_bulk
    output = capture_logs do
      Searchkick.callbacks(:bulk) do
        Product.create!(name: "Product A")
      end
    end
    assert_match "Bulk", output
    refute_match "Product Store", output
  end

  def test_reindex
    create_products
    output = capture_logs do
      Product.reindex
    end
    assert_match "Product Import", output
    assert_match '"count":3', output
  end

  def test_reindex_relation
    # where.not not supported
    skip if mongoid? && Mongoid::VERSION.to_i < 7

    products = create_products
    output = capture_logs do
      Product.where.not(id: products.last.id).reindex
    end
    assert_match "Product Import", output
    assert_match '"count":2', output
  end

  def test_search
    output = capture_logs do
      Product.search("product").to_a
    end
    assert_match "Product Search", output
  end

  def test_multi_search
    output = capture_logs do
      Searchkick.multi_search([Product.search("product")])
    end
    assert_match "Multi Search", output
  end

  private

  def create_products
    Searchkick.callbacks(false) do
      3.times.map do
        Product.create!(name: "Product A")
      end
    end
  end

  def capture_logs
    previous_logger = ActiveSupport::LogSubscriber.logger
    io = StringIO.new
    begin
      ActiveSupport::LogSubscriber.logger = ActiveSupport::Logger.new(io)
      yield
      io.rewind
      output = io.read
      previous_logger.debug(output) if previous_logger
      puts output if ENV["LOG_SUBSCRIBER"]
      output
    ensure
      ActiveSupport::LogSubscriber.logger = previous_logger
    end
  end
end