diff options
Diffstat (limited to 'spec/graphql/resolvers/ci')
10 files changed, 183 insertions, 27 deletions
diff --git a/spec/graphql/resolvers/ci/all_jobs_resolver_spec.rb b/spec/graphql/resolvers/ci/all_jobs_resolver_spec.rb index 2a7d0a8171b..5c632ed3443 100644 --- a/spec/graphql/resolvers/ci/all_jobs_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/all_jobs_resolver_spec.rb @@ -11,29 +11,46 @@ RSpec.describe Resolvers::Ci::AllJobsResolver do let_it_be(:pending_job) { create(:ci_build, :pending, name: 'Job Three') } let(:args) { {} } - let(:current_user) { create(:admin) } subject { resolve_jobs(args) } describe '#resolve' do - context 'with authorized user' do - context 'with statuses argument' do - let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS')] } } + context 'with admin' do + let(:current_user) { create(:admin) } - it { is_expected.to contain_exactly(successful_job, successful_job_two) } - end + shared_examples 'executes as admin' do + context 'with statuses argument' do + let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS')] } } + + it { is_expected.to contain_exactly(successful_job, successful_job_two) } + end + + context 'with multiple statuses' do + let(:args) do + { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS'), + Types::Ci::JobStatusEnum.coerce_isolated_input('FAILED')] } + end + + it { is_expected.to contain_exactly(successful_job, successful_job_two, failed_job) } + end - context 'with multiple statuses' do - let(:args) do - { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS'), - Types::Ci::JobStatusEnum.coerce_isolated_input('FAILED')] } + context 'without statuses argument' do + it { is_expected.to contain_exactly(successful_job, successful_job_two, failed_job, pending_job) } end + end - it { is_expected.to contain_exactly(successful_job, successful_job_two, failed_job) } + context 'when admin mode setting is disabled', :do_not_mock_admin_mode_setting do + it_behaves_like 'executes as admin' end - context 'without statuses argument' do - it { is_expected.to contain_exactly(successful_job, successful_job_two, failed_job, pending_job) } + context 'when admin mode setting is enabled' do + context 'when in admin mode', :enable_admin_mode do + it_behaves_like 'executes as admin' + end + + context 'when not in admin mode' do + it { is_expected.to be_empty } + end end end diff --git a/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb b/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb index 57b2fcbea63..5d06db904d5 100644 --- a/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::GroupRunnersResolver do +RSpec.describe Resolvers::Ci::GroupRunnersResolver, feature_category: :runner_fleet do include GraphqlHelpers describe '#resolve' do @@ -78,7 +78,7 @@ RSpec.describe Resolvers::Ci::GroupRunnersResolver do status_status: 'active', type_type: :group_type, tag_name: ['active_runner'], - preload: { tag_name: nil }, + preload: { tag_name: false }, search: 'abc', sort: 'contacted_asc', membership: :descendants, diff --git a/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb b/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb new file mode 100644 index 00000000000..4cc00ced104 --- /dev/null +++ b/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Ci::ProjectRunnersResolver, feature_category: :runner_fleet do + include GraphqlHelpers + + describe '#resolve' do + subject do + resolve(described_class, obj: obj, ctx: { current_user: user }, args: args, + arg_style: :internal) + end + + include_context 'runners resolver setup' + + let(:obj) { project } + let(:args) { {} } + + context 'when user cannot see runners' do + it 'returns no runners' do + expect(subject.items.to_a).to eq([]) + end + end + + context 'with user as project admin' do + before do + project.add_maintainer(user) + end + + let(:available_runners) { [inactive_project_runner, offline_project_runner, group_runner, instance_runner] } + + it 'returns all runners available to the project' do + expect(subject.items.to_a).to match_array(available_runners) + end + end + + context 'with obj set to nil' do + let(:obj) { nil } + + it 'raises an error' do + expect { subject }.to raise_error('Expected project missing') + end + end + + context 'with obj not set to project' do + let(:obj) { build(:group) } + + it 'raises an error' do + expect { subject }.to raise_error('Expected project missing') + end + end + + describe 'Allowed query arguments' do + let(:finder) { instance_double(::Ci::RunnersFinder) } + let(:args) do + { + status: 'active', + type: :group_type, + tag_list: ['active_runner'], + search: 'abc', + sort: :contacted_asc + } + end + + let(:expected_params) do + { + status_status: 'active', + type_type: :group_type, + tag_name: ['active_runner'], + preload: { tag_name: false }, + search: 'abc', + sort: 'contacted_asc', + project: project + } + end + + it 'calls RunnersFinder with expected arguments' do + allow(::Ci::RunnersFinder).to receive(:new).with(current_user: user, + params: expected_params).once.and_return(finder) + allow(finder).to receive(:execute).once.and_return([:execute_return_value]) + + expect(subject.items.to_a).to eq([:execute_return_value]) + end + end + end +end diff --git a/spec/graphql/resolvers/ci/runner_groups_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_groups_resolver_spec.rb new file mode 100644 index 00000000000..9272689ef0b --- /dev/null +++ b/spec/graphql/resolvers/ci/runner_groups_resolver_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Ci::RunnerGroupsResolver, feature_category: :runner_fleet do + include GraphqlHelpers + + let_it_be(:group1) { create(:group) } + let_it_be(:runner) { create(:ci_runner, :group, groups: [group1]) } + + let(:args) { {} } + + subject(:response) { resolve_groups(args) } + + describe '#resolve' do + context 'with authorized user', :enable_admin_mode do + let(:current_user) { create(:user, :admin) } + + it 'returns a lazy value with all groups' do + expect(response).to be_a(GraphQL::Execution::Lazy) + expect(response.value).to contain_exactly(group1) + end + end + + context 'with unauthorized user' do + let(:current_user) { create(:user) } + + it { is_expected.to be_nil } + end + end + + private + + def resolve_groups(args = {}, context = { current_user: current_user }) + resolve(described_class, obj: runner, args: args, ctx: context) + end +end diff --git a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb index ba8a127bec5..963a642fa4e 100644 --- a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerJobsResolver do +RSpec.describe Resolvers::Ci::RunnerJobsResolver, feature_category: :runner_fleet do include GraphqlHelpers let_it_be(:project) { create(:project, :repository) } diff --git a/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb index 3cb6e94e81e..1d1fb4a9967 100644 --- a/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerPlatformsResolver do +RSpec.describe Resolvers::Ci::RunnerPlatformsResolver, feature_category: :runner_fleet do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb index 952c7337d65..6c69cdc19cc 100644 --- a/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerProjectsResolver do +RSpec.describe Resolvers::Ci::RunnerProjectsResolver, feature_category: :runner_fleet do include GraphqlHelpers let_it_be(:project1) { create(:project, description: 'Project1.1') } diff --git a/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb index 13ef89023d9..734337f7c92 100644 --- a/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerSetupResolver do +RSpec.describe Resolvers::Ci::RunnerSetupResolver, feature_category: :runner_fleet do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb index fbef07b72e6..2bea256856d 100644 --- a/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerStatusResolver do +RSpec.describe Resolvers::Ci::RunnerStatusResolver, feature_category: :runner_fleet do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb index 4038192a68a..d6da8222234 100644 --- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnersResolver do +RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :runner_fleet do include GraphqlHelpers describe '#resolve' do @@ -28,8 +28,24 @@ RSpec.describe Resolvers::Ci::RunnersResolver do context 'when user can see runners' do let(:obj) { nil } - it 'returns all the runners' do - expect(subject.items.to_a).to contain_exactly(inactive_project_runner, offline_project_runner, group_runner, subgroup_runner, instance_runner) + context 'when admin mode setting is disabled', :do_not_mock_admin_mode_setting do + it 'returns all the runners' do + expect(subject.items.to_a).to contain_exactly(inactive_project_runner, offline_project_runner, group_runner, subgroup_runner, instance_runner) + end + end + + context 'when admin mode setting is enabled' do + context 'when in admin mode', :enable_admin_mode do + it 'returns all the runners' do + expect(subject.items.to_a).to contain_exactly(inactive_project_runner, offline_project_runner, group_runner, subgroup_runner, instance_runner) + end + end + + context 'when not in admin mode' do + it 'returns no runners' do + expect(subject.items.to_a).to eq([]) + end + end end end @@ -67,7 +83,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver do upgrade_status: 'recommended', type_type: :instance_type, tag_name: ['active_runner'], - preload: { tag_name: nil }, + preload: { tag_name: false }, search: 'abc', sort: 'contacted_asc' } @@ -92,7 +108,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver do let(:expected_params) do { active: false, - preload: { tag_name: nil } + preload: { tag_name: false } } end @@ -112,7 +128,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver do let(:expected_params) do { active: false, - preload: { tag_name: nil } + preload: { tag_name: false } } end @@ -131,7 +147,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver do let(:expected_params) do { - preload: { tag_name: nil } + preload: { tag_name: false } } end |