debian-mirror-gitlab/elasticsearch-model/spec/elasticsearch/model/adapters/mongoid/basic_spec.rb
2020-03-09 13:42:32 +05:30

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