Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/requests/api/graphql/ci/runner_spec.rb')
-rw-r--r--spec/requests/api/graphql/ci/runner_spec.rb111
1 files changed, 94 insertions, 17 deletions
diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb
index e1f84d23209..cdd46ca4ecc 100644
--- a/spec/requests/api/graphql/ci/runner_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_spec.rb
@@ -5,25 +5,25 @@ require 'spec_helper'
RSpec.describe 'Query.runner(id)' do
include GraphqlHelpers
- let_it_be(:user) { create_default(:user, :admin) }
+ let_it_be(:user) { create(:user, :admin) }
- let_it_be(:active_runner) do
+ let_it_be(:active_instance_runner) do
create(:ci_runner, :instance, description: 'Runner 1', contacted_at: 2.hours.ago,
active: true, version: 'adfe156', revision: 'a', locked: true, ip_address: '127.0.0.1', maximum_timeout: 600,
access_level: 0, tag_list: %w[tag1 tag2], run_untagged: true)
end
- let_it_be(:inactive_runner) do
+ let_it_be(:inactive_instance_runner) do
create(:ci_runner, :instance, description: 'Runner 2', contacted_at: 1.day.ago, active: false,
version: 'adfe157', revision: 'b', ip_address: '10.10.10.10', access_level: 1, run_untagged: true)
end
def get_runner(id)
case id
- when :active_runner
- active_runner
- when :inactive_runner
- inactive_runner
+ when :active_instance_runner
+ active_instance_runner
+ when :inactive_instance_runner
+ inactive_instance_runner
end
end
@@ -59,7 +59,9 @@ RSpec.describe 'Query.runner(id)' do
'accessLevel' => runner.access_level.to_s.upcase,
'runUntagged' => runner.run_untagged,
'ipAddress' => runner.ip_address,
- 'runnerType' => 'INSTANCE_TYPE'
+ 'runnerType' => 'INSTANCE_TYPE',
+ 'jobCount' => 0,
+ 'projectCount' => nil
)
expect(runner_data['tagList']).to match_array runner.tag_list
end
@@ -84,38 +86,113 @@ RSpec.describe 'Query.runner(id)' do
end
describe 'for active runner' do
- it_behaves_like 'runner details fetch', :active_runner
+ it_behaves_like 'runner details fetch', :active_instance_runner
+
+ context 'when tagList is not requested' do
+ let(:query) do
+ wrap_fields(query_graphql_path(query_path, 'id'))
+ end
+
+ let(:query_path) do
+ [
+ [:runner, { id: active_instance_runner.to_global_id.to_s }]
+ ]
+ end
+
+ it 'does not retrieve tagList' do
+ post_graphql(query, current_user: user)
+
+ runner_data = graphql_data_at(:runner)
+ expect(runner_data).not_to be_nil
+ expect(runner_data).not_to include('tagList')
+ end
+ end
end
describe 'for inactive runner' do
- it_behaves_like 'runner details fetch', :inactive_runner
+ it_behaves_like 'runner details fetch', :inactive_instance_runner
+ end
+
+ describe 'for multiple runners' do
+ let_it_be(:project1) { create(:project, :test_repo) }
+ let_it_be(:project2) { create(:project, :test_repo) }
+ let_it_be(:project_runner1) { create(:ci_runner, :project, projects: [project1, project2], description: 'Runner 1') }
+ let_it_be(:project_runner2) { create(:ci_runner, :project, projects: [], description: 'Runner 2') }
+
+ let!(:job) { create(:ci_build, runner: project_runner1) }
+
+ context 'requesting project and job counts' do
+ let(:query) do
+ %(
+ query {
+ projectRunner1: runner(id: "#{project_runner1.to_global_id}") {
+ projectCount
+ jobCount
+ }
+ projectRunner2: runner(id: "#{project_runner2.to_global_id}") {
+ projectCount
+ jobCount
+ }
+ activeInstanceRunner: runner(id: "#{active_instance_runner.to_global_id}") {
+ projectCount
+ jobCount
+ }
+ }
+ )
+ end
+
+ before do
+ project_runner2.projects.clear
+
+ post_graphql(query, current_user: user)
+ end
+
+ it 'retrieves expected fields' do
+ runner1_data = graphql_data_at(:project_runner1)
+ runner2_data = graphql_data_at(:project_runner2)
+ runner3_data = graphql_data_at(:active_instance_runner)
+
+ expect(runner1_data).to match a_hash_including(
+ 'jobCount' => 1,
+ 'projectCount' => 2)
+ expect(runner2_data).to match a_hash_including(
+ 'jobCount' => 0,
+ 'projectCount' => 0)
+ expect(runner3_data).to match a_hash_including(
+ 'jobCount' => 0,
+ 'projectCount' => nil)
+ end
+ end
end
describe 'by regular user' do
- let(:user) { create_default(:user) }
+ let(:user) { create(:user) }
- it_behaves_like 'retrieval by unauthorized user', :active_runner
+ it_behaves_like 'retrieval by unauthorized user', :active_instance_runner
end
describe 'by unauthenticated user' do
let(:user) { nil }
- it_behaves_like 'retrieval by unauthorized user', :active_runner
+ it_behaves_like 'retrieval by unauthorized user', :active_instance_runner
end
describe 'Query limits' do
def runner_query(runner)
<<~SINGLE
runner(id: "#{runner.to_global_id}") {
- #{all_graphql_fields_for('CiRunner')}
+ #{all_graphql_fields_for('CiRunner', excluded: excluded_fields)}
}
SINGLE
end
+ # Currently excluding a known N+1 issue, see https://gitlab.com/gitlab-org/gitlab/-/issues/334759
+ let(:excluded_fields) { %w[jobCount] }
+
let(:single_query) do
<<~QUERY
{
- active: #{runner_query(active_runner)}
+ active: #{runner_query(active_instance_runner)}
}
QUERY
end
@@ -123,8 +200,8 @@ RSpec.describe 'Query.runner(id)' do
let(:double_query) do
<<~QUERY
{
- active: #{runner_query(active_runner)}
- inactive: #{runner_query(inactive_runner)}
+ active: #{runner_query(active_instance_runner)}
+ inactive: #{runner_query(inactive_instance_runner)}
}
QUERY
end