elasticsearch-rails icon indicating copy to clipboard operation
elasticsearch-rails copied to clipboard

Correct setup for rSpec

Open exocode opened this issue 4 years ago • 5 comments

Hi there,

Can someone help me and confirm my approach or provide an actual (version 7.x) example how to setup a rSpec-environment for elasticsearch-rails (7.1.1) correctly? I am using Rails 6.1.x and rSpec 3.1.x.

I have doubt if my request tests are setup correctly, or if there is a better approach:

I saw examples with a Product.import and sleep 2 in specs, as well some real complex methods in the spec_helper.rb/rails_helper.rb file.

Currently I have this, it looks slim and works (till now):

rails_helper.rb

  # pass 'elasticsearch: true' or ':elasticsearch' to your tests to run this code
  config.around(:each, elasticsearch: true) do |example|
    Product.__elasticsearch__.create_index!(force: true)
    Product.import
    Product.__elasticsearch__.refresh_index!
    example.run
    Product.__elasticsearch__.client.indices.delete index: Product.index_name
  end

  config.after(:suite) do
    Elasticsearch::Model.client.indices.delete(index: '_all')
  end

product_request_spec.rb

  describe "by_name" do
    before(:each) do
      target = Fabricate :product, { name: term }
      Fabricate.times(3, :product)
      # Product.import(force: true) # sometimes it looks I have to use that
    end

    it 'respond with a pagination' do
      post "/search/by_name/#{term}"
      expect(response.body).to have_json_path("data")
    end
  end

Other approaches product_request_spec.rb

approach a.) (does not work always)

before(:each) do
  Product.__elasticsearch__.create_index! force: true
  Fabricate :product
  Product.__elasticsearch__.client.indices.refresh
end

approach b.) Works but very slow if test amount raise

before(:each) do
  Product.__elasticsearch__.create_index! force: true
  Fabricate :product
  Product.import(force: true)
  sleep 2 # but slowing down hundred of tests is not my favorite.
end

(maybe the docs can supplied with such an example... )

Thank you in advance

exocode avatar Apr 02 '21 11:04 exocode

@exocode Having the same issue. Seems like my current setup doesn't work properly, there are inconsitencies. I couldn't find any documentation on integrating with rspec. Can somebody please suggest something?

AndreiMotinga avatar Apr 14 '21 02:04 AndreiMotinga

just wanna keep that issue open

exocode avatar Jan 09 '22 18:01 exocode

I also have the same issue... it seems like there is a way to use refresh:wait_forbut I am not sure how exactly to use it.

ritec avatar Feb 24 '23 20:02 ritec