diff options
Diffstat (limited to 'spec/requests/api/graphql/ci')
-rw-r--r-- | spec/requests/api/graphql/ci/jobs_spec.rb | 6 | ||||
-rw-r--r-- | spec/requests/api/graphql/ci/pipelines_spec.rb | 1 | ||||
-rw-r--r-- | spec/requests/api/graphql/ci/runner_spec.rb | 111 |
3 files changed, 101 insertions, 17 deletions
diff --git a/spec/requests/api/graphql/ci/jobs_spec.rb b/spec/requests/api/graphql/ci/jobs_spec.rb index 3fb89d6e815..10f05efa1b8 100644 --- a/spec/requests/api/graphql/ci/jobs_spec.rb +++ b/spec/requests/api/graphql/ci/jobs_spec.rb @@ -38,9 +38,15 @@ RSpec.describe 'Query.project.pipeline' do name groups { nodes { + detailedStatus { + id + } name jobs { nodes { + detailedStatus { + id + } name needs { nodes { #{all_graphql_fields_for('CiBuildNeed')} } diff --git a/spec/requests/api/graphql/ci/pipelines_spec.rb b/spec/requests/api/graphql/ci/pipelines_spec.rb index f207636283f..6587061094d 100644 --- a/spec/requests/api/graphql/ci/pipelines_spec.rb +++ b/spec/requests/api/graphql/ci/pipelines_spec.rb @@ -229,6 +229,7 @@ RSpec.describe 'Query.project(fullPath).pipelines' do let_it_be(:pipeline) { create(:ci_pipeline, project: project, user: user) } let_it_be(:upstream_project) { create(:project, :repository, :public) } let_it_be(:upstream_pipeline) { create(:ci_pipeline, project: upstream_project, user: user) } + let(:upstream_pipelines_graphql_data) { graphql_data.dig(*%w[project pipelines nodes]).first['upstream'] } let(:query) do 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 |