Files
ubicloud/spec/lib/victoria_metrics/client_spec.rb
2025-05-01 21:55:32 +05:30

133 lines
4.9 KiB
Ruby

# frozen_string_literal: true
require "spec_helper"
RSpec.describe VictoriaMetrics::Client do
let(:endpoint) { "http://localhost:8428" }
let(:client) { described_class.new(endpoint: endpoint) }
describe "#initialize" do
it "creates a client with the given endpoint" do
expect(client.instance_variable_get(:@endpoint)).to eq(endpoint)
end
it "creates a client with SSL configuration" do
ssl_ca_file_data = "-----BEGIN CERTIFICATE-----\nMOCK_CERT\n-----END CERTIFICATE-----"
client = described_class.new(endpoint: endpoint, ssl_ca_file_data: ssl_ca_file_data)
expect(client.instance_variable_get(:@client)).to be_a(Excon::Connection)
expect(client.instance_variable_get(:@client).data[:ssl_ca_file]).to include("ca_bundles")
end
it "does not write the ca_bundle file if it exists" do
ssl_ca_file_data = "-----BEGIN CERTIFICATE-----\nMOCK_CERT\n-----END CERTIFICATE-----"
ssl_ca_file_name = Digest::SHA256.hexdigest(ssl_ca_file_data)
ca_bundle_filename = File.join(Dir.pwd, "var", "ca_bundles", ssl_ca_file_name + ".crt")
expect(File).to receive(:exist?).with(ca_bundle_filename).and_return(true)
expect(File).not_to receive(:write)
described_class.new(endpoint: endpoint, ssl_ca_file_data: ssl_ca_file_data)
end
it "writes the ca_bundle file if it does not exist" do
ssl_ca_file_data = "-----BEGIN CERTIFICATE-----\nMOCK_CERT\n-----END CERTIFICATE-----"
ssl_ca_file_name = Digest::SHA256.hexdigest(ssl_ca_file_data)
ca_bundle_filename = File.join(Dir.pwd, "var", "ca_bundles", ssl_ca_file_name + ".crt")
expect(File).to receive(:exist?).with(ca_bundle_filename).and_return(false)
expect(File).to receive(:write)
expect(File).to receive(:rename).with("#{ca_bundle_filename}.tmp", ca_bundle_filename)
described_class.new(endpoint: endpoint, ssl_ca_file_data: ssl_ca_file_data)
end
context "with authentication" do
let(:username) { "user" }
let(:password) { "pass" }
let(:client) { described_class.new(endpoint: endpoint, username: username, password: password) }
it "creates a client with authentication credentials" do
expect(client.instance_variable_get(:@username)).to eq(username)
expect(client.instance_variable_get(:@password)).to eq(password)
end
end
end
describe "#health" do
context "when the service is healthy" do
before do
stub_request(:get, "#{endpoint}/health")
.to_return(status: 200)
end
it "returns true" do
expect(client.health).to be true
end
end
context "when the service is unhealthy" do
before do
stub_request(:get, "#{endpoint}/health")
.to_return(status: 500)
end
it "raises an error" do
expect { client.health }.to raise_error(VictoriaMetrics::ClientError)
end
end
end
describe "#send_request" do
context "with authentication" do
let(:username) { "user" }
let(:password) { "pass" }
let(:client) { described_class.new(endpoint: endpoint, username: username, password: password) }
before do
stub_request(:get, "#{endpoint}/test")
.with(headers: {"Authorization" => "Basic #{Base64.strict_encode64("#{username}:#{password}")}"})
.to_return(status: 200)
end
it "includes authentication headers" do
client.send(:send_request, "GET", "/test")
expect(WebMock).to have_requested(:get, "#{endpoint}/test")
.with(headers: {"Authorization" => "Basic #{Base64.strict_encode64("#{username}:#{password}")}"})
end
end
context "with different response status codes" do
it "handles 200 status code" do
stub_request(:get, "#{endpoint}/test")
.to_return(status: 200)
response = client.send(:send_request, "GET", "/test")
expect(response.status).to eq(200)
end
it "handles 204 status code" do
stub_request(:get, "#{endpoint}/test")
.to_return(status: 204)
response = client.send(:send_request, "GET", "/test")
expect(response.status).to eq(204)
end
it "handles 206 status code" do
stub_request(:get, "#{endpoint}/test")
.to_return(status: 206)
response = client.send(:send_request, "GET", "/test")
expect(response.status).to eq(206)
end
it "handles 404 status code" do
stub_request(:get, "#{endpoint}/test")
.to_return(status: 404)
response = client.send(:send_request, "GET", "/test")
expect(response.status).to eq(404)
end
it "raises error for 500 status code" do
stub_request(:get, "#{endpoint}/test")
.to_return(status: 500, body: "Internal Server Error")
expect { client.send(:send_request, "GET", "/test") }.to raise_error(VictoriaMetrics::ClientError, "VictoriaMetrics Client error, method: GET, path: /test, status code: 500")
end
end
end
end