relation_test.rb 2.56 KB
require_relative "test_helper"

class RelationTest < Minitest::Test
  def test_works
    store_names ["Product A", "Product B"]
    relation = Product.search("product").where(name: "Product A").limit(1).offset(0).order(name: :desc)
    assert_equal ["Product A"], relation.map(&:name)
  end

  def test_no_term
    store_names ["Product A"]
    assert_equal ["Product A"], Product.search.map(&:name)
  end

  def test_where
    store_names ["Product A", "Product B"]
    assert_search_relation [], Product.search("*").where(name: "Product A").where(name: "Product B")
  end

  def test_none
    store_names ["Product A", "Product B"]
    assert_search_relation [], Product.search("*").none
  end

  def test_unscoped
    store_names ["Red", "Blue"]
    # keeps term
    assert_search_relation ["Red"], Product.search("red").where(store_id: 1).unscoped
  end

  def test_unscope
    store_names ["Red", "Blue"]
    assert_search_relation ["Red"], Product.search("red").where(store_id: 1).unscope(:where)
  end

  def test_pluck
    store_names ["Blue", "Red"]
    assert_equal ["Blue", "Red"], Product.order(:name).pluck(:name) if defined?(ActiveRecord)
    assert_equal ["Blue", "Red"], Product.search.order(:name).pluck(:name)
  end

  def test_pluck_many
    store_names ["Blue", "Red"]
    assert_equal [["Blue", nil], ["Red", nil]], Product.order(:name).pluck(:name, :store_id) if defined?(ActiveRecord)
    assert_equal [["Blue", nil], ["Red", nil]], Product.search.order(:name).pluck(:name, :store_id)
  end

  def test_pluck_empty
    Product.search_index.refresh
    assert_equal [], Product.search.pluck
    store_names ["Blue", "Red"]
    assert Product.search.pluck
  end

  def test_first
    store_names ["Blue", "Red"]
    assert_kind_of Product, Product.first
    assert_kind_of Product, Product.search.first if defined?(ActiveRecord)
    assert_equal 1, Product.first(1).size
    assert_equal 1, Product.search.first(1).size if defined?(ActiveRecord)
  end

  def test_take
    store_names ["Blue", "Red"]
    assert_kind_of Product, Product.take
    assert_kind_of Product, Product.search.take if defined?(ActiveRecord)
    assert_equal 1, Product.take(1).size
    assert_equal 1, Product.search.take(1).size if defined?(ActiveRecord)
  end

  def test_parameters
    skip unless defined?(ActiveRecord)
    require "action_controller"

    params = ActionController::Parameters.new({store_id: 1})
    assert_raises(ActiveModel::ForbiddenAttributesError) do
      Product.where(params)
    end
    assert_raises(ActiveModel::ForbiddenAttributesError) do
      Product.search.where(params)
    end
  end
end