diff options
Diffstat (limited to 'spec/graphql/resolvers/kas')
-rw-r--r-- | spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb | 48 | ||||
-rw-r--r-- | spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb | 66 |
2 files changed, 114 insertions, 0 deletions
diff --git a/spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb b/spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb new file mode 100644 index 00000000000..bdb1ced46ae --- /dev/null +++ b/spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Kas::AgentConfigurationsResolver do + include GraphqlHelpers + + it { expect(described_class.type).to eq(Types::Kas::AgentConfigurationType) } + it { expect(described_class.null).to be_truthy } + it { expect(described_class.field_options).to include(calls_gitaly: true) } + + describe '#resolve' do + let_it_be(:project) { create(:project) } + + let(:user) { create(:user, maintainer_projects: [project]) } + let(:ctx) { Hash(current_user: user) } + + let(:agent1) { double } + let(:agent2) { double } + let(:kas_client) { instance_double(Gitlab::Kas::Client, list_agent_config_files: [agent1, agent2]) } + + subject { resolve(described_class, obj: project, ctx: ctx) } + + before do + allow(Gitlab::Kas::Client).to receive(:new).and_return(kas_client) + end + + it 'returns agents configured for the project' do + expect(subject).to contain_exactly(agent1, agent2) + end + + context 'an error is returned from the KAS client' do + before do + allow(kas_client).to receive(:list_agent_config_files).and_raise(GRPC::DeadlineExceeded) + end + + it 'raises a graphql error' do + expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable, 'GRPC::DeadlineExceeded') + end + end + + context 'user does not have permission' do + let(:user) { create(:user) } + + it { is_expected.to be_empty } + end + end +end diff --git a/spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb b/spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb new file mode 100644 index 00000000000..fe6509bcb3c --- /dev/null +++ b/spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Kas::AgentConnectionsResolver do + include GraphqlHelpers + + it { expect(described_class.type).to eq(Types::Kas::AgentConnectionType) } + it { expect(described_class.null).to be_truthy } + + describe '#resolve' do + let_it_be(:project) { create(:project) } + let_it_be(:agent1) { create(:cluster_agent, project: project) } + let_it_be(:agent2) { create(:cluster_agent, project: project) } + + let(:user) { create(:user, maintainer_projects: [project]) } + let(:ctx) { Hash(current_user: user) } + + let(:connection1) { double(agent_id: agent1.id) } + let(:connection2) { double(agent_id: agent1.id) } + let(:connection3) { double(agent_id: agent2.id) } + let(:connected_agents) { [connection1, connection2, connection3] } + let(:kas_client) { instance_double(Gitlab::Kas::Client, get_connected_agents: connected_agents) } + + subject do + batch_sync do + resolve(described_class, obj: agent1, ctx: ctx) + end + end + + before do + allow(Gitlab::Kas::Client).to receive(:new).and_return(kas_client) + end + + it 'returns active connections for the agent' do + expect(subject).to contain_exactly(connection1, connection2) + end + + it 'queries KAS once when multiple agents are requested' do + expect(kas_client).to receive(:get_connected_agents).once + + response = batch_sync do + resolve(described_class, obj: agent1, ctx: ctx) + resolve(described_class, obj: agent2, ctx: ctx) + end + + expect(response).to contain_exactly(connection3) + end + + context 'an error is returned from the KAS client' do + before do + allow(kas_client).to receive(:get_connected_agents).and_raise(GRPC::DeadlineExceeded) + end + + it 'raises a graphql error' do + expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable, 'GRPC::DeadlineExceeded') + end + end + + context 'user does not have permission' do + let(:user) { create(:user) } + + it { is_expected.to be_empty } + end + end +end |