diff options
Diffstat (limited to 'spec/graphql')
27 files changed, 506 insertions, 26 deletions
diff --git a/spec/graphql/mutations/merge_requests/accept_spec.rb b/spec/graphql/mutations/merge_requests/accept_spec.rb index db75c64a447..c97c78ec206 100644 --- a/spec/graphql/mutations/merge_requests/accept_spec.rb +++ b/spec/graphql/mutations/merge_requests/accept_spec.rb @@ -5,14 +5,14 @@ require 'spec_helper' RSpec.describe Mutations::MergeRequests::Accept do include AfterNextHelpers - let_it_be(:user) { create(:user) } - let(:project) { create(:project, :public, :repository) } - subject(:mutation) { described_class.new(context: context, object: nil, field: nil) } - let_it_be(:context) do + let_it_be(:user) { create(:user) } + + let(:project) { create(:project, :public, :repository) } + let(:context) do GraphQL::Query::Context.new( - query: OpenStruct.new(schema: GitlabSchema), + query: double('query', schema: GitlabSchema), values: { current_user: user }, object: nil ) diff --git a/spec/graphql/mutations/merge_requests/create_spec.rb b/spec/graphql/mutations/merge_requests/create_spec.rb index ba0ac3cbe66..83af1e3f1b3 100644 --- a/spec/graphql/mutations/merge_requests/create_spec.rb +++ b/spec/graphql/mutations/merge_requests/create_spec.rb @@ -7,9 +7,10 @@ RSpec.describe Mutations::MergeRequests::Create do let_it_be(:project) { create(:project, :public, :repository) } let_it_be(:user) { create(:user) } - let_it_be(:context) do + + let(:context) do GraphQL::Query::Context.new( - query: OpenStruct.new(schema: nil), + query: double('query', schema: nil), values: { current_user: user }, object: nil ) diff --git a/spec/graphql/mutations/user_callouts/create_spec.rb b/spec/graphql/mutations/user_callouts/create_spec.rb index 93f227d8b82..eac39bdd1b0 100644 --- a/spec/graphql/mutations/user_callouts/create_spec.rb +++ b/spec/graphql/mutations/user_callouts/create_spec.rb @@ -13,7 +13,7 @@ RSpec.describe Mutations::UserCallouts::Create do let(:feature_name) { 'not_supported' } it 'does not create a user callout' do - expect { resolve }.not_to change(UserCallout, :count).from(0) + expect { resolve }.not_to change(Users::Callout, :count).from(0) end it 'returns error about feature name not being supported' do @@ -22,10 +22,10 @@ RSpec.describe Mutations::UserCallouts::Create do end context 'when feature name is supported' do - let(:feature_name) { UserCallout.feature_names.each_key.first.to_s } + let(:feature_name) { Users::Callout.feature_names.each_key.first.to_s } it 'creates a user callout' do - expect { resolve }.to change(UserCallout, :count).from(0).to(1) + expect { resolve }.to change(Users::Callout, :count).from(0).to(1) end it 'sets dismissed_at for the user callout' do diff --git a/spec/graphql/resolvers/board_list_issues_resolver_spec.rb b/spec/graphql/resolvers/board_list_issues_resolver_spec.rb index 53d2c8a853c..6907c55bd48 100644 --- a/spec/graphql/resolvers/board_list_issues_resolver_spec.rb +++ b/spec/graphql/resolvers/board_list_issues_resolver_spec.rb @@ -25,7 +25,7 @@ RSpec.describe Resolvers::BoardListIssuesResolver do let(:wildcard_started) { 'STARTED' } let(:filters) { { milestone_title: ["started"], milestone_wildcard_id: wildcard_started } } - it 'raises a mutually exclusive filter error when milstone wildcard and title are provided' do + it 'raises a mutually exclusive filter error when milestone wildcard and title are provided' do expect do resolve_board_list_issues(args: { filters: filters }) end.to raise_error(Gitlab::Graphql::Errors::ArgumentError) @@ -80,6 +80,16 @@ RSpec.describe Resolvers::BoardListIssuesResolver do expect(result).to match_array([]) end + + context 'when filtering by confidential' do + let(:confidential_issue) { create(:issue, project: project, labels: [label], relative_position: nil, confidential: true) } + + it 'returns matching issue' do + result = resolve_board_list_issues(args: { filters: { confidential: true } }) + + expect(result).to contain_exactly(confidential_issue) + end + end end end diff --git a/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb new file mode 100644 index 00000000000..fbef07b72e6 --- /dev/null +++ b/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Ci::RunnerStatusResolver do + include GraphqlHelpers + + describe '#resolve' do + let(:user) { build(:user) } + let(:runner) { build(:ci_runner) } + + subject(:resolve_subject) { resolve(described_class, ctx: { current_user: user }, obj: runner, args: args) } + + context 'with legacy_mode' do + context 'set to 14.5' do + let(:args) do + { legacy_mode: '14.5' } + end + + it 'calls runner.status with specified legacy_mode' do + expect(runner).to receive(:status).with('14.5').once.and_return(:online) + + expect(resolve_subject).to eq(:online) + end + end + + context 'set to nil' do + let(:args) do + { legacy_mode: nil } + end + + it 'calls runner.status with specified legacy_mode' do + expect(runner).to receive(:status).with(nil).once.and_return(:stale) + + expect(resolve_subject).to eq(:stale) + end + end + end + end +end diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb index bb8dadeca40..df6490df915 100644 --- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb @@ -45,6 +45,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver do let(:finder) { instance_double(::Ci::RunnersFinder) } let(:args) do { + active: true, status: 'active', type: :instance_type, tag_list: ['active_runner'], @@ -55,6 +56,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver do let(:expected_params) do { + active: true, status_status: 'active', type_type: :instance_type, tag_name: ['active_runner'], diff --git a/spec/graphql/resolvers/clusters/agent_activity_events_resolver_spec.rb b/spec/graphql/resolvers/clusters/agent_activity_events_resolver_spec.rb new file mode 100644 index 00000000000..5a6b27e43a5 --- /dev/null +++ b/spec/graphql/resolvers/clusters/agent_activity_events_resolver_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Clusters::AgentActivityEventsResolver do + include GraphqlHelpers + + it { expect(described_class.type).to eq(Types::Clusters::AgentActivityEventType) } + it { expect(described_class.null).to be_truthy } + + describe '#resolve' do + let_it_be(:agent) { create(:cluster_agent) } + + let(:user) { create(:user, maintainer_projects: [agent.project]) } + let(:ctx) { { current_user: user } } + let(:events) { double } + + before do + allow(agent).to receive(:activity_events).and_return(events) + end + + subject { resolve(described_class, obj: agent, ctx: ctx) } + + it 'returns events associated with the agent' do + expect(subject).to eq(events) + end + + context 'user does not have permission' do + let(:user) { create(:user, developer_projects: [agent.project]) } + + it { is_expected.to be_empty } + end + end +end diff --git a/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb b/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb new file mode 100644 index 00000000000..4e7ea253c87 --- /dev/null +++ b/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::ContainerRepositoryTagsResolver do + include GraphqlHelpers + + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :public) } + let_it_be_with_reload(:repository) { create(:container_repository, project: project) } + + let(:args) { { sort: nil } } + + describe '#resolve' do + let(:resolver) { resolve(described_class, ctx: { current_user: user }, obj: repository, args: args) } + + before do + stub_container_registry_config(enabled: true) + end + + context 'by name' do + subject { resolver.map(&:name) } + + before do + stub_container_registry_tags(repository: repository.path, tags: %w(aaa bab bbb ccc 123), with_manifest: false) + end + + context 'without sort' do + # order is not guaranteed + it { is_expected.to contain_exactly('aaa', 'bab', 'bbb', 'ccc', '123') } + end + + context 'with sorting and filtering' do + context "name_asc" do + let(:args) { { sort: :name_asc } } + + it { is_expected.to eq(%w(123 aaa bab bbb ccc)) } + end + + context "name_desc" do + let(:args) { { sort: :name_desc } } + + it { is_expected.to eq(%w(ccc bbb bab aaa 123)) } + end + + context 'filter by name' do + let(:args) { { sort: :name_desc, name: 'b' } } + + it { is_expected.to eq(%w(bbb bab)) } + end + end + end + end +end diff --git a/spec/graphql/resolvers/package_pipelines_resolver_spec.rb b/spec/graphql/resolvers/package_pipelines_resolver_spec.rb new file mode 100644 index 00000000000..d48d4d8ae01 --- /dev/null +++ b/spec/graphql/resolvers/package_pipelines_resolver_spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::PackagePipelinesResolver do + include GraphqlHelpers + + let_it_be_with_reload(:package) { create(:package) } + let_it_be(:pipelines) { create_list(:ci_pipeline, 3, project: package.project) } + + let(:user) { package.project.owner } + let(:args) { {} } + + describe '#resolve' do + subject { resolve(described_class, obj: package, args: args, ctx: { current_user: user }) } + + before do + package.pipelines = pipelines + package.save! + end + + it { is_expected.to contain_exactly(*pipelines) } + + context 'with invalid after' do + let(:args) { { first: 1, after: 'not_json_string' } } + + it 'raises argument error' do + expect { subject }.to raise_error(Gitlab::Graphql::Errors::ArgumentError) + end + end + + context 'with invalid after key' do + let(:args) { { first: 1, after: encode_cursor(foo: 3) } } + + it 'raises argument error' do + expect { subject }.to raise_error(Gitlab::Graphql::Errors::ArgumentError) + end + end + + context 'with invalid before' do + let(:args) { { last: 1, before: 'not_json_string' } } + + it 'raises argument error' do + expect { subject }.to raise_error(Gitlab::Graphql::Errors::ArgumentError) + end + end + + context 'with invalid before key' do + let(:args) { { last: 1, before: encode_cursor(foo: 3) } } + + it 'raises argument error' do + expect { subject }.to raise_error(Gitlab::Graphql::Errors::ArgumentError) + end + end + + context 'field options' do + let(:field) do + field_options = described_class.field_options.merge( + owner: resolver_parent, + name: 'dummy_field' + ) + ::Types::BaseField.new(**field_options) + end + + it 'sets them properly' do + expect(field).not_to be_connection + expect(field.extras).to match_array([:lookahead]) + end + end + + context 'with unauthorized user' do + let_it_be(:user) { create(:user) } + + it { is_expected.to be_nil } + end + + def encode_cursor(json) + GitlabSchema.cursor_encoder.encode( + Gitlab::Json.dump(json), + nonce: true + ) + end + end +end diff --git a/spec/graphql/resolvers/users/participants_resolver_spec.rb b/spec/graphql/resolvers/users/participants_resolver_spec.rb new file mode 100644 index 00000000000..3f04d157410 --- /dev/null +++ b/spec/graphql/resolvers/users/participants_resolver_spec.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Users::ParticipantsResolver do + include GraphqlHelpers + + describe '#resolve' do + let_it_be(:user) { create(:user) } + let_it_be(:guest) { create(:user) } + let_it_be(:project) { create(:project, :public) } + let_it_be(:issue) { create(:issue, project: project) } + let_it_be(:note) do + create( + :note, + :system, + :confidential, + project: project, + noteable: issue, + author: create(:user) + ) + end + + let_it_be(:note_metadata) { create(:system_note_metadata, note: note) } + + subject(:resolved_items) { resolve(described_class, args: {}, ctx: { current_user: current_user }, obj: issue)&.items } + + before do + project.add_guest(guest) + project.add_developer(user) + end + + context 'when current user is not set' do + let(:current_user) { nil } + + it 'returns only publicly visible participants for this user' do + is_expected.to match_array([issue.author]) + end + end + + context 'when current user does not have enough permissions' do + let(:current_user) { guest } + + it 'returns only publicly visible participants for this user' do + is_expected.to match_array([issue.author]) + end + end + + context 'when current user has access to confidential notes' do + let(:current_user) { user } + + it 'returns all participants for this user' do + is_expected.to match_array([issue.author, note.author]) + end + + context 'N+1 queries' do + let(:query) { -> { resolve(described_class, args: {}, ctx: { current_user: current_user }, obj: issue)&.items } } + + before do + # warm-up + query.call + end + + it 'does not execute N+1 for project relation' do + control_count = ActiveRecord::QueryRecorder.new { query.call } + + create(:note, :confidential, project: project, noteable: issue, author: create(:user)) + + expect { query.call }.not_to exceed_query_limit(control_count) + end + + it 'does not execute N+1 for system note metadata relation' do + control_count = ActiveRecord::QueryRecorder.new { query.call } + + new_note = create(:note, :system, project: project, noteable: issue, author: create(:user)) + create(:system_note_metadata, note: new_note) + + expect { query.call }.not_to exceed_query_limit(control_count) + end + end + end + end +end diff --git a/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb b/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb index d1c2b4044c1..37c9d6b269c 100644 --- a/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb +++ b/spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb @@ -36,8 +36,14 @@ RSpec.describe GitlabSchema.types['UsageTrendsMeasurement'] do end context 'when the user is not admin' do - it 'returns no data' do - expect(subject.dig('data', 'usageTrendsMeasurements')).to be_nil + it 'returns an error' do + expected_err = "The resource that you are attempting to access does not exist or you don't have permission to perform this action" + + expect(subject["errors"].first["message"]).to eq(expected_err) + end + + it 'does not return usageTrendsMeasurements data' do + expect(subject["data"]["usageTrendsMeasurements"]).to be_nil end end @@ -48,7 +54,7 @@ RSpec.describe GitlabSchema.types['UsageTrendsMeasurement'] do stub_application_setting(admin_mode: false) end - it 'returns data' do + it 'returns usageTrendsMeasurements data' do expect(subject.dig('data', 'usageTrendsMeasurements', 'nodes')).not_to be_empty end end diff --git a/spec/graphql/types/base_edge_spec.rb b/spec/graphql/types/base_edge_spec.rb new file mode 100644 index 00000000000..3afb4202173 --- /dev/null +++ b/spec/graphql/types/base_edge_spec.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Types::BaseEdge do + include GraphqlHelpers + + let_it_be(:test_schema) do + project_edge_type = Class.new(described_class) do + field :proof_of_admin_rights, String, + null: true, authorize: :admin_project + + def proof_of_admin_rights + 'ok' + end + end + + project_type = Class.new(::Types::BaseObject) do + graphql_name 'Project' + authorize :read_project + edge_type_class project_edge_type + + field :name, String, null: false + end + + Class.new(GraphQL::Schema) do + lazy_resolve ::Gitlab::Graphql::Lazy, :force + use ::GraphQL::Pagination::Connections + use ::Gitlab::Graphql::Pagination::Connections + + query(Class.new(::Types::BaseObject) do + graphql_name 'Query' + field :projects, project_type.connection_type, null: false + + def projects + context[:projects] + end + end) + end + end + + def document + GraphQL.parse(<<~GQL) + query { + projects { + edges { + proofOfAdminRights + node { name } + } + } + } + GQL + end + + it 'supports field authorization on edge fields' do + user = create(:user) + private_project = create(:project, :private) + member_project = create(:project, :private) + maintainer_project = create(:project, :private) + public_project = create(:project, :public) + + member_project.add_developer(user) + maintainer_project.add_maintainer(user) + projects = [private_project, member_project, maintainer_project, public_project] + + data = { current_user: user, projects: projects } + query = GraphQL::Query.new(test_schema, document: document, context: data) + result = query.result.to_h + + expect(graphql_dig_at(result, 'data', 'projects', 'edges', 'node', 'name')) + .to contain_exactly(member_project.name, maintainer_project.name, public_project.name) + + expect(graphql_dig_at(result, 'data', 'projects', 'edges', 'proofOfAdminRights')) + .to contain_exactly(nil, 'ok', nil) + end +end diff --git a/spec/graphql/types/boards/board_issue_input_type_spec.rb b/spec/graphql/types/boards/board_issue_input_type_spec.rb index 5d3efb9b40d..ed2872c3598 100644 --- a/spec/graphql/types/boards/board_issue_input_type_spec.rb +++ b/spec/graphql/types/boards/board_issue_input_type_spec.rb @@ -7,7 +7,7 @@ RSpec.describe GitlabSchema.types['BoardIssueInput'] do it 'has specific fields' do allowed_args = %w(labelName milestoneTitle assigneeUsername authorUsername - releaseTag myReactionEmoji not search assigneeWildcardId) + releaseTag myReactionEmoji not search assigneeWildcardId confidential) expect(described_class.arguments.keys).to include(*allowed_args) expect(described_class.arguments['not'].type).to eq(Types::Boards::NegatedBoardIssueInputType) diff --git a/spec/graphql/types/ci/job_need_union_spec.rb b/spec/graphql/types/ci/job_need_union_spec.rb new file mode 100644 index 00000000000..49df9ddc7eb --- /dev/null +++ b/spec/graphql/types/ci/job_need_union_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Types::Ci::JobNeedUnion do + describe '.resolve_type' do + context 'when resolving a build need' do + it 'resolves to a BuildNeedType' do + resolved_type = described_class.resolve_type(build(:ci_build_need), {}) + + expect(resolved_type).to be(Types::Ci::BuildNeedType) + end + end + + context 'when resolving a build' do + it 'resolves to a JobType' do + resolved_type = described_class.resolve_type(build(:ci_build), {}) + + expect(resolved_type).to be(Types::Ci::JobType) + end + end + + context 'when resolving an unrelated object' do + it 'raises a TypeNotSupportedError for string object' do + expect do + described_class.resolve_type(+'unrelated object', {}) + end.to raise_error(Types::Ci::JobNeedUnion::TypeNotSupportedError) + end + + it 'raises a TypeNotSupportedError for nil object' do + expect do + described_class.resolve_type(nil, {}) + end.to raise_error(Types::Ci::JobNeedUnion::TypeNotSupportedError) + end + + it 'raises a TypeNotSupportedError for other CI object' do + expect do + described_class.resolve_type(build(:ci_pipeline), {}) + end.to raise_error(Types::Ci::JobNeedUnion::TypeNotSupportedError) + end + end + end +end diff --git a/spec/graphql/types/ci/job_token_scope_type_spec.rb b/spec/graphql/types/ci/job_token_scope_type_spec.rb index 19a8cc324f9..43225b2089b 100644 --- a/spec/graphql/types/ci/job_token_scope_type_spec.rb +++ b/spec/graphql/types/ci/job_token_scope_type_spec.rb @@ -12,7 +12,7 @@ RSpec.describe GitlabSchema.types['CiJobTokenScopeType'] do end describe 'query' do - let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) } + let(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) } let_it_be(:current_user) { create(:user) } let(:query) do @@ -65,8 +65,12 @@ RSpec.describe GitlabSchema.types['CiJobTokenScopeType'] do project.ci_cd_settings.update!(job_token_scope_enabled: false) end + it 'does not return an error' do + expect(subject['errors']).to be_nil + end + it 'returns nil' do - expect(subject.dig('data', 'project', 'ciJobTokenScope')).to be_nil + expect(subject['data']['project']['ciJobTokenScope']).to be_nil end end end diff --git a/spec/graphql/types/ci/job_type_spec.rb b/spec/graphql/types/ci/job_type_spec.rb index e95a7da4fe5..e3cb56c2ad5 100644 --- a/spec/graphql/types/ci/job_type_spec.rb +++ b/spec/graphql/types/ci/job_type_spec.rb @@ -25,6 +25,7 @@ RSpec.describe Types::Ci::JobType do needs pipeline playable + previousStageJobsOrNeeds queued_at queued_duration refName diff --git a/spec/graphql/types/clusters/agent_activity_event_type_spec.rb b/spec/graphql/types/clusters/agent_activity_event_type_spec.rb new file mode 100644 index 00000000000..7773bad749d --- /dev/null +++ b/spec/graphql/types/clusters/agent_activity_event_type_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['ClusterAgentActivityEvent'] do + let(:fields) { %i[recorded_at kind level user agent_token] } + + it { expect(described_class.graphql_name).to eq('ClusterAgentActivityEvent') } + it { expect(described_class).to require_graphql_authorizations(:admin_cluster) } + it { expect(described_class).to have_graphql_fields(fields) } +end diff --git a/spec/graphql/types/clusters/agent_type_spec.rb b/spec/graphql/types/clusters/agent_type_spec.rb index 4b4b601b230..a1e5952bf73 100644 --- a/spec/graphql/types/clusters/agent_type_spec.rb +++ b/spec/graphql/types/clusters/agent_type_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe GitlabSchema.types['ClusterAgent'] do - let(:fields) { %i[created_at created_by_user id name project updated_at tokens web_path connections] } + let(:fields) { %i[created_at created_by_user id name project updated_at tokens web_path connections activity_events] } it { expect(described_class.graphql_name).to eq('ClusterAgent') } diff --git a/spec/graphql/types/container_respository_tags_sort_enum_spec.rb b/spec/graphql/types/container_respository_tags_sort_enum_spec.rb new file mode 100644 index 00000000000..b464037d8d9 --- /dev/null +++ b/spec/graphql/types/container_respository_tags_sort_enum_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['ContainerRepositoryTagSort'] do + specify { expect(described_class.graphql_name).to eq('ContainerRepositoryTagSort') } + + it 'exposes all the existing issue sort values' do + expect(described_class.values.keys).to include( + *%w[NAME_ASC NAME_DESC] + ) + end +end diff --git a/spec/graphql/types/issue_type_enum_spec.rb b/spec/graphql/types/issue_type_enum_spec.rb index 7ae5eb76f28..131e92aa5ed 100644 --- a/spec/graphql/types/issue_type_enum_spec.rb +++ b/spec/graphql/types/issue_type_enum_spec.rb @@ -5,9 +5,9 @@ require 'spec_helper' RSpec.describe Types::IssueTypeEnum do specify { expect(described_class.graphql_name).to eq('IssueType') } - it 'exposes all the existing issue type values' do - expect(described_class.values.keys).to include( - *%w[ISSUE INCIDENT] + it 'exposes all the existing issue type values except for task' do + expect(described_class.values.keys).to match_array( + %w[ISSUE INCIDENT TEST_CASE REQUIREMENT] ) end end diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb index c0a0fdf3b0b..1b8bf007a73 100644 --- a/spec/graphql/types/issue_type_spec.rb +++ b/spec/graphql/types/issue_type_spec.rb @@ -66,10 +66,16 @@ RSpec.describe GitlabSchema.types['Issue'] do end context 'when user does not have the permission' do - it 'returns no data' do + before do allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(false) + end - expect(subject.dig(:data, :project)).to eq(nil) + it 'does not return an error' do + expect(subject['errors']).to be_nil + end + + it 'returns no data' do + expect(subject['data']['project']).to be_nil end end diff --git a/spec/graphql/types/packages/package_details_type_spec.rb b/spec/graphql/types/packages/package_details_type_spec.rb index 7e1103d8aa0..f0b684d6b07 100644 --- a/spec/graphql/types/packages/package_details_type_spec.rb +++ b/spec/graphql/types/packages/package_details_type_spec.rb @@ -10,4 +10,13 @@ RSpec.describe GitlabSchema.types['PackageDetailsType'] do expect(described_class).to include_graphql_fields(*expected_fields) end + + it 'overrides the pipelines field' do + field = described_class.fields['pipelines'] + + expect(field).to have_graphql_type(Types::Ci::PipelineType.connection_type) + expect(field).to have_graphql_extension(Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension) + expect(field).to have_graphql_resolver(Resolvers::PackagePipelinesResolver) + expect(field).not_to be_connection + end end diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb index 4f205e861dd..adf5507571b 100644 --- a/spec/graphql/types/project_type_spec.rb +++ b/spec/graphql/types/project_type_spec.rb @@ -34,7 +34,7 @@ RSpec.describe GitlabSchema.types['Project'] do container_repositories container_repositories_count pipeline_analytics squash_read_only sast_ci_configuration cluster_agent cluster_agents agent_configurations - ci_template timelogs merge_commit_template + ci_template timelogs merge_commit_template squash_commit_template ] expect(described_class).to include_graphql_fields(*expected_fields) diff --git a/spec/graphql/types/range_input_type_spec.rb b/spec/graphql/types/range_input_type_spec.rb index ca27527c2b5..fc9126247fa 100644 --- a/spec/graphql/types/range_input_type_spec.rb +++ b/spec/graphql/types/range_input_type_spec.rb @@ -24,7 +24,7 @@ RSpec.describe ::Types::RangeInputType do it 'follows expected subtyping relationships for instances' do context = GraphQL::Query::Context.new( - query: OpenStruct.new(schema: nil), + query: double('query', schema: nil), values: {}, object: nil ) diff --git a/spec/graphql/types/repository/blob_type_spec.rb b/spec/graphql/types/repository/blob_type_spec.rb index 7f37237f355..21bc88e34c0 100644 --- a/spec/graphql/types/repository/blob_type_spec.rb +++ b/spec/graphql/types/repository/blob_type_spec.rb @@ -24,10 +24,12 @@ RSpec.describe Types::Repository::BlobType do :raw_path, :replace_path, :pipeline_editor_path, + :code_owners, :simple_viewer, :rich_viewer, :plain_data, :can_modify_blob, + :can_current_user_push_to_branch, :ide_edit_path, :external_storage_url, :fork_and_edit_path, diff --git a/spec/graphql/types/subscription_type_spec.rb b/spec/graphql/types/subscription_type_spec.rb index b99df374bb3..bf933945a31 100644 --- a/spec/graphql/types/subscription_type_spec.rb +++ b/spec/graphql/types/subscription_type_spec.rb @@ -6,6 +6,7 @@ RSpec.describe GitlabSchema.types['Subscription'] do it 'has the expected fields' do expected_fields = %i[ issuable_assignees_updated + issue_crm_contacts_updated ] expect(described_class).to have_graphql_fields(*expected_fields).only diff --git a/spec/graphql/types/user_callout_feature_name_enum_spec.rb b/spec/graphql/types/user_callout_feature_name_enum_spec.rb index 28755e1301b..5dfcfc21708 100644 --- a/spec/graphql/types/user_callout_feature_name_enum_spec.rb +++ b/spec/graphql/types/user_callout_feature_name_enum_spec.rb @@ -6,6 +6,6 @@ RSpec.describe GitlabSchema.types['UserCalloutFeatureNameEnum'] do specify { expect(described_class.graphql_name).to eq('UserCalloutFeatureNameEnum') } it 'exposes all the existing user callout feature names' do - expect(described_class.values.keys).to match_array(::UserCallout.feature_names.keys.map(&:upcase)) + expect(described_class.values.keys).to match_array(::Users::Callout.feature_names.keys.map(&:upcase)) end end |