require_relative "test_helper"

class MultiIndicesTest < Minitest::Test
  def setup
    super
    setup_speaker
  end

  def test_basic
    store_names ["Product A"]
    store_names ["Product B"], Speaker
    assert_search_multi "product", ["Product A", "Product B"]
  end

  def test_index_name
    store_names ["Product A"]
    assert_equal ["Product A"], Product.search("product", index_name: Product.searchkick_index.name).map(&:name)
    assert_equal ["Product A"], Product.search("product", index_name: Product).map(&:name)

    Speaker.search_index.refresh
    assert_equal [], Product.search("product", index_name: Speaker.searchkick_index.name, conversions: false).map(&:name)
  end

  def test_models_and_index_name
    store_names ["Product A"]
    store_names ["Product B"], Speaker
    assert_equal ["Product A"], Searchkick.search("product", models: [Product, Store], index_name: Product.searchkick_index.name).map(&:name)
    error = assert_raises(Searchkick::Error) do
      Searchkick.search("product", models: [Product, Store], index_name: Speaker.searchkick_index.name).map(&:name)
    end
    assert_includes error.message, "Unknown model"
    # legacy
    assert_equal ["Product A"], Searchkick.search("product", index_name: [Product, Store]).map(&:name)
  end

  def test_model_with_another_model
    error = assert_raises(ArgumentError) do
      Product.search(models: [Store])
    end
    assert_includes error.message, "Use Searchkick.search"
  end

  def test_model_with_another_model_in_index_name
    error = assert_raises(ArgumentError) do
      # legacy protection
      Product.search(index_name: [Store, "another"])
    end
    assert_includes error.message, "Use Searchkick.search"
  end

  def test_no_models_or_index_name
    store_names ["Product A"]

    error = assert_raises(Searchkick::Error) do
      Searchkick.search("product").results
    end
    assert_includes error.message, "Unknown model"
  end

  def test_no_models_or_index_name_load_false
    store_names ["Product A"]
    Searchkick.search("product", load: false).results
  end

  private

  def assert_search_multi(term, expected, options = {})
    options[:models] = [Product, Speaker]
    options[:fields] = [:name]
    assert_search(term, expected, options, Searchkick)
  end
end
