elasticsearch/spec/unit/elasticsearch_product_validation_spec.rb (112 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'
require 'webmock/rspec'
describe 'Elasticsearch: Validation' do
let(:host) { 'http://localhost:9200' }
let(:count_request_stub) do
stub_request(:get, "#{host}/_count")
.to_return(status: status, body: nil, headers: headers)
end
let(:status) { 200 }
let(:body) { nil }
let(:headers) { {} }
let(:client) { Elasticsearch::Client.new }
context 'When Elasticsearch replies with status 401' do
let(:status) { 401 }
it 'Verifies the request but shows a warning' do
stderr = $stderr
fake_stderr = StringIO.new
$stderr = fake_stderr
expect(client.instance_variable_get('@verified')).to be false
count_request_stub
expect do
client.count
end.to raise_error Elastic::Transport::Transport::Errors::Unauthorized
expect(client.instance_variable_get('@verified')).to be true
fake_stderr.rewind
expect(fake_stderr.string).to eq("#{Elasticsearch::SECURITY_PRIVILEGES_VALIDATION_WARNING}\n")
ensure
$stderr = stderr
end
end
context 'When Elasticsearch replies with status 403' do
let(:status) { 403 }
it 'Verifies the request but shows a warning' do
stderr = $stderr
fake_stderr = StringIO.new
$stderr = fake_stderr
expect(client.instance_variable_get('@verified')).to be false
count_request_stub
expect do
client.count
end.to raise_error Elastic::Transport::Transport::Errors::Forbidden
expect(client.instance_variable_get('@verified')).to be true
fake_stderr.rewind
expect(fake_stderr.string).to eq("#{Elasticsearch::SECURITY_PRIVILEGES_VALIDATION_WARNING}\n")
ensure
$stderr = stderr
end
end
context 'When Elasticsearch replies with status 413' do
let(:status) { 413 }
it 'Verifies the request and shows a warning' do
stderr = $stderr
fake_stderr = StringIO.new
$stderr = fake_stderr
expect(client.instance_variable_get('@verified')).to be false
count_request_stub
expect do
client.count
end.to raise_error Elastic::Transport::Transport::Errors::RequestEntityTooLarge
expect(client.instance_variable_get('@verified')).to be true
fake_stderr.rewind
expect(fake_stderr.string.delete("\n"))
.to eq(Elasticsearch::SECURITY_PRIVILEGES_VALIDATION_WARNING)
ensure
$stderr = stderr
end
end
context 'When Elasticsearch replies with status 503' do
let(:status) { 503 }
let(:body) { {}.to_json }
it 'Does not verify the request and shows a warning' do
stderr = $stderr
fake_stderr = StringIO.new
$stderr = fake_stderr
expect(client.instance_variable_get('@verified')).to be false
count_request_stub
expect do
client.count
end.to raise_error Elastic::Transport::Transport::Errors::ServiceUnavailable
expect(client.instance_variable_get('@verified')).to be false
fake_stderr.rewind
expect(fake_stderr.string)
.to eq(
<<~MSG
The client is unable to verify that the server is \
Elasticsearch. Some functionality may not be compatible \
if the server is running an unsupported product.
MSG
)
ensure
$stderr = stderr
end
end
context 'When the header is present' do
let(:headers) { { 'X-Elastic-Product' => 'Elasticsearch' } }
it 'Makes requests and passes validation' do
expect(client.instance_variable_get('@verified')).to be false
count_request_stub
client.count
expect(client.instance_variable_get('@verified')).to be true
end
end
context 'When the header is not present' do
it 'Fails validation' do
expect(client.instance_variable_get('@verified')).to be false
stub_request(:get, "#{host}/_cluster/health")
.to_return(status: status, body: nil, headers: {})
expect { client.cluster.health }.to raise_error Elasticsearch::UnsupportedProductError, Elasticsearch::NOT_ELASTICSEARCH_WARNING
expect(client.instance_variable_get('@verified')).to be false
end
end
end