diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-09-20 14:18:08 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-09-20 14:18:08 +0300 |
commit | 5afcbe03ead9ada87621888a31a62652b10a7e4f (patch) | |
tree | 9918b67a0d0f0bafa6542e839a8be37adf73102d /spec/graphql/types | |
parent | c97c0201564848c1f53226fe19d71fdcc472f7d0 (diff) |
Add latest changes from gitlab-org/gitlab@16-4-stable-eev16.4.0-rc42
Diffstat (limited to 'spec/graphql/types')
27 files changed, 515 insertions, 19 deletions
diff --git a/spec/graphql/types/base_argument_spec.rb b/spec/graphql/types/base_argument_spec.rb index 8f5f2e08799..0ce6aa3667d 100644 --- a/spec/graphql/types/base_argument_spec.rb +++ b/spec/graphql/types/base_argument_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::BaseArgument do +RSpec.describe Types::BaseArgument, feature_category: :api do let_it_be(:field) do Types::BaseField.new(name: 'field', type: String, null: true) end diff --git a/spec/graphql/types/base_edge_spec.rb b/spec/graphql/types/base_edge_spec.rb index b02ccbaffef..0cc0c838fac 100644 --- a/spec/graphql/types/base_edge_spec.rb +++ b/spec/graphql/types/base_edge_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::BaseEdge do +RSpec.describe Types::BaseEdge, feature_category: :api do include GraphqlHelpers let_it_be(:test_schema) do diff --git a/spec/graphql/types/base_enum_spec.rb b/spec/graphql/types/base_enum_spec.rb index 65a345052c7..db8fb877390 100644 --- a/spec/graphql/types/base_enum_spec.rb +++ b/spec/graphql/types/base_enum_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::BaseEnum do +RSpec.describe Types::BaseEnum, feature_category: :api do describe '.from_rails_enum' do let(:enum_type) { Class.new(described_class) } let(:template) { "The name is '%{name}', James %{name}." } diff --git a/spec/graphql/types/base_field_spec.rb b/spec/graphql/types/base_field_spec.rb index 9f8a8717efb..831d36950db 100644 --- a/spec/graphql/types/base_field_spec.rb +++ b/spec/graphql/types/base_field_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::BaseField do +RSpec.describe Types::BaseField, feature_category: :api do describe 'authorized?' do let(:object) { double } let(:current_user) { nil } diff --git a/spec/graphql/types/base_object_spec.rb b/spec/graphql/types/base_object_spec.rb index 3c42c708187..af0639e84d3 100644 --- a/spec/graphql/types/base_object_spec.rb +++ b/spec/graphql/types/base_object_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::BaseObject do +RSpec.describe Types::BaseObject, feature_category: :api do include GraphqlHelpers describe 'scoping items' do diff --git a/spec/graphql/types/blame/blame_type_spec.rb b/spec/graphql/types/blame/blame_type_spec.rb new file mode 100644 index 00000000000..15846130edb --- /dev/null +++ b/spec/graphql/types/blame/blame_type_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Types::Blame::BlameType, feature_category: :source_code_management do + include GraphqlHelpers + + specify { expect(described_class.graphql_name).to eq('Blame') } + + specify do + expect(described_class).to have_graphql_fields( + :first_line, + :groups + ).at_least + end +end diff --git a/spec/graphql/types/blame/commit_data_type_spec.rb b/spec/graphql/types/blame/commit_data_type_spec.rb new file mode 100644 index 00000000000..432f09bf8f7 --- /dev/null +++ b/spec/graphql/types/blame/commit_data_type_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Types::Blame::CommitDataType, + feature_category: :source_code_management do + include GraphqlHelpers + + specify { expect(described_class.graphql_name).to eq('CommitData') } + + specify do + expect(described_class).to have_graphql_fields( + :age_map_class, + :author_avatar, + :commit_author_link, + :commit_link, + :project_blame_link, + :time_ago_tooltip + ).at_least + end +end diff --git a/spec/graphql/types/blame/groups_type_spec.rb b/spec/graphql/types/blame/groups_type_spec.rb new file mode 100644 index 00000000000..9e870e1cdc0 --- /dev/null +++ b/spec/graphql/types/blame/groups_type_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Types::Blame::GroupsType, feature_category: :source_code_management do + include GraphqlHelpers + + specify { expect(described_class.graphql_name).to eq('Groups') } + + specify do + expect(described_class).to have_graphql_fields( + :commit, + :commit_data, + :lineno, + :lines, + :span + ).at_least + end +end diff --git a/spec/graphql/types/ci/job_base_field_spec.rb b/spec/graphql/types/ci/job_base_field_spec.rb new file mode 100644 index 00000000000..2d283ce854d --- /dev/null +++ b/spec/graphql/types/ci/job_base_field_spec.rb @@ -0,0 +1,143 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Types::Ci::JobBaseField, feature_category: :runner_fleet do + describe 'authorized?' do + let_it_be(:current_user) { create(:user) } + + let(:object) { double } + let(:ctx) { { current_user: current_user, current_field: current_field } } + let(:current_field) { instance_double(described_class, original_name: current_field_name.to_sym) } + let(:args) { {} } + + subject(:field) do + described_class.new(name: current_field_name, type: GraphQL::Types::String, null: true, **args) + end + + context 'when :job_field_authorization is specified' do + let(:ctx) { { current_user: current_user, current_field: current_field, job_field_authorization: :foo } } + + context 'with public field' do + using RSpec::Parameterized::TableSyntax + + where(:current_field_name) do + %i[allow_failure duration id kind status created_at finished_at queued_at queued_duration updated_at runner] + end + + with_them do + it 'returns true without authorizing' do + is_expected.to be_authorized(object, nil, ctx) + end + end + end + + context 'with private field' do + let(:current_field_name) { 'short_sha' } + + context 'when permission is not allowed' do + it 'returns false' do + expect(Ability).to receive(:allowed?).with(current_user, :foo, object).and_return(false) + + is_expected.not_to be_authorized(object, nil, ctx) + end + end + + context 'when permission is allowed' do + it 'returns true' do + expect(Ability).to receive(:allowed?).with(current_user, :foo, object).and_return(true) + + is_expected.to be_authorized(object, nil, ctx) + end + end + end + end + + context 'when :job_field_authorization is not specified' do + let(:current_field_name) { 'status' } + + it 'defaults to true' do + is_expected.to be_authorized(object, nil, ctx) + end + + context 'when field is authorized' do + let(:args) { { authorize: :foo } } + + it 'tests the field authorization' do + expect(Ability).to receive(:allowed?).with(current_user, :foo, object).and_return(false) + + expect(field).not_to be_authorized(object, nil, ctx) + end + + it 'tests the field authorization, if provided, when it succeeds' do + expect(Ability).to receive(:allowed?).with(current_user, :foo, object).and_return(true) + + expect(field).to be_authorized(object, nil, ctx) + end + end + + context 'with field resolver' do + let(:resolver) { Class.new } + let(:args) { { resolver_class: resolver } } + + it 'only tests the resolver authorization if it authorizes_object?' do + is_expected.to be_authorized(object, nil, ctx) + end + + context 'when resolver authorizes object' do + let(:resolver) do + Class.new do + include Gitlab::Graphql::Authorize::AuthorizeResource + + authorizes_object! + end + end + + it 'tests the resolver authorization, if provided' do + expect(resolver).to receive(:authorized?).with(object, ctx).and_return(false) + + expect(field).not_to be_authorized(object, nil, ctx) + end + + context 'when field is authorized' do + let(:args) { { authorize: :foo, resolver_class: resolver } } + + it 'tests field authorization before resolver authorization, when field auth fails' do + expect(Ability).to receive(:allowed?).with(current_user, :foo, object).and_return(false) + expect(resolver).not_to receive(:authorized?) + + expect(field).not_to be_authorized(object, nil, ctx) + end + + it 'tests field authorization before resolver authorization, when field auth succeeds' do + expect(Ability).to receive(:allowed?).with(current_user, :foo, object).and_return(true) + expect(resolver).to receive(:authorized?).with(object, ctx).and_return(false) + + expect(field).not_to be_authorized(object, nil, ctx) + end + end + end + end + end + end + + describe '#resolve' do + context 'when late_extensions is given' do + it 'registers the late extensions after the regular extensions' do + extension_class = Class.new(GraphQL::Schema::Field::ConnectionExtension) + field = described_class.new(name: 'private_field', type: GraphQL::Types::String.connection_type, + null: true, late_extensions: [extension_class]) + + expect(field.extensions.last.class).to be(extension_class) + end + end + end + + include_examples 'Gitlab-style deprecations' do + def subject(args = {}) + base_args = { name: 'private_field', type: GraphQL::Types::String, null: true } + + described_class.new(**base_args.merge(args)) + end + end +end diff --git a/spec/graphql/types/ci/job_kind_enum_spec.rb b/spec/graphql/types/ci/job_kind_enum_spec.rb index b48d20b71e2..a09cd89ec8b 100644 --- a/spec/graphql/types/ci/job_kind_enum_spec.rb +++ b/spec/graphql/types/ci/job_kind_enum_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe GitlabSchema.types['CiJobKind'] do it 'exposes some job type values' do expect(described_class.values.keys).to match_array( - (%w[BRIDGE BUILD]) + %w[BRIDGE BUILD] ) end end diff --git a/spec/graphql/types/ci/job_trace_type_spec.rb b/spec/graphql/types/ci/job_trace_type_spec.rb index 71803aa9ece..69123445b8b 100644 --- a/spec/graphql/types/ci/job_trace_type_spec.rb +++ b/spec/graphql/types/ci/job_trace_type_spec.rb @@ -13,15 +13,187 @@ RSpec.describe GitlabSchema.types['CiJobTrace'], feature_category: :continuous_i expect(described_class).to have_graphql_fields(*expected_fields) end - it 'shows the correct trace contents' do - job.trace.set('BUILD TRACE') + describe 'htmlSummary' do + subject(:resolved_field) { resolve_field(:html_summary, job.trace, args: args) } - expect_next_instance_of(Gitlab::Ci::Trace) do |trace| - expect(trace).to receive(:html).with(last_lines: 10).and_call_original + context 'when trace contains few lines' do + before do + job.trace.set('BUILD TRACE') + end + + context 'when last_lines is set to 10' do + let(:args) { { last_lines: 10 } } + + it 'shows the correct trace contents' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 10, max_size: 16384).and_call_original + end + + is_expected.to eq('<span>BUILD TRACE</span>') + end + end + end + + context 'when trace contains many lines' do + before do + job.trace.set((1..200).map { |i| "Line #{i}" }.join("\n")) + end + + def expected_html_trace_contents(line_count) + "<span>#{((200 - (line_count - 1))..200).map { |i| "Line #{i}" }.join('<br/>')}</span>" + end + + context 'when last_lines is not set' do + let(:args) { {} } + + it 'shows the last 10 lines of trace contents' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 10, max_size: 16384).and_call_original + end + + is_expected.to eq expected_html_trace_contents(10) + end + end + + context 'when last_lines is set to a negative number' do + let(:args) { { last_lines: -10 } } + + it 'shows the last line of trace contents' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 1, max_size: 16384).and_call_original + end + + is_expected.to eq expected_html_trace_contents(1) + end + end + + context 'when last_lines is set to 10' do + let(:args) { { last_lines: 10 } } + + it 'shows the correct trace contents' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 10, max_size: 16384).and_call_original + end + + is_expected.to eq expected_html_trace_contents(10) + end + end + + context 'when last_lines is set to 150' do + let(:args) { { last_lines: 150 } } + + it 'shows the last 100 lines of trace contents' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 100, max_size: 16384).and_call_original + end + + is_expected.to eq expected_html_trace_contents(100) + end + end + end + + context 'when trace contains long lines' do + before do + # Creates lines of "aaaaaaaa...aaaaaaaa" + job.trace.set((1..20).map { (1..1024).map { "a" }.join("") }.join("\n")) + end + + context 'when last_lines is lower than 16KB' do + let(:args) { {} } + + it 'shows the whole lines' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 10, max_size: 16384).and_call_original + end + + is_expected.to eq "<span>#{(1..10).map { (1..1024).map { 'a' }.join('') }.join('<br/>')}</span>" + end + end + + context 'when last_lines is higher than 16KB' do + let(:args) { { last_lines: 20 } } + + it 'shows only the latest byte' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 20, max_size: 16384).and_call_original + end + + is_expected.to eq "<span>#{(1..1009).map { 'a' }.join('')}<br/>" \ + "#{(1..15).map { (1..1024).map { 'a' }.join('') }.join('<br/>')}</span>" + end + end + + context 'when FF graphql_job_trace_html_summary_max_size is disabled' do + before do + stub_feature_flags(graphql_job_trace_html_summary_max_size: false) + end + + let(:args) { { last_lines: 20 } } + + it 'does not limit the read size from the raw trace' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 20, max_size: nil).and_call_original + end + + is_expected.to eq "<span>#{(1..20).map { (1..1024).map { 'a' }.join('') }.join('<br/>')}</span>" + end + end + + context 'when trace is cut in middle of a line' do + let(:args) { {} } + + before do + stub_const('Types::Ci::JobTraceType::MAX_SIZE_B', 1536) + end + + it 'shows only the latest byte' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 10, max_size: 1536).and_call_original + end + + is_expected.to eq "<span>#{(1..511).map { 'a' }.join('')}<br/>#{(1..1024).map { 'a' }.join('')}</span>" + end + end + + context 'when trace is cut at end of a line' do + let(:args) { {} } + + before do + stub_const('Types::Ci::JobTraceType::MAX_SIZE_B', 2050) + end + + it 'shows only the latest byte' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 10, max_size: 2050).and_call_original + end + + is_expected.to eq "<span><br/>#{(1..2).map { (1..1024).map { 'a' }.join('') }.join('<br/>')}</span>" + end + end end - resolved_field = resolve_field(:html_summary, job.trace) + context 'when trace contains multi-bytes UTF-8' do + before do + # Creates lines of 4 pound symbol, pound symbol is 2 byte wise in UTF-8 + # Append an "a" (1 byte character) at the end to cut in the middle of UTF-8 + job.trace.set((1..20).map { (1..4).map { "£" }.join("") }.join("\n")) + end + + context 'when cut in the middle of a codepoint' do + before do + stub_const('Types::Ci::JobTraceType::MAX_SIZE_B', 5) + end + + let(:args) { {} } - expect(resolved_field).to eq("<span>BUILD TRACE</span>") + it 'shows a single "invalid utf-8" symbol' do + expect_next_instance_of(Gitlab::Ci::Trace) do |trace| + expect(trace).to receive(:html).with(last_lines: 10, max_size: 5).and_call_original + end + + is_expected.to eq "<span>�££</span>" + end + end + end end end diff --git a/spec/graphql/types/ci/job_type_spec.rb b/spec/graphql/types/ci/job_type_spec.rb index f31c0d5255c..a69c6f37ee1 100644 --- a/spec/graphql/types/ci/job_type_spec.rb +++ b/spec/graphql/types/ci/job_type_spec.rb @@ -32,6 +32,7 @@ RSpec.describe Types::Ci::JobType, feature_category: :continuous_integration do needs pipeline playable + previousStageJobs previousStageJobsOrNeeds project queued_at diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb index 6c4e68fba6b..d4d0eff9adb 100644 --- a/spec/graphql/types/issue_type_spec.rb +++ b/spec/graphql/types/issue_type_spec.rb @@ -21,7 +21,7 @@ RSpec.describe GitlabSchema.types['Issue'] do confidential hidden discussion_locked upvotes downvotes merge_requests_count user_notes_count user_discussions_count web_path web_url relative_position emails_disabled emails_enabled subscribed time_estimate total_time_spent human_time_estimate human_total_time_spent closed_at created_at updated_at task_completion_status design_collection alert_management_alert alert_management_alerts severity current_user_todos moved moved_to - closed_as_duplicate_of create_note_email timelogs project_id customer_relations_contacts escalation_status] + closed_as_duplicate_of create_note_email timelogs project_id customer_relations_contacts escalation_status external_author] fields.each do |field_name| expect(described_class).to have_graphql_field(field_name) diff --git a/spec/graphql/types/label_type_spec.rb b/spec/graphql/types/label_type_spec.rb index 427b5d2dcef..d68945b01e6 100644 --- a/spec/graphql/types/label_type_spec.rb +++ b/spec/graphql/types/label_type_spec.rb @@ -9,6 +9,7 @@ RSpec.describe GitlabSchema.types['Label'] do :description_html, :title, :color, + :lock_on_merge, :text_color, :created_at, :updated_at diff --git a/spec/graphql/types/merge_request_type_spec.rb b/spec/graphql/types/merge_request_type_spec.rb index bd271da55a9..9742908edf9 100644 --- a/spec/graphql/types/merge_request_type_spec.rb +++ b/spec/graphql/types/merge_request_type_spec.rb @@ -36,7 +36,7 @@ RSpec.describe GitlabSchema.types['MergeRequest'], feature_category: :code_revie commit_count current_user_todos conflicts auto_merge_enabled approved_by source_branch_protected squash_on_merge available_auto_merge_strategies has_ci mergeable commits committers commits_without_merge_commits squash security_auto_fix default_squash_commit_message - auto_merge_strategy merge_user award_emoji prepared_at + auto_merge_strategy merge_user award_emoji prepared_at codequality_reports_comparer supports_lock_on_merge ] expect(described_class).to have_graphql_fields(*expected_fields).at_least diff --git a/spec/graphql/types/organizations/group_sort_enum_spec.rb b/spec/graphql/types/organizations/group_sort_enum_spec.rb new file mode 100644 index 00000000000..57915d95c45 --- /dev/null +++ b/spec/graphql/types/organizations/group_sort_enum_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['OrganizationGroupSort'], feature_category: :cell do + let(:sort_values) do + %w[ + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + PATH_ASC + PATH_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC + CREATED_AT_ASC + CREATED_AT_DESC + ] + end + + specify { expect(described_class.graphql_name).to eq('OrganizationGroupSort') } + + it 'exposes all the organization groups sort values' do + expect(described_class.values.keys).to include(*sort_values) + end +end diff --git a/spec/graphql/types/organizations/organization_type_spec.rb b/spec/graphql/types/organizations/organization_type_spec.rb new file mode 100644 index 00000000000..26d7c10a715 --- /dev/null +++ b/spec/graphql/types/organizations/organization_type_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['Organization'], feature_category: :cell do + let(:expected_fields) { %w[groups id name organization_users path] } + + specify { expect(described_class.graphql_name).to eq('Organization') } + specify { expect(described_class).to require_graphql_authorizations(:read_organization) } + specify { expect(described_class).to have_graphql_fields(*expected_fields) } +end diff --git a/spec/graphql/types/organizations/organization_user_type_spec.rb b/spec/graphql/types/organizations/organization_user_type_spec.rb new file mode 100644 index 00000000000..876080b0f15 --- /dev/null +++ b/spec/graphql/types/organizations/organization_user_type_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['OrganizationUser'], feature_category: :cell do + let(:expected_fields) { %w[badges id user] } + + specify { expect(described_class.graphql_name).to eq('OrganizationUser') } + specify { expect(described_class).to require_graphql_authorizations(:read_organization_user) } + specify { expect(described_class).to have_graphql_fields(*expected_fields) } +end diff --git a/spec/graphql/types/permission_types/work_item_spec.rb b/spec/graphql/types/permission_types/work_item_spec.rb index 3ee42e2e3ad..cdbf94304de 100644 --- a/spec/graphql/types/permission_types/work_item_spec.rb +++ b/spec/graphql/types/permission_types/work_item_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Types::PermissionTypes::WorkItem do it do expected_permissions = [ :read_work_item, :update_work_item, :delete_work_item, :admin_work_item, - :admin_parent_link, :set_work_item_metadata, :create_note + :admin_parent_link, :set_work_item_metadata, :create_note, :admin_work_item_link ] expected_permissions.each do |permission| diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb index cd9a0642ae6..a20a4767bb5 100644 --- a/spec/graphql/types/project_type_spec.rb +++ b/spec/graphql/types/project_type_spec.rb @@ -892,22 +892,25 @@ RSpec.describe GitlabSchema.types['Project'] do subject { GitlabSchema.execute(query, context: { current_user: user }).as_json } - before do + before_all do fork_reporter.add_reporter(user) fork_developer.add_developer(user) fork_group_developer.group.add_developer(user) + fork_private.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) end it 'contains all forks' do - expect(forks.count).to eq(5) + expect(forks.count).to eq(4) end context 'with minimum_access_level DEVELOPER' do let(:minimum_access_level) { '(minimumAccessLevel: DEVELOPER)' } it 'contains forks with developer access' do - expect(forks).to contain_exactly(a_hash_including('fullPath' => fork_developer.full_path), -a_hash_including('fullPath' => fork_group_developer.full_path)) + 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 diff --git a/spec/graphql/types/query_type_spec.rb b/spec/graphql/types/query_type_spec.rb index 100ecc94f35..8bda738751d 100644 --- a/spec/graphql/types/query_type_spec.rb +++ b/spec/graphql/types/query_type_spec.rb @@ -23,6 +23,16 @@ RSpec.describe GitlabSchema.types['Query'], feature_category: :shared do end end + describe 'organization field' do + subject { described_class.fields['organization'] } + + it 'finds organization by path' do + is_expected.to have_graphql_arguments(:id) + is_expected.to have_graphql_type(Types::Organizations::OrganizationType) + is_expected.to have_graphql_resolver(Resolvers::Organizations::OrganizationResolver) + end + end + describe 'project field' do subject { described_class.fields['project'] } diff --git a/spec/graphql/types/repository/blob_type_spec.rb b/spec/graphql/types/repository/blob_type_spec.rb index 9537fca7322..104093bd909 100644 --- a/spec/graphql/types/repository/blob_type_spec.rb +++ b/spec/graphql/types/repository/blob_type_spec.rb @@ -30,6 +30,7 @@ RSpec.describe Types::Repository::BlobType, feature_category: :source_code_manag :gitpod_blob_url, :find_file_path, :blame_path, + :blame, :history_path, :permalink_path, :environment_formatted_external_url, diff --git a/spec/graphql/types/security/codequality_reports_comparer/degradation_type_spec.rb b/spec/graphql/types/security/codequality_reports_comparer/degradation_type_spec.rb new file mode 100644 index 00000000000..9ae1b3fcf94 --- /dev/null +++ b/spec/graphql/types/security/codequality_reports_comparer/degradation_type_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['CodequalityReportsComparerReportDegradation'], feature_category: :code_quality do + specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparerReportDegradation') } + + it 'has expected fields' do + expected_fields = %i[description fingerprint severity file_path line web_url engine_name] + + expect(described_class).to have_graphql_fields(*expected_fields) + end +end diff --git a/spec/graphql/types/security/codequality_reports_comparer/report_type_spec.rb b/spec/graphql/types/security/codequality_reports_comparer/report_type_spec.rb new file mode 100644 index 00000000000..a1788126f1b --- /dev/null +++ b/spec/graphql/types/security/codequality_reports_comparer/report_type_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['CodequalityReportsComparerReport'], feature_category: :code_quality do + specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparerReport') } + + it 'has expected fields' do + expected_fields = %i[status new_errors resolved_errors existing_errors summary] + + expect(described_class).to have_graphql_fields(*expected_fields) + end +end diff --git a/spec/graphql/types/security/codequality_reports_comparer/status_enum_spec.rb b/spec/graphql/types/security/codequality_reports_comparer/status_enum_spec.rb new file mode 100644 index 00000000000..6e5bdd1e91d --- /dev/null +++ b/spec/graphql/types/security/codequality_reports_comparer/status_enum_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['CodequalityReportsComparerReportStatus'], feature_category: :code_quality do + specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparerReportStatus') } + + it 'exposes all codequality report status values' do + expect(described_class.values.keys).to contain_exactly('SUCCESS', 'FAILED', 'NOT_FOUND') + end +end diff --git a/spec/graphql/types/security/codequality_reports_comparer/summary_type_spec.rb b/spec/graphql/types/security/codequality_reports_comparer/summary_type_spec.rb new file mode 100644 index 00000000000..41de93b27ad --- /dev/null +++ b/spec/graphql/types/security/codequality_reports_comparer/summary_type_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['CodequalityReportsComparerReportSummary'], feature_category: :code_quality do + specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparerReportSummary') } + + it 'has expected fields' do + expected_fields = %i[total resolved errored] + + expect(described_class).to have_graphql_fields(*expected_fields) + end +end diff --git a/spec/graphql/types/security/codequality_reports_comparer_type_spec.rb b/spec/graphql/types/security/codequality_reports_comparer_type_spec.rb new file mode 100644 index 00000000000..02f7a9d6925 --- /dev/null +++ b/spec/graphql/types/security/codequality_reports_comparer_type_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['CodequalityReportsComparer'], feature_category: :code_quality do + specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparer') } + + it 'has expected fields' do + expect(described_class).to have_graphql_fields(:report) + end +end |