diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-19 17:16:28 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-19 17:16:28 +0300 |
commit | e4384360a16dd9a19d4d2d25d0ef1f2b862ed2a6 (patch) | |
tree | 2fcdfa7dcdb9db8f5208b2562f4b4e803d671243 /spec/graphql | |
parent | ffda4e7bcac36987f936b4ba515995a6698698f0 (diff) |
Add latest changes from gitlab-org/gitlab@16-2-stable-eev16.2.0-rc42
Diffstat (limited to 'spec/graphql')
37 files changed, 236 insertions, 183 deletions
diff --git a/spec/graphql/gitlab_schema_spec.rb b/spec/graphql/gitlab_schema_spec.rb index b5c2d4da9ac..885bbc82ecc 100644 --- a/spec/graphql/gitlab_schema_spec.rb +++ b/spec/graphql/gitlab_schema_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe GitlabSchema do - let_it_be(:connections) { GitlabSchema.connections.all_wrappers } + let_it_be(:connections) { described_class.connections.all_wrappers } let_it_be(:tracers) { described_class.tracers } let(:user) { build :user } @@ -12,10 +12,6 @@ RSpec.describe GitlabSchema do expect(tracers).to include(BatchLoader::GraphQL) end - it 'enables the generic instrumenter' do - expect(tracers).to include(instance_of(::Gitlab::Graphql::GenericTracing)) - end - it 'has the base mutation' do expect(described_class.mutation).to eq(::Types::MutationType) end diff --git a/spec/graphql/graphql_triggers_spec.rb b/spec/graphql/graphql_triggers_spec.rb index 864818351a1..3f58f2678d8 100644 --- a/spec/graphql/graphql_triggers_spec.rb +++ b/spec/graphql/graphql_triggers_spec.rb @@ -20,7 +20,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do issuable ) - GraphqlTriggers.issuable_assignees_updated(issuable) + described_class.issuable_assignees_updated(issuable) end end @@ -32,7 +32,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do issuable ).and_call_original - GraphqlTriggers.issuable_title_updated(issuable) + described_class.issuable_title_updated(issuable) end end @@ -44,7 +44,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do issuable ).and_call_original - GraphqlTriggers.issuable_description_updated(issuable) + described_class.issuable_description_updated(issuable) end end @@ -62,7 +62,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do issuable ) - GraphqlTriggers.issuable_labels_updated(issuable) + described_class.issuable_labels_updated(issuable) end end @@ -74,7 +74,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do issuable ).and_call_original - GraphqlTriggers.issuable_dates_updated(issuable) + described_class.issuable_dates_updated(issuable) end end @@ -86,7 +86,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do issuable ).and_call_original - GraphqlTriggers.issuable_milestone_updated(issuable) + described_class.issuable_milestone_updated(issuable) end end @@ -100,7 +100,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do merge_request ).and_call_original - GraphqlTriggers.merge_request_reviewers_updated(merge_request) + described_class.merge_request_reviewers_updated(merge_request) end end @@ -114,7 +114,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do merge_request ).and_call_original - GraphqlTriggers.merge_request_merge_status_updated(merge_request) + described_class.merge_request_merge_status_updated(merge_request) end end @@ -128,7 +128,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do merge_request ).and_call_original - GraphqlTriggers.merge_request_approval_state_updated(merge_request) + described_class.merge_request_approval_state_updated(merge_request) end end @@ -140,7 +140,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do issuable ).and_call_original - GraphqlTriggers.work_item_updated(issuable) + described_class.work_item_updated(issuable) end context 'when triggered with an Issue' do @@ -154,7 +154,7 @@ RSpec.describe GraphqlTriggers, feature_category: :shared do work_item ).and_call_original - GraphqlTriggers.work_item_updated(issue) + described_class.work_item_updated(issue) end end end diff --git a/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb b/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb index 164bd9b1e39..c92aeb43f51 100644 --- a/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb +++ b/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb @@ -6,7 +6,8 @@ RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Create do let_it_be(:current_user) { create(:user) } let_it_be(:project) { create(:project) } - let(:args) { { project_path: project.full_path, active: true, api_url: 'http://prometheus.com/' } } + let(:api_url) { 'http://prometheus.com/' } + let(:args) { { project_path: project.full_path, active: true, api_url: api_url } } specify { expect(described_class).to require_graphql_authorizations(:admin_project) } @@ -29,6 +30,14 @@ RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Create do end end + context 'when api_url is nil' do + let(:api_url) { nil } + + it 'creates the integration' do + expect { resolve }.to change(::Alerting::ProjectAlertingSetting, :count).by(1) + end + end + context 'when UpdateService responds with success' do it 'returns the integration with no errors' do expect(resolve).to eq( @@ -38,7 +47,7 @@ RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Create do end it 'creates a corresponding token' do - expect { resolve }.to change(::Alerting::ProjectAlertingSetting, :count).by(1) + expect { resolve }.to change(::Integrations::Prometheus, :count).by(1) end end diff --git a/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb b/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb index 0485796fe56..54da3061323 100644 --- a/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb +++ b/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb @@ -20,10 +20,6 @@ RSpec.describe Mutations::Ci::JobTokenScope::AddProject, feature_category: :cont mutation.resolve(**mutation_args) end - before do - stub_feature_flags(frozen_outbound_job_token_scopes_override: false) - end - context 'when user is not logged in' do let(:current_user) { nil } @@ -75,42 +71,6 @@ RSpec.describe Mutations::Ci::JobTokenScope::AddProject, feature_category: :cont end end - context 'when FF frozen_outbound_job_token_scopes is disabled' do - before do - stub_feature_flags(frozen_outbound_job_token_scopes: false) - end - - it 'adds target project to the outbound job token scope by default' do - expect do - expect(subject).to include(ci_job_token_scope: be_present, errors: be_empty) - end.to change { Ci::JobToken::ProjectScopeLink.outbound.count }.by(1) - end - - context 'when mutation uses the direction argument' do - let(:mutation_args) { super().merge!(direction: direction) } - - context 'when targeting the outbound allowlist' do - let(:direction) { :outbound } - - it 'adds the target project' do - expect do - expect(subject).to include(ci_job_token_scope: be_present, errors: be_empty) - end.to change { Ci::JobToken::ProjectScopeLink.outbound.count }.by(1) - end - end - - context 'when targeting the inbound allowlist' do - let(:direction) { :inbound } - - it 'adds the target project' do - expect do - expect(subject).to include(ci_job_token_scope: be_present, errors: be_empty) - end.to change { Ci::JobToken::ProjectScopeLink.inbound.count }.by(1) - end - end - end - end - context 'when the service returns an error' do let(:service) { double(:service) } diff --git a/spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb b/spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb index 564bc95b352..a932002d614 100644 --- a/spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb +++ b/spec/graphql/mutations/ci/pipeline_schedule/variable_input_type_spec.rb @@ -5,5 +5,5 @@ require 'spec_helper' RSpec.describe Mutations::Ci::PipelineSchedule::VariableInputType, feature_category: :continuous_integration do specify { expect(described_class.graphql_name).to eq('PipelineScheduleVariableInput') } - it { expect(described_class.arguments.keys).to match_array(%w[key value variableType]) } + it { expect(described_class.arguments.keys).to match_array(%w[id key value variableType destroy]) } end diff --git a/spec/graphql/mutations/issues/create_spec.rb b/spec/graphql/mutations/issues/create_spec.rb index 24348097021..04b437b27b5 100644 --- a/spec/graphql/mutations/issues/create_spec.rb +++ b/spec/graphql/mutations/issues/create_spec.rb @@ -19,8 +19,7 @@ RSpec.describe Mutations::Issues::Create do description: 'new description', confidential: true, due_date: Date.tomorrow, - discussion_locked: true, - issue_type: 'issue' + discussion_locked: true } end @@ -29,7 +28,8 @@ RSpec.describe Mutations::Issues::Create do project_path: project.full_path, milestone_id: milestone.to_global_id, labels: [project_label1.title, project_label2.title, new_label1, new_label2], - assignee_ids: [assignee1.to_global_id, assignee2.to_global_id] + assignee_ids: [assignee1.to_global_id, assignee2.to_global_id], + issue_type: 'issue' }.merge(expected_attributes) end diff --git a/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb index 0f40565c5d3..80234aaaacf 100644 --- a/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb +++ b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver do +RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver, feature_category: :incident_management do include GraphqlHelpers let_it_be(:guest) { create(:user) } @@ -13,6 +13,7 @@ RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver do let_it_be(:active_http_integration) { create(:alert_management_http_integration, project: project) } let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) } let_it_be(:other_proj_integration) { create(:alert_management_http_integration) } + let_it_be(:migrated_integration) { create(:alert_management_prometheus_integration, :legacy, project: project) } let(:params) { {} } diff --git a/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb b/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb index 11114d41522..ed2e7d35ee3 100644 --- a/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb +++ b/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::AlertManagement::IntegrationsResolver do +RSpec.describe Resolvers::AlertManagement::IntegrationsResolver, feature_category: :incident_management do include GraphqlHelpers let_it_be(:current_user) { create(:user) } @@ -13,6 +13,7 @@ RSpec.describe Resolvers::AlertManagement::IntegrationsResolver do let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) } let_it_be(:other_proj_integration) { create(:alert_management_http_integration, project: project2) } let_it_be(:other_proj_prometheus_integration) { create(:prometheus_integration, project: project2) } + let_it_be(:migrated_integration) { create(:alert_management_prometheus_integration, :legacy, project: project) } let(:params) { {} } diff --git a/spec/graphql/resolvers/board_lists_resolver_spec.rb b/spec/graphql/resolvers/board_lists_resolver_spec.rb index 0f6e51ebbd0..1de59c5f507 100644 --- a/spec/graphql/resolvers/board_lists_resolver_spec.rb +++ b/spec/graphql/resolvers/board_lists_resolver_spec.rb @@ -21,6 +21,7 @@ RSpec.describe Resolvers::BoardListsResolver do end it 'does not create the backlog list' do + board.lists.backlog.delete_all lists = resolve_board_lists expect(lists.count).to eq 1 @@ -35,7 +36,6 @@ RSpec.describe Resolvers::BoardListsResolver do context 'when authorized' do let!(:label_list) { create(:list, board: board, label: label) } - let!(:backlog_list) { create(:backlog_list, board: board) } it 'returns a list of board lists' do lists = resolve_board_lists diff --git a/spec/graphql/resolvers/ci/config_resolver_spec.rb b/spec/graphql/resolvers/ci/config_resolver_spec.rb index 692bdf58784..16a2286cb7e 100644 --- a/spec/graphql/resolvers/ci/config_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/config_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::ConfigResolver do +RSpec.describe Resolvers::Ci::ConfigResolver, feature_category: :continuous_integration do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb b/spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb index 6837d4b0459..e1a76ce0f0f 100644 --- a/spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/inherited_variables_resolver_spec.rb @@ -11,15 +11,16 @@ RSpec.describe Resolvers::Ci::InheritedVariablesResolver, feature_category: :sec let_it_be(:subgroup) { create(:group, parent: group) } let_it_be(:project) { create(:project, group: subgroup) } let_it_be(:project_without_group) { create(:project) } + let_it_be(:variable1) { create(:ci_group_variable, group: group, key: 'GROUP_VAR_A', created_at: 1.day.ago) } + let_it_be(:variable2) { create(:ci_group_variable, group: subgroup, key: 'SUBGROUP_VAR_B') } let_it_be(:inherited_ci_variables) do - [ - create(:ci_group_variable, group: group, key: 'GROUP_VAR_A'), - create(:ci_group_variable, group: subgroup, key: 'SUBGROUP_VAR_B') - ] + [variable1, variable2] end - subject(:resolve_variables) { resolve(described_class, obj: obj, ctx: { current_user: user }, args: {}) } + let(:args) { {} } + + subject(:resolve_variables) { resolve(described_class, obj: obj, args: args, ctx: { current_user: user }) } context 'when project does not have a group' do let_it_be(:obj) { project_without_group } @@ -36,5 +37,47 @@ RSpec.describe Resolvers::Ci::InheritedVariablesResolver, feature_category: :sec expect(resolve_variables.items.to_a).to match_array(inherited_ci_variables) end end + + describe 'sorting behaviour' do + let_it_be(:obj) { project } + + context 'with sort by default (created_at descending)' do + it 'returns variables ordered by created_at in descending order' do + expect(resolve_variables.items.to_a).to eq([variable2, variable1]) + end + end + + context 'with sort by created_at descending' do + let(:args) { { sort: 'CREATED_DESC' } } + + it 'returns variables ordered by created_at in descending order' do + expect(resolve_variables.items.to_a).to eq([variable2, variable1]) + end + end + + context 'with sort by created_at ascending' do + let(:args) { { sort: 'CREATED_ASC' } } + + it 'returns variables ordered by created_at in ascending order' do + expect(resolve_variables.items.to_a).to eq([variable1, variable2]) + end + end + + context 'with sort by key descending' do + let(:args) { { sort: 'KEY_DESC' } } + + it 'returns variables ordered by key in descending order' do + expect(resolve_variables.items.to_a).to eq([variable2, variable1]) + end + end + + context 'with sort by key ascending' do + let(:args) { { sort: 'KEY_ASC' } } + + it 'returns variables ordered by key in ascending order' do + expect(resolve_variables.items.to_a).to eq([variable1, variable2]) + end + end + end end end diff --git a/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb b/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb index 92f4d3dd8e8..d2bcc7cd597 100644 --- a/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::JobTokenScopeResolver do +RSpec.describe Resolvers::Ci::JobTokenScopeResolver, feature_category: :continuous_integration do include GraphqlHelpers let_it_be(:current_user) { create(:user) } diff --git a/spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb b/spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb index 07b4a5509b2..e04bed0f077 100644 --- a/spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/project_pipeline_counts_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::ProjectPipelineCountsResolver do +RSpec.describe Resolvers::Ci::ProjectPipelineCountsResolver, feature_category: :continuous_integration do include GraphqlHelpers let(:current_user) { create(:user) } diff --git a/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb new file mode 100644 index 00000000000..6336ea883f7 --- /dev/null +++ b/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Ci::RunnerJobCountResolver, feature_category: :runner_fleet do + include GraphqlHelpers + + let_it_be(:project) { create(:project, :repository) } + let_it_be(:pipeline) { create(:ci_pipeline, project: project) } + let_it_be(:irrelevant_pipeline) { create(:ci_pipeline, project: project) } + + let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) } + + let_it_be(:build_one) { create(:ci_build, :success, name: 'Build One', runner: runner, pipeline: pipeline) } + let_it_be(:build_two) { create(:ci_build, :success, name: 'Build Two', runner: runner, pipeline: pipeline) } + let_it_be(:build_three) { create(:ci_build, :failed, name: 'Build Three', runner: runner, pipeline: pipeline) } + let_it_be(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) } + + describe '#resolve' do + subject(:job_count) { resolve_job_count(args) } + + let(:args) { {} } + + context 'with authorized user', :enable_admin_mode do + let(:current_user) { create(:user, :admin) } + + context 'with statuses argument filtering on successful builds' do + let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('SUCCESS')] } } + + it { is_expected.to eq 2 } + end + + context 'with statuses argument filtering on failed builds' do + let(:args) { { statuses: [Types::Ci::JobStatusEnum.coerce_isolated_input('FAILED')] } } + + it { is_expected.to eq 1 } + end + + context 'without statuses argument' do + it { is_expected.to eq 3 } + end + end + + context 'with unauthorized user' do + let(:current_user) { nil } + + it { is_expected.to be_nil } + end + end + + private + + def resolve_job_count(args = {}, context = { current_user: current_user }) + resolve(described_class, obj: runner, args: args, ctx: context)&.value + 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 963a642fa4e..322bead0d3c 100644 --- a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb @@ -9,17 +9,18 @@ RSpec.describe Resolvers::Ci::RunnerJobsResolver, feature_category: :runner_flee let_it_be(:pipeline) { create(:ci_pipeline, project: project) } let_it_be(:irrelevant_pipeline) { create(:ci_pipeline, project: project) } - let!(:build_one) { create(:ci_build, :success, name: 'Build One', runner: runner, pipeline: pipeline) } - let!(:build_two) { create(:ci_build, :success, name: 'Build Two', runner: runner, pipeline: pipeline) } - let!(:build_three) { create(:ci_build, :failed, name: 'Build Three', runner: runner, pipeline: pipeline) } - let!(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) } + let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) } - let(:args) { {} } - let(:runner) { create(:ci_runner, :project, projects: [project]) } - - subject { resolve_jobs(args) } + let_it_be(:build_one) { create(:ci_build, :success, name: 'Build One', runner: runner, pipeline: pipeline) } + let_it_be(:build_two) { create(:ci_build, :success, name: 'Build Two', runner: runner, pipeline: pipeline) } + let_it_be(:build_three) { create(:ci_build, :failed, name: 'Build Three', runner: runner, pipeline: pipeline) } + let_it_be(:irrelevant_build) { create(:ci_build, name: 'Irrelevant Build', pipeline: irrelevant_pipeline) } describe '#resolve' do + subject(:jobs) { resolve_jobs(args) } + + let(:args) { {} } + context 'with authorized user', :enable_admin_mode do let(:current_user) { create(:user, :admin) } diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb index e4620b96cae..02fc7d28255 100644 --- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb @@ -9,7 +9,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :runner_fleet d let(:obj) { nil } let(:args) { {} } - subject do + subject(:resolve_scope) do resolve(described_class, obj: obj, ctx: { current_user: user }, args: args, arg_style: :internal) end diff --git a/spec/graphql/resolvers/design_management/version_resolver_spec.rb b/spec/graphql/resolvers/design_management/version_resolver_spec.rb index ab1d7d4d9c5..b72b02bf89b 100644 --- a/spec/graphql/resolvers/design_management/version_resolver_spec.rb +++ b/spec/graphql/resolvers/design_management/version_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::DesignManagement::VersionResolver do +RSpec.describe Resolvers::DesignManagement::VersionResolver, feature_category: :shared do include GraphqlHelpers include DesignManagementTestHelpers diff --git a/spec/graphql/resolvers/echo_resolver_spec.rb b/spec/graphql/resolvers/echo_resolver_spec.rb index 59a121ac7de..02ec7327f74 100644 --- a/spec/graphql/resolvers/echo_resolver_spec.rb +++ b/spec/graphql/resolvers/echo_resolver_spec.rb @@ -14,7 +14,7 @@ RSpec.describe Resolvers::EchoResolver do describe '#resolve' do it 'echoes text and username' do - expect(resolve_echo(text)).to eq %Q("#{current_user.username}" says: #{text}) + expect(resolve_echo(text)).to eq %("#{current_user.username}" says: #{text}) end it 'echoes text and nil as username' do diff --git a/spec/graphql/resolvers/issue_status_counts_resolver_spec.rb b/spec/graphql/resolvers/issue_status_counts_resolver_spec.rb index 86a4154f23b..012c40e358f 100644 --- a/spec/graphql/resolvers/issue_status_counts_resolver_spec.rb +++ b/spec/graphql/resolvers/issue_status_counts_resolver_spec.rb @@ -71,7 +71,7 @@ RSpec.describe Resolvers::IssueStatusCountsResolver do context 'when both assignee_username and assignee_usernames are provided' do it 'returns a mutually exclusive filter error' do - expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'only one of [assigneeUsernames, assigneeUsername] arguments is allowed at the same time.') do + expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'only one of [assigneeUsernames, assigneeUsername, assigneeWildcardId] arguments is allowed at the same time.') do resolve_issue_status_counts(assignee_usernames: [current_user.username], assignee_username: current_user.username) end end diff --git a/spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb b/spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb deleted file mode 100644 index 354fd350aa7..00000000000 --- a/spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Resolvers::Metrics::DashboardResolver, feature_category: :metrics do - include GraphqlHelpers - - let_it_be(:current_user) { create(:user) } - - describe '#resolve' do - subject(:resolve_dashboard) { resolve(described_class, obj: parent_object, args: args, ctx: { current_user: current_user }) } - - let(:args) do - { - path: 'config/prometheus/common_metrics.yml' - } - end - - context 'for environment' do - let(:project) { create(:project) } - let(:parent_object) { create(:environment, project: project) } - - before do - stub_feature_flags(remove_monitor_metrics: false) - project.add_developer(current_user) - end - - it 'use ActiveModel class to find matching dashboard', :aggregate_failures do - expected_arguments = { project: project, user: current_user, path: args[:path], options: { environment: parent_object } } - - expect(PerformanceMonitoring::PrometheusDashboard).to receive(:find_for).with(expected_arguments).and_return(PerformanceMonitoring::PrometheusDashboard.new) - expect(resolve_dashboard).to be_instance_of PerformanceMonitoring::PrometheusDashboard - end - - context 'without parent object' do - let(:parent_object) { nil } - - it 'returns nil', :aggregate_failures do - expect(PerformanceMonitoring::PrometheusDashboard).not_to receive(:find_for) - expect(resolve_dashboard).to be_nil - end - end - - context 'when metrics dashboard feature is unavailable' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'returns nil', :aggregate_failures do - expect(PerformanceMonitoring::PrometheusDashboard).not_to receive(:find_for) - expect(resolve_dashboard).to be_nil - end - end - end - end -end diff --git a/spec/graphql/resolvers/project_issues_resolver_spec.rb b/spec/graphql/resolvers/project_issues_resolver_spec.rb index a510baab5a9..faafbc465e3 100644 --- a/spec/graphql/resolvers/project_issues_resolver_spec.rb +++ b/spec/graphql/resolvers/project_issues_resolver_spec.rb @@ -195,7 +195,7 @@ RSpec.describe Resolvers::ProjectIssuesResolver do context 'when both assignee_username and assignee_usernames are provided' do it 'generates a mutually exclusive filter error' do - expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'only one of [assigneeUsernames, assigneeUsername] arguments is allowed at the same time.') do + expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError, 'only one of [assigneeUsernames, assigneeUsername, assigneeWildcardId] arguments is allowed at the same time.') do resolve_issues(assignee_usernames: [assignee.username], assignee_username: assignee.username) end end diff --git a/spec/graphql/resolvers/users/participants_resolver_spec.rb b/spec/graphql/resolvers/users/participants_resolver_spec.rb index 63a14daabba..22111626c5b 100644 --- a/spec/graphql/resolvers/users/participants_resolver_spec.rb +++ b/spec/graphql/resolvers/users/participants_resolver_spec.rb @@ -137,7 +137,8 @@ RSpec.describe Resolvers::Users::ParticipantsResolver do # 1 extra query per source (3 emojis + 2 notes) to fetch participables collection # 2 extra queries to load work item widgets collection - expect { query.call }.not_to exceed_query_limit(control_count).with_threshold(7) + # 1 extra query to load the project creator to check if they are banned + expect { query.call }.not_to exceed_query_limit(control_count).with_threshold(8) end it 'does not execute N+1 for system note metadata relation' do diff --git a/spec/graphql/types/alert_management/alert_type_spec.rb b/spec/graphql/types/alert_management/alert_type_spec.rb index 4428fc0683a..92e8104fc4d 100644 --- a/spec/graphql/types/alert_management/alert_type_spec.rb +++ b/spec/graphql/types/alert_management/alert_type_spec.rb @@ -31,7 +31,6 @@ RSpec.describe GitlabSchema.types['AlertManagementAlert'], feature_category: :in assignees notes discussions - metrics_dashboard_url runbook todos details_url diff --git a/spec/graphql/types/ci/detailed_status_type_spec.rb b/spec/graphql/types/ci/detailed_status_type_spec.rb index 81ab1b52552..69fb2bc43c0 100644 --- a/spec/graphql/types/ci/detailed_status_type_spec.rb +++ b/spec/graphql/types/ci/detailed_status_type_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe Types::Ci::DetailedStatusType do include GraphqlHelpers - let_it_be(:stage) { create(:ci_stage, status: :skipped) } + let_it_be(:stage) { create(:ci_stage, status: :manual) } specify { expect(described_class.graphql_name).to eq('DetailedStatus') } diff --git a/spec/graphql/types/ci/group_variable_type_spec.rb b/spec/graphql/types/ci/group_variable_type_spec.rb index 106935642f2..ef6d8279523 100644 --- a/spec/graphql/types/ci/group_variable_type_spec.rb +++ b/spec/graphql/types/ci/group_variable_type_spec.rb @@ -5,5 +5,7 @@ require 'spec_helper' RSpec.describe GitlabSchema.types['CiGroupVariable'] do specify { expect(described_class.interfaces).to contain_exactly(Types::Ci::VariableInterface) } - specify { expect(described_class).to have_graphql_fields(:environment_scope, :masked, :protected).at_least } + specify do + expect(described_class).to have_graphql_fields(:environment_scope, :masked, :protected, :description).at_least + end end diff --git a/spec/graphql/types/ci/project_variable_type_spec.rb b/spec/graphql/types/ci/project_variable_type_spec.rb index e6e045b2bca..cec0753fcba 100644 --- a/spec/graphql/types/ci/project_variable_type_spec.rb +++ b/spec/graphql/types/ci/project_variable_type_spec.rb @@ -5,5 +5,7 @@ require 'spec_helper' RSpec.describe GitlabSchema.types['CiProjectVariable'] do specify { expect(described_class.interfaces).to contain_exactly(Types::Ci::VariableInterface) } - specify { expect(described_class).to have_graphql_fields(:environment_scope, :masked, :protected).at_least } + specify do + expect(described_class).to have_graphql_fields(:environment_scope, :masked, :protected, :description).at_least + end end diff --git a/spec/graphql/types/commit_signatures/verification_status_enum_spec.rb b/spec/graphql/types/commit_signatures/verification_status_enum_spec.rb index a0d99f5f0c1..7fc600745df 100644 --- a/spec/graphql/types/commit_signatures/verification_status_enum_spec.rb +++ b/spec/graphql/types/commit_signatures/verification_status_enum_spec.rb @@ -10,7 +10,7 @@ RSpec.describe GitlabSchema.types['VerificationStatus'] do .to match_array(%w[ UNVERIFIED UNVERIFIED_KEY VERIFIED SAME_USER_DIFFERENT_EMAIL OTHER_USER UNKNOWN_KEY - MULTIPLE_SIGNATURES REVOKED_KEY + MULTIPLE_SIGNATURES REVOKED_KEY VERIFIED_SYSTEM ]) end end diff --git a/spec/graphql/types/detployment_tag_type_spec.rb b/spec/graphql/types/deployment_tag_type_spec.rb index 9a7a8db0970..b6741c208fe 100644 --- a/spec/graphql/types/detployment_tag_type_spec.rb +++ b/spec/graphql/types/deployment_tag_type_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GitlabSchema.types['DeploymentTag'] do +RSpec.describe GitlabSchema.types['DeploymentTag'], feature_category: :continuous_delivery do specify { expect(described_class.graphql_name).to eq('DeploymentTag') } it 'has the expected fields' do diff --git a/spec/graphql/types/environment_type_spec.rb b/spec/graphql/types/environment_type_spec.rb index 721c20efc81..1d1bc4b2cb4 100644 --- a/spec/graphql/types/environment_type_spec.rb +++ b/spec/graphql/types/environment_type_spec.rb @@ -8,7 +8,7 @@ RSpec.describe GitlabSchema.types['Environment'] do it 'includes the expected fields' do expected_fields = %w[ - name id state metrics_dashboard latest_opened_most_severe_alert path external_url deployments + name id state latest_opened_most_severe_alert path external_url deployments slug createdAt updatedAt autoStopAt autoDeleteAt tier environmentType lastDeployment deployFreezes clusterAgent ] diff --git a/spec/graphql/types/global_id_type_spec.rb b/spec/graphql/types/global_id_type_spec.rb index fa0b34113bc..8ce0bc2b70a 100644 --- a/spec/graphql/types/global_id_type_spec.rb +++ b/spec/graphql/types/global_id_type_spec.rb @@ -105,12 +105,12 @@ RSpec.describe Types::GlobalIDType do around do |example| # Unset all previously memoized GlobalIDTypes to allow us to define one # that will use the constants stubbed in the `before` block. - previous_id_types = Types::GlobalIDType.instance_variable_get(:@id_types) - Types::GlobalIDType.instance_variable_set(:@id_types, {}) + previous_id_types = described_class.instance_variable_get(:@id_types) + described_class.instance_variable_set(:@id_types, {}) example.run ensure - Types::GlobalIDType.instance_variable_set(:@id_types, previous_id_types) + described_class.instance_variable_set(:@id_types, previous_id_types) end before do diff --git a/spec/graphql/types/ide_type_spec.rb b/spec/graphql/types/ide_type_spec.rb new file mode 100644 index 00000000000..b0e43332fa8 --- /dev/null +++ b/spec/graphql/types/ide_type_spec.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['Ide'], feature_category: :web_ide do + specify { expect(described_class.graphql_name).to eq('Ide') } + + it 'has the expected fields' do + expected_fields = %w[ + codeSuggestionsEnabled + ] + + expect(described_class).to have_graphql_fields(*expected_fields) + end +end diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb index a9fe85ac62f..7c4f2a06147 100644 --- a/spec/graphql/types/issue_type_spec.rb +++ b/spec/graphql/types/issue_type_spec.rb @@ -266,7 +266,6 @@ RSpec.describe GitlabSchema.types['Issue'] do context 'for an incident' do before do issue.update!( - issue_type: WorkItems::Type.base_types[:incident], work_item_type: WorkItems::Type.default_by_type(:incident) ) end diff --git a/spec/graphql/types/metrics/dashboard_type_spec.rb b/spec/graphql/types/metrics/dashboard_type_spec.rb deleted file mode 100644 index 114db87d5f1..00000000000 --- a/spec/graphql/types/metrics/dashboard_type_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe GitlabSchema.types['MetricsDashboard'] do - specify { expect(described_class.graphql_name).to eq('MetricsDashboard') } - - it 'has the expected fields' do - expected_fields = %w[ - path annotations schema_validation_warnings - ] - - expect(described_class).to have_graphql_fields(*expected_fields) - end - - describe 'annotations field' do - subject { described_class.fields['annotations'] } - - it { is_expected.to have_graphql_type(Types::Metrics::Dashboards::AnnotationType.connection_type) } - it { is_expected.to have_graphql_resolver(Resolvers::Metrics::Dashboards::AnnotationResolver) } - end -end diff --git a/spec/graphql/types/project_statistics_type_spec.rb b/spec/graphql/types/project_statistics_type_spec.rb index a958a5150aa..558ff41f6f4 100644 --- a/spec/graphql/types/project_statistics_type_spec.rb +++ b/spec/graphql/types/project_statistics_type_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' RSpec.describe GitlabSchema.types['ProjectStatistics'] do - it 'has all the required fields' do - expect(described_class).to have_graphql_fields(:storage_size, :repository_size, :lfs_objects_size, + it 'has the expected fields' do + expect(described_class).to include_graphql_fields(:storage_size, :repository_size, :lfs_objects_size, :build_artifacts_size, :packages_size, :commit_count, :wiki_size, :snippets_size, :pipeline_artifacts_size, :uploads_size, :container_registry_size) diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb index bcfdb05ca90..262164a0821 100644 --- a/spec/graphql/types/project_type_spec.rb +++ b/spec/graphql/types/project_type_spec.rb @@ -909,6 +909,14 @@ RSpec.describe GitlabSchema.types['Project'] do expect(forks).to contain_exactly(a_hash_including('fullPath' => fork_developer.full_path), a_hash_including('fullPath' => fork_group_developer.full_path)) end + + context 'when current user is not set' do + let(:user) { nil } + + it 'does not return any forks' do + expect(forks.count).to eq(0) + end + end end end end diff --git a/spec/graphql/types/root_storage_statistics_type_spec.rb b/spec/graphql/types/root_storage_statistics_type_spec.rb index 56f58825db0..00f4092baf4 100644 --- a/spec/graphql/types/root_storage_statistics_type_spec.rb +++ b/spec/graphql/types/root_storage_statistics_type_spec.rb @@ -5,11 +5,11 @@ require 'spec_helper' RSpec.describe GitlabSchema.types['RootStorageStatistics'] do specify { expect(described_class.graphql_name).to eq('RootStorageStatistics') } - it 'has all the required fields' do - expect(described_class).to have_graphql_fields(:storage_size, :repository_size, :lfs_objects_size, + it 'has the expected fields' do + expect(described_class).to include_graphql_fields(:storage_size, :repository_size, :lfs_objects_size, :build_artifacts_size, :packages_size, :wiki_size, :snippets_size, :pipeline_artifacts_size, :uploads_size, :dependency_proxy_size, - :container_registry_size, :registry_size_estimated) + :container_registry_size, :container_registry_size_is_estimated, :registry_size_estimated) end specify { expect(described_class).to require_graphql_authorizations(:read_statistics) } diff --git a/spec/graphql/types/user_type_spec.rb b/spec/graphql/types/user_type_spec.rb index 777972df88b..af0f8a86b6c 100644 --- a/spec/graphql/types/user_type_spec.rb +++ b/spec/graphql/types/user_type_spec.rb @@ -55,6 +55,8 @@ RSpec.describe GitlabSchema.types['User'], feature_category: :user_profile do organization jobTitle createdAt + pronouns + ide ] expect(described_class).to include_graphql_fields(*expected_fields) @@ -77,13 +79,13 @@ RSpec.describe GitlabSchema.types['User'], feature_category: :user_profile do let(:username) { requested_user.username } let(:query) do - %( + <<~GQL query { user(username: "#{username}") { name } } - ) + GQL end subject(:user_name) { GitlabSchema.execute(query, context: { current_user: current_user }).as_json.dig('data', 'user', 'name') } @@ -254,4 +256,40 @@ RSpec.describe GitlabSchema.types['User'], feature_category: :user_profile do is_expected.to have_graphql_type(Types::Users::NamespaceCommitEmailType.connection_type) end end + + describe 'ide field' do + subject { described_class.fields['ide'] } + + it 'returns ide' do + is_expected.to have_graphql_type(Types::IdeType) + end + + context 'code suggestions enabled' do + let(:current_user) { create(:user) } + let(:query) do + <<~GQL + query { + currentUser { + ide { + codeSuggestionsEnabled + } + } + } + GQL + end + + subject(:code_suggestions_enabled) do + GitlabSchema.execute(query, context: { current_user: current_user }) + .as_json + .dig('data', 'currentUser', 'ide', 'codeSuggestionsEnabled') + end + + it 'returns code suggestions enabled' do + allow(current_user).to receive(:can?).with(:access_code_suggestions).and_return(true) + + expect(current_user).to receive(:can?).with(:access_code_suggestions).and_return(true) + expect(code_suggestions_enabled).to be true + end + end + end end |