diff options
Diffstat (limited to 'spec/lib/gitlab/kas/client_spec.rb')
-rw-r--r-- | spec/lib/gitlab/kas/client_spec.rb | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/spec/lib/gitlab/kas/client_spec.rb b/spec/lib/gitlab/kas/client_spec.rb new file mode 100644 index 00000000000..7bf2d30ca48 --- /dev/null +++ b/spec/lib/gitlab/kas/client_spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Kas::Client do + let_it_be(:project) { create(:project) } + + describe '#initialize' do + context 'kas is not enabled' do + before do + allow(Gitlab::Kas).to receive(:enabled?).and_return(false) + end + + it 'raises a configuration error' do + expect { described_class.new }.to raise_error(described_class::ConfigurationError, 'GitLab KAS is not enabled') + end + end + + context 'internal url is not set' do + before do + allow(Gitlab::Kas).to receive(:enabled?).and_return(true) + allow(Gitlab::Kas).to receive(:internal_url).and_return(nil) + end + + it 'raises a configuration error' do + expect { described_class.new }.to raise_error(described_class::ConfigurationError, 'KAS internal URL is not configured') + end + end + end + + describe 'gRPC calls' do + let(:token) { instance_double(JSONWebToken::HMACToken, encoded: 'test-token') } + + before do + allow(Gitlab::Kas).to receive(:enabled?).and_return(true) + allow(Gitlab::Kas).to receive(:internal_url).and_return('grpc://example.kas.internal') + + expect(JSONWebToken::HMACToken).to receive(:new) + .with(Gitlab::Kas.secret) + .and_return(token) + + expect(token).to receive(:issuer=).with(Settings.gitlab.host) + expect(token).to receive(:audience=).with(described_class::JWT_AUDIENCE) + end + + describe '#list_agent_config_files' do + let(:stub) { instance_double(Gitlab::Agent::ConfigurationProject::Rpc::ConfigurationProject::Stub) } + + let(:request) { instance_double(Gitlab::Agent::ConfigurationProject::Rpc::ListAgentConfigFilesRequest) } + let(:response) { double(Gitlab::Agent::ConfigurationProject::Rpc::ListAgentConfigFilesResponse, config_files: agent_configurations) } + + let(:repository) { instance_double(Gitlab::Agent::Modserver::Repository) } + let(:gitaly_address) { instance_double(Gitlab::Agent::Modserver::GitalyAddress) } + + let(:agent_configurations) { [double] } + + subject { described_class.new.list_agent_config_files(project: project) } + + before do + expect(Gitlab::Agent::ConfigurationProject::Rpc::ConfigurationProject::Stub).to receive(:new) + .with('example.kas.internal', :this_channel_is_insecure, timeout: described_class::TIMEOUT) + .and_return(stub) + + expect(Gitlab::Agent::Modserver::Repository).to receive(:new) + .with(project.repository.gitaly_repository.to_h) + .and_return(repository) + + expect(Gitlab::Agent::Modserver::GitalyAddress).to receive(:new) + .with(Gitlab::GitalyClient.connection_data(project.repository_storage)) + .and_return(gitaly_address) + + expect(Gitlab::Agent::ConfigurationProject::Rpc::ListAgentConfigFilesRequest).to receive(:new) + .with(repository: repository, gitaly_address: gitaly_address) + .and_return(request) + + expect(stub).to receive(:list_agent_config_files) + .with(request, metadata: { 'authorization' => 'bearer test-token' }) + .and_return(response) + end + + it { expect(subject).to eq(agent_configurations) } + end + end +end |