Rspec with Elasticsearch::Ruby and Elasticsearch::Model

May 26, 2014 James Robert Somers

We recently started using Elasticsearch::Ruby on our project and wanted to add some rspec integration tests. The documentation skips over rspec integration but by adapting their sample tests:
# Gemfile
group :test do
  gem 'elasticsearch-extensions'
end
# spec_helper.rb
# Add after other requires. Rake needs to be loaded.
require 'rake'
require 'elasticsearch/extensions/test/cluster/tasks'

RSpec.configure do |config|
  # Snipped other config.
  config.before :each, elasticsearch: true do
    Elasticsearch::Extensions::Test::Cluster.start(port: 9200) unless Elasticsearch::Extensions::Test::Cluster.running?
  end

  config.after :suite do
    Elasticsearch::Extensions::Test::Cluster.stop(port: 9200) if Elasticsearch::Extensions::Test::Cluster.running?
  end
end
It’s important to namespace the index somehow so that your environments don’t clash. We used this.
class User < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
  index_name [Rails.env, model_name.collection.gsub(///, '-')].join('_')
end
Then you can add the elasticsearch tag to your rspec blocks:
describe 'Searching for a user', elasticsearch: true do
  before do
    # Create and destroy Elasticsearch indexes
    # between tests to eliminate test pollution
    User.__elasticsearch__.create_index! index: User.index_name

    # There are two options for how you create your objects
    # 1. Create your objects here and they should be synchronised
    # through the Elasticsearch::Model callbacks
    User.create!
    # 2. Call import on the model which should reindex
    # anything you've "let!"
    User.import

    # Sleeping here to allow Elasticsearch test cluster
    # to index the objects we created
    sleep 1
  end

  after do
    User.__elasticsearch__.client.indices.delete index: User.index_name
  end
end

About the Author

Biography

More Content by James Robert Somers
Previous
World's Smallest IaaS, Part 3: the PaaS
World's Smallest IaaS, Part 3: the PaaS

a.k.a. The World’s Smallest PaaS In this blog post, we describe deploying Cloud Foundry/Elastic Runtime to ...

Next
Pivot with PaaS: How PaaS Will Help Your Business Survive and Thrive
Pivot with PaaS: How PaaS Will Help Your Business Survive and Thrive

For many businesses, the digital age has been disruptive. Many companies that were household names in 2000,...