elasticsearch-persistence/spec/repository/store_spec.rb (239 lines of code) (raw):

# Licensed to Elasticsearch B.V. under one or more contributor # license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright # ownership. Elasticsearch B.V. licenses this file to you under # the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. require 'spec_helper' describe Elasticsearch::Persistence::Repository::Store do let(:repository) do DEFAULT_REPOSITORY end after do begin; repository.delete_index!; rescue; end end describe '#save' do let(:document) do { a: 1 } end let(:response) do repository.save(document) end it 'saves the document' do expect(repository.find(response['_id'])).to eq('a' => 1) end context 'when the repository defines a custom serialize method' do before do class OtherNoteRepository include Elasticsearch::Persistence::Repository def serialize(document) { b: 1 } end end end after do if defined?(OtherNoteRepository) Object.send(:remove_const, OtherNoteRepository.name) end end let(:repository) do OtherNoteRepository.new(client: DEFAULT_CLIENT) end let(:response) do repository.save(document) end it 'saves the document' do expect(repository.find(response['_id'])).to eq('b' => 1) end end end describe '#update' do before(:all) do class Note def to_hash { text: 'testing', views: 0 } end end end after(:all) do if defined?(Note) Object.send(:remove_const, :Note) end end context 'when the document exists' do let!(:id) do repository.save(Note.new)['_id'] end context 'when an id is provided' do context 'when a doc is specified in the options' do before do repository.update(id, doc: { text: 'testing_2' }) end it 'updates using the doc parameter' do expect(repository.find(id)).to eq('text' => 'testing_2', 'views' => 0) end end context 'when a script is specified in the options' do before do repository.update(id, script: { inline: 'ctx._source.views += 1' }) end it 'updates using the script parameter' do expect(repository.find(id)).to eq('text' => 'testing', 'views' => 1) end end context 'when params are specified in the options' do before do repository.update(id, script: { inline: 'ctx._source.views += params.count', params: { count: 2 } }) end it 'updates using the script parameter' do expect(repository.find(id)).to eq('text' => 'testing', 'views' => 2) end end context 'when upsert is specified in the options' do before do repository.update(id, script: { inline: 'ctx._source.views += 1' }, upsert: { text: 'testing_2' }) end it 'executes the script' do expect(repository.find(id)).to eq('text' => 'testing', 'views' => 1) end end context 'when doc_as_upsert is specified in the options' do before do repository.update(id, doc: { text: 'testing_2' }, doc_as_upsert: true) end it 'performs an upsert' do expect(repository.find(id)).to eq('text' => 'testing_2', 'views' => 0) end end end context 'when a document is provided as the query criteria' do context 'when no options are provided' do before do repository.update(id: id, text: 'testing_2') end it 'updates using the id and the document as the doc parameter' do expect(repository.find(id)).to eq('text' => 'testing_2', 'views' => 0) end end context 'when options are provided' do context 'when a doc is specified in the options' do before do repository.update({ id: id, text: 'testing' }, doc: { text: 'testing_2' }) end it 'updates using the id and the doc in the options' do expect(repository.find(id)).to eq('text' => 'testing_2', 'views' => 0) end end context 'when a script is specified in the options' do before do repository.update( { id: id, text: 'testing' }, script: { inline: 'ctx._source.views += 1' } ) end it 'updates using the id and script from the options' do expect(repository.find(id)).to eq('text' => 'testing', 'views' => 1) end end context 'when params are specified in the options' do before do repository.update({ id: id, text: 'testing' }, script: { inline: 'ctx._source.views += params.count', params: { count: 2 } }) end it 'updates using the id and script and params from the options' do expect(repository.find(id)).to eq('text' => 'testing', 'views' => 2) end end context 'when upsert is specified in the options' do before do repository.update({ id: id, text: 'testing_2' }, doc_as_upsert: true) end it 'updates using the id and script and params from the options' do expect(repository.find(id)).to eq('text' => 'testing_2', 'views' => 0) end end end end end context 'when the document does not exist' do context 'when an id is provided 'do it 'raises an exception' do expect { repository.update(1, doc: { text: 'testing_2' }) }.to raise_exception(Elastic::Transport::Transport::Errors::NotFound) end context 'when upsert is provided' do before do repository.update(1, doc: { text: 'testing' }, doc_as_upsert: true) end it 'upserts the document' do expect(repository.find(1)).to eq('text' => 'testing') end end end context 'when a document is provided' do it 'raises an exception' do expect { repository.update(id: 1, text: 'testing_2') }.to raise_exception(Elastic::Transport::Transport::Errors::NotFound) end context 'when upsert is provided' do before do repository.update({ id: 1, text: 'testing' }, doc_as_upsert: true) end it 'upserts the document' do expect(repository.find(1)).to eq('text' => 'testing') end end end end end describe '#delete' do before(:all) do class Note def to_hash { text: 'testing', views: 0 } end end end after(:all) do if defined?(Note) Object.send(:remove_const, :Note) end end context 'when the document exists' do let!(:id) do repository.save(Note.new)['_id'] end context 'an id is provided' do before do repository.delete(id) end it 'deletes the document using the id' do expect { repository.find(id) }.to raise_exception(Elasticsearch::Persistence::Repository::DocumentNotFound) end end context 'when a document is provided' do before do repository.delete(id: id, text: 'testing') end it 'deletes the document using the document' do expect { repository.find(id) }.to raise_exception(Elasticsearch::Persistence::Repository::DocumentNotFound) end end end context 'when the document does not exist' do before do repository.create_index! end it 'raises an exception' do expect { repository.delete(1) }.to raise_exception(Elastic::Transport::Transport::Errors::NotFound) end end end end