267 lines
7.4 KiB
Ruby
267 lines
7.4 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe Elasticsearch::Model::Adapter::Mongoid, if: test_mongoid? do
|
|
|
|
before(:all) do
|
|
connect_mongoid('mongoid_test')
|
|
Elasticsearch::Model::Adapter.register \
|
|
Elasticsearch::Model::Adapter::Mongoid,
|
|
lambda { |klass| !!defined?(::Mongoid::Document) && klass.respond_to?(:ancestors) && klass.ancestors.include?(::Mongoid::Document) }
|
|
|
|
MongoidArticle.__elasticsearch__.create_index! force: true
|
|
|
|
MongoidArticle.delete_all
|
|
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
MongoidArticle.__elasticsearch__.client.cluster.health wait_for_status: 'yellow'
|
|
end
|
|
|
|
after do
|
|
clear_indices(MongoidArticle)
|
|
clear_tables(MongoidArticle)
|
|
end
|
|
|
|
describe 'searching' do
|
|
|
|
before do
|
|
MongoidArticle.create! title: 'Test'
|
|
MongoidArticle.create! title: 'Testing Coding'
|
|
MongoidArticle.create! title: 'Coding'
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
end
|
|
|
|
let(:search_result) do
|
|
MongoidArticle.search('title:test')
|
|
end
|
|
|
|
it 'find the documents successfully' do
|
|
expect(search_result.results.size).to eq(2)
|
|
expect(search_result.records.size).to eq(2)
|
|
end
|
|
|
|
describe '#results' do
|
|
|
|
it 'returns a Elasticsearch::Model::Response::Result' do
|
|
expect(search_result.results.first).to be_a(Elasticsearch::Model::Response::Result)
|
|
end
|
|
|
|
it 'retrieves the document from Elasticsearch' do
|
|
expect(search_result.results.first.title).to eq('Test')
|
|
end
|
|
|
|
it 'retrieves all results' do
|
|
expect(search_result.results.collect(&:title)).to match(['Test', 'Testing Coding'])
|
|
end
|
|
end
|
|
|
|
describe '#records' do
|
|
|
|
it 'returns an instance of the model' do
|
|
expect(search_result.records.first).to be_a(MongoidArticle)
|
|
end
|
|
|
|
it 'retrieves the document from Elasticsearch' do
|
|
expect(search_result.records.first.title).to eq('Test')
|
|
end
|
|
|
|
it 'iterates over the records' do
|
|
expect(search_result.records.first.title).to eq('Test')
|
|
end
|
|
|
|
it 'retrieves all records' do
|
|
expect(search_result.records.collect(&:title)).to match(['Test', 'Testing Coding'])
|
|
end
|
|
|
|
describe '#each_with_hit' do
|
|
|
|
it 'yields each hit with the model object' do
|
|
search_result.records.each_with_hit do |r, h|
|
|
expect(h._source).not_to be_nil
|
|
expect(h._source.title).not_to be_nil
|
|
end
|
|
end
|
|
|
|
it 'preserves the search order' do
|
|
search_result.records.each_with_hit do |r, h|
|
|
expect(r.id.to_s).to eq(h._id)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#map_with_hit' do
|
|
|
|
it 'yields each hit with the model object' do
|
|
search_result.records.map_with_hit do |r, h|
|
|
expect(h._source).not_to be_nil
|
|
expect(h._source.title).not_to be_nil
|
|
end
|
|
end
|
|
|
|
it 'preserves the search order' do
|
|
search_result.records.map_with_hit do |r, h|
|
|
expect(r.id.to_s).to eq(h._id)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#destroy' do
|
|
|
|
let(:article) do
|
|
MongoidArticle.create!(title: 'Test')
|
|
end
|
|
|
|
before do
|
|
article
|
|
MongoidArticle.create!(title: 'Coding')
|
|
article.destroy
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
end
|
|
|
|
it 'removes documents from the index' do
|
|
expect(MongoidArticle.search('title:test').results.total).to eq(0)
|
|
expect(MongoidArticle.search('title:code').results.total).to eq(1)
|
|
end
|
|
end
|
|
|
|
describe 'updates to the document' do
|
|
|
|
let(:article) do
|
|
MongoidArticle.create!(title: 'Test')
|
|
end
|
|
|
|
before do
|
|
article.title = 'Writing'
|
|
article.save
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
end
|
|
|
|
it 'indexes updates' do
|
|
expect(MongoidArticle.search('title:write').results.total).to eq(1)
|
|
expect(MongoidArticle.search('title:test').results.total).to eq(0)
|
|
end
|
|
end
|
|
|
|
describe 'DSL search' do
|
|
|
|
before do
|
|
MongoidArticle.create! title: 'Test'
|
|
MongoidArticle.create! title: 'Testing Coding'
|
|
MongoidArticle.create! title: 'Coding'
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
end
|
|
|
|
let(:search_result) do
|
|
MongoidArticle.search(query: { match: { title: { query: 'test' } } })
|
|
end
|
|
|
|
it 'finds the matching documents' do
|
|
expect(search_result.results.size).to eq(2)
|
|
expect(search_result.records.size).to eq(2)
|
|
end
|
|
end
|
|
|
|
describe 'paging a collection' do
|
|
|
|
before do
|
|
MongoidArticle.create! title: 'Test'
|
|
MongoidArticle.create! title: 'Testing Coding'
|
|
MongoidArticle.create! title: 'Coding'
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
end
|
|
|
|
let(:search_result) do
|
|
MongoidArticle.search(query: { match: { title: { query: 'test' } } },
|
|
size: 2,
|
|
from: 1)
|
|
end
|
|
|
|
it 'applies the size and from parameters' do
|
|
expect(search_result.results.size).to eq(1)
|
|
expect(search_result.results.first.title).to eq('Testing Coding')
|
|
expect(search_result.records.size).to eq(1)
|
|
expect(search_result.records.first.title).to eq('Testing Coding')
|
|
end
|
|
end
|
|
|
|
describe 'importing' do
|
|
|
|
before do
|
|
97.times { |i| MongoidArticle.create! title: "Test #{i}" }
|
|
MongoidArticle.__elasticsearch__.create_index! force: true
|
|
MongoidArticle.__elasticsearch__.client.cluster.health wait_for_status: 'yellow'
|
|
end
|
|
|
|
context 'when there is no default scope' do
|
|
|
|
let!(:batch_count) do
|
|
batches = 0
|
|
errors = MongoidArticle.import(batch_size: 10) do |response|
|
|
batches += 1
|
|
end
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
batches
|
|
end
|
|
|
|
it 'imports all the documents' do
|
|
expect(MongoidArticle.search('*').results.total).to eq(97)
|
|
end
|
|
|
|
it 'uses the specified batch size' do
|
|
expect(batch_count).to eq(10)
|
|
end
|
|
end
|
|
|
|
context 'when there is a default scope' do
|
|
|
|
around(:all) do |example|
|
|
10.times { |i| MongoidArticle.create! title: 'Test', views: "#{i}" }
|
|
MongoidArticle.default_scope -> { MongoidArticle.gt(views: 3) }
|
|
example.run
|
|
MongoidArticle.default_scoping = nil
|
|
end
|
|
|
|
before do
|
|
MongoidArticle.__elasticsearch__.import
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
end
|
|
|
|
it 'uses the default scope' do
|
|
expect(MongoidArticle.search('*').results.total).to eq(6)
|
|
end
|
|
end
|
|
|
|
context 'when there is a default scope and a query specified' do
|
|
|
|
around(:all) do |example|
|
|
10.times { |i| MongoidArticle.create! title: 'Test', views: "#{i}" }
|
|
MongoidArticle.default_scope -> { MongoidArticle.gt(views: 3) }
|
|
example.run
|
|
MongoidArticle.default_scoping = nil
|
|
end
|
|
|
|
before do
|
|
MongoidArticle.import(query: -> { lte(views: 4) })
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
end
|
|
|
|
it 'combines the query and the default scope' do
|
|
expect(MongoidArticle.search('*').results.total).to eq(1)
|
|
end
|
|
end
|
|
|
|
context 'when the batch is empty' do
|
|
|
|
before do
|
|
MongoidArticle.delete_all
|
|
MongoidArticle.import
|
|
MongoidArticle.__elasticsearch__.refresh_index!
|
|
end
|
|
|
|
it 'does not make any requests to create documents' do
|
|
expect(MongoidArticle.search('*').results.total).to eq(0)
|
|
end
|
|
end
|
|
end
|
|
end
|