122 lines
3.4 KiB
Ruby
122 lines
3.4 KiB
Ruby
require 'spec_helper'
|
|
require 'active_support/json/encoding'
|
|
|
|
describe Elasticsearch::Model::Response::Result do
|
|
|
|
let(:result) do
|
|
described_class.new(foo: 'bar', bar: { bam: 'baz' })
|
|
end
|
|
|
|
it 'provides access to the properties' do
|
|
expect(result.foo).to eq('bar')
|
|
expect(result.bar.bam).to eq('baz')
|
|
expect { result.xoxo }.to raise_exception(NoMethodError)
|
|
end
|
|
|
|
describe '#id' do
|
|
|
|
let(:result) do
|
|
described_class.new(foo: 'bar', _id: 42, _source: { id: 12 })
|
|
end
|
|
|
|
it 'returns the _id field' do
|
|
expect(result.id).to eq(42)
|
|
end
|
|
|
|
it 'provides access to the source id field' do
|
|
expect(result._source.id).to eq(12)
|
|
end
|
|
end
|
|
|
|
describe '#type' do
|
|
|
|
let(:result) do
|
|
described_class.new(foo: 'bar', _type: 'baz', _source: { type: 'BAM' })
|
|
end
|
|
|
|
it 'returns the _type field' do
|
|
expect(result.type).to eq('baz')
|
|
end
|
|
|
|
it 'provides access to the source type field' do
|
|
expect(result._source.type).to eq('BAM')
|
|
end
|
|
end
|
|
|
|
describe 'method delegation' do
|
|
|
|
let(:result) do
|
|
described_class.new(foo: 'bar', _source: { bar: { bam: 'baz' } })
|
|
end
|
|
|
|
it 'provides access to the _source field via a method' do
|
|
expect(result._source).to eq('bar' => { 'bam' => 'baz' })
|
|
end
|
|
|
|
it 'is recognized by #method' do
|
|
expect(result.method :bar).to be_a Method
|
|
end
|
|
|
|
it 'respond_to? still works' do
|
|
expect(result.respond_to? :bar).to be true
|
|
end
|
|
|
|
context 'when methods map to keys in subdocuments of the response from Elasticsearch' do
|
|
|
|
it 'provides access to top level fields via a method' do
|
|
expect(result.foo).to eq('bar')
|
|
expect(result.fetch(:foo)).to eq('bar')
|
|
expect(result.fetch(:does_not_exist, 'moo')).to eq('moo')
|
|
end
|
|
|
|
it 'responds to hash methods' do
|
|
expect(result.keys).to eq(['foo', '_source'])
|
|
expect(result.to_hash).to eq('foo' => 'bar', '_source' => { 'bar' => { 'bam' => 'baz' } })
|
|
end
|
|
|
|
it 'provides access to fields in the _source subdocument via a method' do
|
|
expect(result.bar).to eq('bam' => 'baz')
|
|
expect(result.bar.bam).to eq('baz')
|
|
expect(result._source.bar).to eq('bam' => 'baz')
|
|
expect(result._source.bar.bam).to eq('baz')
|
|
end
|
|
|
|
context 'when boolean methods are called' do
|
|
|
|
it 'provides access to top level fields via a method' do
|
|
expect(result.foo?).to eq(true)
|
|
expect(result.boo?).to eq(false)
|
|
end
|
|
|
|
it 'delegates to fields in the _source subdocument via a method' do
|
|
expect(result.bar?).to eq(true)
|
|
expect(result.bar.bam?).to eq(true)
|
|
expect(result.boo?).to eq(false)
|
|
expect(result.bar.boo?).to eq(false)
|
|
expect(result._source.bar?).to eq(true)
|
|
expect(result._source.bar.bam?).to eq(true)
|
|
expect(result._source.boo?).to eq(false)
|
|
expect(result._source.bar.boo?).to eq(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when methods do not map to keys in subdocuments of the response from Elasticsearch' do
|
|
|
|
it 'raises a NoMethodError' do
|
|
expect { result.does_not_exist }.to raise_exception(NoMethodError)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#as_json' do
|
|
|
|
let(:result) do
|
|
described_class.new(foo: 'bar', _source: { bar: { bam: 'baz' } })
|
|
end
|
|
|
|
it 'returns a json string' do
|
|
expect(result.as_json(except: 'foo')).to eq({'_source'=>{'bar'=>{'bam'=>'baz'}}})
|
|
end
|
|
end
|
|
end
|