debian-mirror-gitlab/elasticsearch-rails/spec/instrumentation_spec.rb
2020-03-13 15:44:24 +05:30

82 lines
2.4 KiB
Ruby

require 'spec_helper'
describe 'ActiveSupport::Instrumentation integration' do
before(:all) do
class DummyInstrumentationModel
extend Elasticsearch::Model::Searching::ClassMethods
def self.index_name; 'foo'; end
def self.document_type; 'bar'; end
end
end
after(:all) do
remove_classes(DummyInstrumentationModel)
end
let(:response_document) do
{ 'took' => '5ms',
'hits' => { 'total' => 123,
'max_score' => 456,
'hits' => [] } }
end
let(:search) do
Elasticsearch::Model::Searching::SearchRequest.new(DummyInstrumentationModel, 'foo')
end
let(:client) do
double('client', search: response_document)
end
before do
allow(DummyInstrumentationModel).to receive(:client).and_return(client)
Elasticsearch::Rails::Instrumentation::Railtie.run_initializers
end
context 'SearchRequest#execute!' do
it 'wraps the method with instrumentation' do
expect(search).to respond_to(:execute_without_instrumentation!)
expect(search).to respond_to(:execute_with_instrumentation!)
end
end
context 'Model#search' do
before do
expect(ActiveSupport::Notifications).to receive(:instrument).with('search.elasticsearch',
{ klass: 'DummyInstrumentationModel',
name: 'Search',
search: { body: query,
index: 'foo',
type: 'bar' } }).and_return({})
end
let(:query) do
{ query: { match: { foo: 'bar' } } }
end
let(:logged_message) do
@logger.logged(:debug).first
end
it 'publishes a notification' do
expect(DummyInstrumentationModel.search(query).response).to eq({})
end
context 'when a message is logged', unless: defined?(RUBY_VERSION) && RUBY_VERSION > '2.2' do
let(:query) do
{ query: { match: { moo: 'bam' } } }
end
it 'prints the debug information to the log' do
expect(logged_message).to match(/DummyInstrumentationModel Search \(\d+\.\d+ms\)/)
expect(logged_message).to match(/body\: \{query\: \{match\: \{moo\: "bam"\}\}\}\}/)
end
end
end
end