debian-mirror-gitlab/elasticsearch-model/spec/elasticsearch/model/adapters/active_record/import_spec.rb
2020-03-13 15:44:24 +05:30

187 lines
5.3 KiB
Ruby

require 'spec_helper'
describe 'Elasticsearch::Model::Adapter::ActiveRecord Importing' do
before(:all) do
ActiveRecord::Schema.define(:version => 1) do
create_table :import_articles do |t|
t.string :title
t.integer :views
t.string :numeric # For the sake of invalid data sent to Elasticsearch
t.datetime :created_at, :default => 'NOW()'
end
end
ImportArticle.delete_all
ImportArticle.__elasticsearch__.client.cluster.health(wait_for_status: 'yellow')
end
before do
ImportArticle.__elasticsearch__.create_index!
end
after do
clear_indices(ImportArticle)
clear_tables(ImportArticle)
end
describe '#import' do
context 'when no search criteria is specified' do
before do
10.times { |i| ImportArticle.create! title: 'Test', views: "#{i}" }
ImportArticle.import
ImportArticle.__elasticsearch__.refresh_index!
end
it 'imports all documents' do
expect(ImportArticle.search('*').results.total).to eq(10)
end
end
context 'when batch size is specified' do
before do
10.times { |i| ImportArticle.create! title: 'Test', views: "#{i}" }
end
let!(:batch_count) do
batches = 0
errors = ImportArticle.import(batch_size: 5) do |response|
batches += 1
end
ImportArticle.__elasticsearch__.refresh_index!
batches
end
it 'imports using the batch size' do
expect(batch_count).to eq(2)
end
it 'imports all the documents' do
expect(ImportArticle.search('*').results.total).to eq(10)
end
end
context 'when a scope is specified' do
before do
10.times { |i| ImportArticle.create! title: 'Test', views: "#{i}" }
ImportArticle.import(scope: 'popular', force: true)
ImportArticle.__elasticsearch__.refresh_index!
end
it 'applies the scope' do
expect(ImportArticle.search('*').results.total).to eq(5)
end
end
context 'when a query is specified' do
before do
10.times { |i| ImportArticle.create! title: 'Test', views: "#{i}" }
ImportArticle.import(query: -> { where('views >= 3') })
ImportArticle.__elasticsearch__.refresh_index!
end
it 'applies the query' do
expect(ImportArticle.search('*').results.total).to eq(7)
end
end
context 'when there are invalid documents' do
let!(:result) do
10.times { |i| ImportArticle.create! title: 'Test', views: "#{i}" }
new_article
batches = 0
errors = ImportArticle.__elasticsearch__.import(batch_size: 5) do |response|
batches += 1
end
ImportArticle.__elasticsearch__.refresh_index!
{ batch_size: batches, errors: errors}
end
let(:new_article) do
ImportArticle.create!(title: "Test INVALID", numeric: "INVALID")
end
it 'does not import them' do
expect(ImportArticle.search('*').results.total).to eq(10)
expect(result[:batch_size]).to eq(3)
expect(result[:errors]).to eq(1)
end
end
context 'when a transform proc is specified' do
before do
10.times { |i| ImportArticle.create! title: 'Test', views: "#{i}" }
ImportArticle.import( transform: ->(a) {{ index: { data: { name: a.title, foo: 'BAR' } }}} )
ImportArticle.__elasticsearch__.refresh_index!
end
it 'transforms the documents' do
expect(ImportArticle.search('*').results.first._source.keys).to include('name')
expect(ImportArticle.search('*').results.first._source.keys).to include('foo')
end
it 'imports all documents' do
expect(ImportArticle.search('test').results.total).to eq(10)
expect(ImportArticle.search('bar').results.total).to eq(10)
end
end
context 'when the model has a default scope' do
around(:all) do |example|
10.times { |i| ImportArticle.create! title: 'Test', views: "#{i}" }
ImportArticle.instance_eval { default_scope { where('views > 3') } }
example.run
ImportArticle.default_scopes.pop
end
before do
ImportArticle.__elasticsearch__.import
ImportArticle.__elasticsearch__.refresh_index!
end
it 'uses the default scope' do
expect(ImportArticle.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| ImportArticle.create! title: 'Test', views: "#{i}" }
ImportArticle.instance_eval { default_scope { where('views > 3') } }
example.run
ImportArticle.default_scopes.pop
end
before do
ImportArticle.import(query: -> { where('views <= 4') })
ImportArticle.__elasticsearch__.refresh_index!
end
it 'combines the query and the default scope' do
expect(ImportArticle.search('*').results.total).to eq(1)
end
end
context 'when the batch is empty' do
before do
ImportArticle.delete_all
ImportArticle.import
ImportArticle.__elasticsearch__.refresh_index!
end
it 'does not make any requests to create documents' do
expect(ImportArticle.search('*').results.total).to eq(0)
end
end
end
end