summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/kas/client_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/kas/client_spec.rb')
-rw-r--r--spec/lib/gitlab/kas/client_spec.rb84
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