shared_examples_for "query with dynamic field support" do
  it 'restricts by dynamic string field with equality restriction' do
    search do
      dynamic :custom_string do
        with :test, 'string'
      end
    end
    connection.should have_last_search_including(:fq, 'custom_string\:test_ss:string')
  end

  it 'restricts by dynamic integer field with less than restriction' do
    search do
      dynamic :custom_integer do
        with(:test).less_than(1)
      end
    end
    connection.should have_last_search_including(:fq, 'custom_integer\:test_i:[* TO 1]')
  end

  it 'restricts by dynamic float field with between restriction' do
    search do
      dynamic :custom_float do
        with(:test).between(2.2..3.3)
      end
    end
    connection.should have_last_search_including(:fq, 'custom_float\:test_fm:[2\.2 TO 3\.3]')
  end

  it 'restricts by dynamic time field with any of restriction' do
    search do
      dynamic :custom_time do
        with(:test).any_of([Time.parse('2009-02-10 14:00:00 UTC'),
                            Time.parse('2009-02-13 18:00:00 UTC')])
      end
    end
    connection.should have_last_search_including(:fq, 'custom_time\:test_d:(2009\-02\-10T14\:00\:00Z OR 2009\-02\-13T18\:00\:00Z)')
  end

  it 'restricts by dynamic boolean field with equality restriction' do
    search do
      dynamic :custom_boolean do
        with :test, false
      end
    end
    connection.should have_last_search_including(:fq, 'custom_boolean\:test_b:false')
  end

  it 'negates a dynamic field restriction' do
    search do
      dynamic :custom_string do
        without :test, 'foo'
      end
    end
    connection.should have_last_search_including(:fq, '-custom_string\:test_ss:foo')
  end

  it 'scopes by a dynamic field inside a disjunction' do
    search do
      any_of do
        dynamic :custom_string do
          with :test, 'foo'
        end
        with :title, 'bar'
      end
    end
    connection.should have_last_search_including(
      :fq, '(custom_string\:test_ss:foo OR title_ss:bar)'
    )
  end

  it 'orders by a dynamic field' do
    search do
      dynamic :custom_integer do
        order_by :test, :desc
      end
    end
    connection.should have_last_search_with(:sort => 'custom_integer:test_i desc')
  end

  it 'orders by a dynamic field and static field, with given precedence' do
    search do
      dynamic :custom_integer do
        order_by :test, :desc
      end
      order_by :sort_title, :asc
    end
    connection.should have_last_search_with(:sort => 'custom_integer:test_i desc, sort_title_s asc')
  end

  it 'raises an UnrecognizedFieldError if an unknown dynamic field is searched by' do
    lambda do
      search do
        dynamic(:bogus) { with :some, 'value' }
      end
    end.should raise_error(Sunspot::UnrecognizedFieldError)
  end

  it 'raises a NoMethodError if pagination is attempted in a dynamic query' do
    lambda do
      search do
        dynamic :custom_string do
          paginate :page => 3, :per_page => 10
        end
      end
    end.should raise_error(NoMethodError)
  end

  it 'requests field facet on dynamic field' do
    search do
      dynamic :custom_string do
        facet(:test)
      end
    end
    connection.should have_last_search_including(:"facet.field", 'custom_string:test_ss')
  end

  it 'requests named field facet on dynamic field' do
    search do
      dynamic :custom_string do
        facet(:test, :name => :bogus)
      end
    end
    connection.should have_last_search_including(:"facet.field", '{!key=bogus}custom_string:test_ss')
  end

  it 'requests query facet with internal dynamic field' do
    search do
      facet :test do
        row 'foo' do
          dynamic :custom_string do
            with :test, 'foo'
          end
        end
      end
    end
    connection.should have_last_search_with(
      :"facet.query" => 'custom_string\:test_ss:foo'
    )
  end

  it 'requests query facet with external dynamic field' do
    search do
      dynamic :custom_string do
        facet :test do
          row 'foo' do
            with :test, 'foo'
          end
        end
      end
    end
    connection.should have_last_search_including(
      :"facet.query",
      'custom_string\:test_ss:foo'
    )
  end

  it 'allows scoping on dynamic fields common to all types' do
    search Post, Namespaced::Comment do
      dynamic :custom_float do
        with(:test, 1.23)
      end
    end
    connection.should have_last_search_including(:fq, 'custom_float\\:test_fm:1\\.23')
  end
end