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/graphql')
-rw-r--r--spec/graphql/mutations/merge_requests/accept_spec.rb10
-rw-r--r--spec/graphql/mutations/merge_requests/create_spec.rb5
-rw-r--r--spec/graphql/mutations/user_callouts/create_spec.rb6
-rw-r--r--spec/graphql/resolvers/board_list_issues_resolver_spec.rb12
-rw-r--r--spec/graphql/resolvers/ci/runner_status_resolver_spec.rb40
-rw-r--r--spec/graphql/resolvers/ci/runners_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/clusters/agent_activity_events_resolver_spec.rb34
-rw-r--r--spec/graphql/resolvers/container_repository_tags_resolver_spec.rb54
-rw-r--r--spec/graphql/resolvers/package_pipelines_resolver_spec.rb84
-rw-r--r--spec/graphql/resolvers/users/participants_resolver_spec.rb83
-rw-r--r--spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb12
-rw-r--r--spec/graphql/types/base_edge_spec.rb76
-rw-r--r--spec/graphql/types/boards/board_issue_input_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/job_need_union_spec.rb43
-rw-r--r--spec/graphql/types/ci/job_token_scope_type_spec.rb8
-rw-r--r--spec/graphql/types/ci/job_type_spec.rb1
-rw-r--r--spec/graphql/types/clusters/agent_activity_event_type_spec.rb11
-rw-r--r--spec/graphql/types/clusters/agent_type_spec.rb2
-rw-r--r--spec/graphql/types/container_respository_tags_sort_enum_spec.rb13
-rw-r--r--spec/graphql/types/issue_type_enum_spec.rb6
-rw-r--r--spec/graphql/types/issue_type_spec.rb10
-rw-r--r--spec/graphql/types/packages/package_details_type_spec.rb9
-rw-r--r--spec/graphql/types/project_type_spec.rb2
-rw-r--r--spec/graphql/types/range_input_type_spec.rb2
-rw-r--r--spec/graphql/types/repository/blob_type_spec.rb2
-rw-r--r--spec/graphql/types/subscription_type_spec.rb1
-rw-r--r--spec/graphql/types/user_callout_feature_name_enum_spec.rb2
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