diff options
Diffstat (limited to 'spec/serializers')
34 files changed, 294 insertions, 162 deletions
diff --git a/spec/serializers/admin/user_entity_spec.rb b/spec/serializers/admin/user_entity_spec.rb index 42efe0eec54..79b41d90e6a 100644 --- a/spec/serializers/admin/user_entity_spec.rb +++ b/spec/serializers/admin/user_entity_spec.rb @@ -4,6 +4,7 @@ require "spec_helper" RSpec.describe Admin::UserEntity do let_it_be(:user) { build_stubbed(:user) } + let(:request) { double('request') } let(:entity) do @@ -14,7 +15,7 @@ RSpec.describe Admin::UserEntity do subject { entity.as_json&.keys } it 'exposes correct attributes' do - is_expected.to contain_exactly( + is_expected.to include( :id, :name, :created_at, diff --git a/spec/serializers/admin/user_serializer_spec.rb b/spec/serializers/admin/user_serializer_spec.rb index 53a9457409c..ed78ea67bd1 100644 --- a/spec/serializers/admin/user_serializer_spec.rb +++ b/spec/serializers/admin/user_serializer_spec.rb @@ -9,7 +9,7 @@ RSpec.describe Admin::UserSerializer do context 'when there is a single object provided' do it 'contains important elements for the admin user table' do - is_expected.to contain_exactly( + is_expected.to include( :id, :name, :created_at, diff --git a/spec/serializers/build_artifact_entity_spec.rb b/spec/serializers/build_artifact_entity_spec.rb index 02c172d723f..8835d4d834e 100644 --- a/spec/serializers/build_artifact_entity_spec.rb +++ b/spec/serializers/build_artifact_entity_spec.rb @@ -3,11 +3,13 @@ require 'spec_helper' RSpec.describe BuildArtifactEntity do - let(:job) { create(:ci_build) } - let(:artifact) { create(:ci_job_artifact, :codequality, expire_at: 1.hour.from_now, job: job) } + let_it_be(:job) { create(:ci_build) } + let_it_be(:artifact) { create(:ci_job_artifact, :codequality, expire_at: 1.hour.from_now, job: job) } + + let(:options) { { request: double } } let(:entity) do - described_class.new(artifact, request: double) + described_class.represent(artifact, options) end describe '#as_json' do @@ -21,15 +23,18 @@ RSpec.describe BuildArtifactEntity do expect(subject).to include(:expired, :expire_at) end - it 'contains paths to the artifacts' do - expect(subject[:path]) - .to include "jobs/#{job.id}/artifacts/download?file_type=codequality" + it 'exposes the artifact download path' do + expect(subject[:path]).to include "jobs/#{job.id}/artifacts/download?file_type=codequality" + end + + context 'when project is specified in options' do + let(:options) { super().merge(project: job.project) } - expect(subject[:keep_path]) - .to include "jobs/#{job.id}/artifacts/keep" + it 'doesnt get a project from the artifact' do + expect(artifact).not_to receive(:project) - expect(subject[:browse_path]) - .to include "jobs/#{job.id}/artifacts/browse" + subject + end end end end diff --git a/spec/serializers/ci/dag_pipeline_entity_spec.rb b/spec/serializers/ci/dag_pipeline_entity_spec.rb index fdc2f5e1a04..31a0dc5c048 100644 --- a/spec/serializers/ci/dag_pipeline_entity_spec.rb +++ b/spec/serializers/ci/dag_pipeline_entity_spec.rb @@ -76,8 +76,8 @@ RSpec.describe Ci::DagPipelineEntity do it 'performs the smallest number of queries', :request_store do log = ActiveRecord::QueryRecorder.new { subject } - # stages, project, builds, build_needs, feature_flag - expect(log.count).to eq 5 + # stages, project, builds, build_needs + expect(log.count).to eq 4 end it 'contains all the data' do diff --git a/spec/serializers/ci/group_variable_entity_spec.rb b/spec/serializers/ci/group_variable_entity_spec.rb index a7e12905924..9b64e263992 100644 --- a/spec/serializers/ci/group_variable_entity_spec.rb +++ b/spec/serializers/ci/group_variable_entity_spec.rb @@ -10,7 +10,7 @@ RSpec.describe Ci::GroupVariableEntity do subject { entity.as_json } it 'contains required fields' do - expect(subject).to include(:id, :key, :value, :protected, :variable_type) + expect(subject).to include(:id, :key, :value, :protected, :variable_type, :environment_scope) end end end diff --git a/spec/serializers/ci/lint/result_serializer_spec.rb b/spec/serializers/ci/lint/result_serializer_spec.rb index 7aa95a574bf..a834ea05e14 100644 --- a/spec/serializers/ci/lint/result_serializer_spec.rb +++ b/spec/serializers/ci/lint/result_serializer_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe Ci::Lint::ResultSerializer, :aggregate_failures do let_it_be(:project) { create(:project, :repository) } + let(:result) do Gitlab::Ci::Lint .new(project: project, current_user: project.owner) diff --git a/spec/serializers/ci/pipeline_entity_spec.rb b/spec/serializers/ci/pipeline_entity_spec.rb index 6ce3cef5f44..83ea0d649e8 100644 --- a/spec/serializers/ci/pipeline_entity_spec.rb +++ b/spec/serializers/ci/pipeline_entity_spec.rb @@ -7,6 +7,7 @@ RSpec.describe Ci::PipelineEntity do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } + let(:request) { double('request', current_user: user) } let(:entity) { described_class.represent(pipeline, request: request) } @@ -165,6 +166,7 @@ RSpec.describe Ci::PipelineEntity do context 'when pipeline is detached merge request pipeline' do let_it_be(:merge_request) { create(:merge_request, :with_detached_merge_request_pipeline) } + let(:project) { merge_request.target_project } let(:pipeline) { merge_request.pipelines_for_merge_request.first } @@ -213,6 +215,7 @@ RSpec.describe Ci::PipelineEntity do context 'when pipeline is merge request pipeline' do let_it_be(:merge_request) { create(:merge_request, :with_merge_request_pipeline, merge_sha: 'abc') } + let(:project) { merge_request.target_project } let(:pipeline) { merge_request.pipelines_for_merge_request.first } diff --git a/spec/serializers/container_repository_entity_spec.rb b/spec/serializers/container_repository_entity_spec.rb index 43969c63471..9ea00bc79e1 100644 --- a/spec/serializers/container_repository_entity_spec.rb +++ b/spec/serializers/container_repository_entity_spec.rb @@ -6,6 +6,7 @@ RSpec.describe ContainerRepositoryEntity do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:repository) { create(:container_repository, project: project) } + let(:entity) { described_class.new(repository, request: request) } let(:request) { double('request') } diff --git a/spec/serializers/container_tag_entity_spec.rb b/spec/serializers/container_tag_entity_spec.rb index 8e47a6269bc..6d0ee2cffe5 100644 --- a/spec/serializers/container_tag_entity_spec.rb +++ b/spec/serializers/container_tag_entity_spec.rb @@ -6,6 +6,7 @@ RSpec.describe ContainerTagEntity do let_it_be(:project) { create(:project) } let_it_be(:user) { create(:user) } let_it_be(:repository) { create(:container_repository, name: 'image', project: project) } + let(:entity) { described_class.new(tag, request: request) } let(:request) { double('request') } let(:tag) { repository.tag('test') } diff --git a/spec/serializers/deployment_serializer_spec.rb b/spec/serializers/deployment_serializer_spec.rb index cfd43227b18..55b02b76b4a 100644 --- a/spec/serializers/deployment_serializer_spec.rb +++ b/spec/serializers/deployment_serializer_spec.rb @@ -5,6 +5,7 @@ require 'spec_helper' RSpec.describe DeploymentSerializer do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user, email: project.commit.author_email) } + let(:resource) { create(:deployment, project: project, sha: project.commit.id) } let(:serializer) { described_class.new(request) } diff --git a/spec/serializers/diff_file_entity_spec.rb b/spec/serializers/diff_file_entity_spec.rb index 1b8456e5c49..c15c9324f94 100644 --- a/spec/serializers/diff_file_entity_spec.rb +++ b/spec/serializers/diff_file_entity_spec.rb @@ -6,6 +6,7 @@ RSpec.describe DiffFileEntity do include RepoHelpers let_it_be(:project) { create(:project, :repository) } + let(:repository) { project.repository } let(:commit) { project.commit(sample_commit.id) } let(:diff_refs) { commit.diff_refs } @@ -22,6 +23,7 @@ RSpec.describe DiffFileEntity do context 'when there is a merge request' do let_it_be(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let(:user) { create(:user) } let(:code_navigation_path) { Gitlab::CodeNavigationPath.new(project, project.commit.sha) } let(:request) { EntityRequest.new(project: project, current_user: user) } @@ -49,6 +51,14 @@ RSpec.describe DiffFileEntity do expect(subject).to include(:load_collapsed_diff_url) end + + context 'when diff_view is unknown' do + let(:options) { { diff_view: :unknown } } + + it 'hides highlighted_diff_lines and parallel_diff_lines' do + is_expected.not_to include(:highlighted_diff_lines, :parallel_diff_lines) + end + end end describe '#parallel_diff_lines' do diff --git a/spec/serializers/environment_serializer_spec.rb b/spec/serializers/environment_serializer_spec.rb index 1eba9ae4e5e..985e18f27a0 100644 --- a/spec/serializers/environment_serializer_spec.rb +++ b/spec/serializers/environment_serializer_spec.rb @@ -3,8 +3,10 @@ require 'spec_helper' RSpec.describe EnvironmentSerializer do - let(:user) { create(:user) } - let(:project) { create(:project) } + include CreateEnvironmentsHelpers + + let_it_be(:user) { create(:user) } + let_it_be(:project, reload: true) { create(:project, :repository) } let(:json) do described_class @@ -12,43 +14,18 @@ RSpec.describe EnvironmentSerializer do .represent(resource) end - before do + before_all do project.add_developer(user) end - context 'when there is a single object provided' do - let(:project) { create(:project, :repository) } - let(:deployable) { create(:ci_build) } - let(:deployment) do - create(:deployment, :success, - deployable: deployable, - user: user, - project: project, - sha: project.commit.id) - end - - let(:resource) { deployment.environment } - - before do - create(:ci_build, :manual, name: 'manual1', pipeline: deployable.pipeline) - end - - it 'contains important elements of environment' do - expect(json) - .to include(:name, :external_url, :environment_path, :last_deployment) - end + it_behaves_like 'avoid N+1 on environments serialization' - it 'contains relevant information about last deployment' do - last_deployment = json.fetch(:last_deployment) + context 'when there is a collection of objects provided' do + let(:resource) { project.environments } - expect(last_deployment) - .to include(:ref, :user, :commit, :deployable, :manual_actions) + before_all do + create_list(:environment, 2, project: project) end - end - - context 'when there is a collection of objects provided' do - let(:project) { create(:project) } - let(:resource) { create_list(:environment, 2) } it 'contains important elements of environment' do expect(json.first) @@ -207,4 +184,11 @@ RSpec.describe EnvironmentSerializer do end end end + + def create_environment_with_associations(project) + create(:environment, project: project).tap do |environment| + create(:deployment, :success, environment: environment, project: project) + create(:deployment, :running, environment: environment, project: project) + end + end end diff --git a/spec/serializers/evidences/evidence_entity_spec.rb b/spec/serializers/evidences/evidence_entity_spec.rb index 8ec0422fea2..2962b58c1b7 100644 --- a/spec/serializers/evidences/evidence_entity_spec.rb +++ b/spec/serializers/evidences/evidence_entity_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe Evidences::EvidenceEntity do let_it_be(:project) { create(:project) } + let(:release) { create(:release, project: project) } let(:evidence) { build(:evidence, release: release) } let(:schema_file) { 'evidences/evidence' } diff --git a/spec/serializers/fork_namespace_entity_spec.rb b/spec/serializers/fork_namespace_entity_spec.rb index 7740ed77540..5e9918a89ff 100644 --- a/spec/serializers/fork_namespace_entity_spec.rb +++ b/spec/serializers/fork_namespace_entity_spec.rb @@ -9,6 +9,7 @@ RSpec.describe ForkNamespaceEntity do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:namespace) { create(:group, :with_avatar, description: 'test') } + let(:memberships) do user.members.index_by(&:source_id) end diff --git a/spec/serializers/group_link/group_group_link_entity_spec.rb b/spec/serializers/group_link/group_group_link_entity_spec.rb index 15bcbbcb1d6..2821c433784 100644 --- a/spec/serializers/group_link/group_group_link_entity_spec.rb +++ b/spec/serializers/group_link/group_group_link_entity_spec.rb @@ -6,6 +6,7 @@ RSpec.describe GroupLink::GroupGroupLinkEntity do include_context 'group_group_link' let_it_be(:current_user) { create(:user) } + let(:entity) { described_class.new(group_group_link) } before do diff --git a/spec/serializers/group_link/project_group_link_entity_spec.rb b/spec/serializers/group_link/project_group_link_entity_spec.rb index 0bb3d06933b..e7e42d79b5e 100644 --- a/spec/serializers/group_link/project_group_link_entity_spec.rb +++ b/spec/serializers/group_link/project_group_link_entity_spec.rb @@ -5,6 +5,7 @@ require 'spec_helper' RSpec.describe GroupLink::ProjectGroupLinkEntity do let_it_be(:current_user) { create(:user) } let_it_be(:project_group_link) { create(:project_group_link) } + let(:entity) { described_class.new(project_group_link) } before do diff --git a/spec/serializers/issue_board_entity_spec.rb b/spec/serializers/issue_board_entity_spec.rb index e60a063b9eb..138b8174d81 100644 --- a/spec/serializers/issue_board_entity_spec.rb +++ b/spec/serializers/issue_board_entity_spec.rb @@ -8,6 +8,7 @@ RSpec.describe IssueBoardEntity do let_it_be(:user) { create(:user) } let_it_be(:milestone) { create(:milestone, project: project) } let_it_be(:label) { create(:label, project: project, title: 'Test Label') } + let(:request) { double('request', current_user: user) } subject { described_class.new(resource, request: request).as_json } diff --git a/spec/serializers/member_entity_spec.rb b/spec/serializers/member_entity_spec.rb index 883cb511abc..dc7aa4611f2 100644 --- a/spec/serializers/member_entity_spec.rb +++ b/spec/serializers/member_entity_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe MemberEntity do let_it_be(:current_user) { create(:user) } + let(:entity) { described_class.new(member, { current_user: current_user, group: group, source: source }) } let(:entity_hash) { entity.as_json } diff --git a/spec/serializers/member_serializer_spec.rb b/spec/serializers/member_serializer_spec.rb index af209c0191f..f7415214e95 100644 --- a/spec/serializers/member_serializer_spec.rb +++ b/spec/serializers/member_serializer_spec.rb @@ -7,28 +7,77 @@ RSpec.describe MemberSerializer do let_it_be(:current_user) { create(:user) } - subject { described_class.new.represent(members, { current_user: current_user, group: group, source: source }) } + subject(:representation) do + described_class.new.represent(members, { current_user: current_user, group: group, source: source }).to_json + end shared_examples 'members.json' do - it 'matches json schema' do - expect(subject.to_json).to match_schema('members') - end + it { is_expected.to match_schema('members') } end context 'group member' do - let(:group) { create(:group) } + let_it_be(:group) { create(:group) } + let_it_be(:members) { present_members(create_list(:group_member, 1, group: group)) } + let(:source) { group } - let(:members) { present_members(create_list(:group_member, 1, group: group)) } it_behaves_like 'members.json' + + it 'handles last group owner assignment' do + group_member = members.last + + expect { representation }.to change(group_member, :last_owner) + .from(nil).to(true) + .and change(group_member, :last_blocked_owner).from(nil).to(false) + end + + context "with LastGroupOwnerAssigner query improvements" do + it "avoids N+1 database queries for last group owner assignment in MembersPresenter" do + group_member = create(:group_member, group: group) + control_count = ActiveRecord::QueryRecorder.new { member_last_owner_with_preload([group_member]) }.count + group_members = create_list(:group_member, 3, group: group) + + expect { member_last_owner_with_preload(group_members) }.not_to exceed_query_limit(control_count) + end + + it "avoids N+1 database queries for last blocked owner assignment in MembersPresenter" do + group_member = create(:group_member, group: group) + control_count = ActiveRecord::QueryRecorder.new { member_last_blocked_owner_with_preload([group_member]) }.count + group_members = create_list(:group_member, 3, group: group) + + expect { member_last_blocked_owner_with_preload(group_members) }.not_to exceed_query_limit(control_count) + end + + def member_last_owner_with_preload(members) + assigner_with_preload(members) + members.map { |m| group.member_last_owner?(m) } + end + + def member_last_blocked_owner_with_preload(members) + assigner_with_preload(members) + members.map { |m| group.member_last_blocked_owner?(m) } + end + + def assigner_with_preload(members) + MembersPreloader.new(members).preload_all + Members::LastGroupOwnerAssigner.new(group, members).execute + end + end end context 'project member' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project) } + let_it_be(:members) { present_members(create_list(:project_member, 1, project: project)) } + let(:source) { project } let(:group) { project.group } - let(:members) { present_members(create_list(:project_member, 1, project: project)) } it_behaves_like 'members.json' + + it 'does not invoke group owner assignment' do + expect(Members::LastGroupOwnerAssigner).not_to receive(:new) + + representation + end end end diff --git a/spec/serializers/member_user_entity_spec.rb b/spec/serializers/member_user_entity_spec.rb index 1c000c06bb6..b505571cbf2 100644 --- a/spec/serializers/member_user_entity_spec.rb +++ b/spec/serializers/member_user_entity_spec.rb @@ -6,6 +6,7 @@ RSpec.describe MemberUserEntity do let_it_be(:user) { create(:user) } let_it_be(:emoji) { 'slight_smile' } let_it_be(:user_status) { create(:user_status, user: user, emoji: emoji) } + let(:entity) { described_class.new(user) } let(:entity_hash) { entity.as_json } diff --git a/spec/serializers/merge_request_diff_entity_spec.rb b/spec/serializers/merge_request_diff_entity_spec.rb index 542ef6cb3c3..a3b356505b8 100644 --- a/spec/serializers/merge_request_diff_entity_spec.rb +++ b/spec/serializers/merge_request_diff_entity_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe MergeRequestDiffEntity do let_it_be(:project) { create(:project, :repository) } + let(:request) { EntityRequest.new(project: project) } let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } let(:merge_request_diffs) { merge_request.merge_request_diffs } diff --git a/spec/serializers/merge_request_poll_cached_widget_entity_spec.rb b/spec/serializers/merge_request_poll_cached_widget_entity_spec.rb index 8c72430ff5c..5845a868e53 100644 --- a/spec/serializers/merge_request_poll_cached_widget_entity_spec.rb +++ b/spec/serializers/merge_request_poll_cached_widget_entity_spec.rb @@ -8,6 +8,7 @@ RSpec.describe MergeRequestPollCachedWidgetEntity do let_it_be(:project, refind: true) { create :project, :repository } let_it_be(:resource, refind: true) { create(:merge_request, source_project: project, target_project: project) } let_it_be(:user) { create(:user) } + let(:pipeline) { create(:ci_empty_pipeline, project: project) } let(:request) { double('request', current_user: user, project: project) } @@ -248,14 +249,6 @@ RSpec.describe MergeRequestPollCachedWidgetEntity do expect(subject[:pipeline]).to eq(pipeline_payload) end - - context 'when merge_request_cached_pipeline_serializer is disabled' do - it 'does not return pipeline' do - stub_feature_flags(merge_request_cached_pipeline_serializer: false) - - expect(subject[:pipeline]).to be_nil - end - end end context 'when user does not have access to pipelines' do @@ -276,4 +269,83 @@ RSpec.describe MergeRequestPollCachedWidgetEntity do end end end + + describe 'merge_pipeline' do + it 'returns nil' do + expect(subject[:merge_pipeline]).to be_nil + end + + context 'when is merged' do + let(:resource) { create(:merged_merge_request, source_project: project, merge_commit_sha: project.commit.id) } + let(:pipeline) { create(:ci_empty_pipeline, project: project, ref: resource.target_branch, sha: resource.merge_commit_sha) } + + before do + project.add_maintainer(user) + end + + it 'returns merge_pipeline' do + pipeline.reload + pipeline_payload = + MergeRequests::PipelineEntity + .represent(pipeline, request: request) + .as_json + + expect(subject[:merge_pipeline]).to eq(pipeline_payload) + end + + context 'when user cannot read pipelines on target project' do + before do + project.add_guest(user) + end + + it 'returns nil' do + expect(subject[:merge_pipeline]).to be_nil + end + end + + context 'when merge_request_cached_merge_pipeline_serializer is disabled' do + before do + stub_feature_flags(merge_request_cached_merge_pipeline_serializer: false) + end + + it 'returns nil' do + expect(subject[:merge_pipeline]).to be_nil + end + end + end + end + + describe 'ci related paths' do + using RSpec::Parameterized::TableSyntax + + where(:path_field, :method_for_existence_check) do + :terraform_reports_path | :has_terraform_reports? + :accessibility_report_path | :has_accessibility_reports? + :exposed_artifacts_path | :has_exposed_artifacts? + :test_reports_path | :has_test_reports? + :codequality_reports_path | :has_codequality_reports? + end + + with_them do + context 'when merge request has reports' do + before do + allow(resource).to receive(method_for_existence_check).and_return(true) + end + + it 'set the path to poll data' do + expect(subject[path_field]).to be_present + end + end + + context 'when merge request has no reports' do + before do + allow(resource).to receive(method_for_existence_check).and_return(false) + end + + it 'does not set reports path' do + expect(subject[path_field]).to be_nil + end + end + end + end end diff --git a/spec/serializers/merge_request_poll_widget_entity_spec.rb b/spec/serializers/merge_request_poll_widget_entity_spec.rb index 1e5a8915da0..c88555226a9 100644 --- a/spec/serializers/merge_request_poll_widget_entity_spec.rb +++ b/spec/serializers/merge_request_poll_widget_entity_spec.rb @@ -6,14 +6,15 @@ RSpec.describe MergeRequestPollWidgetEntity do include ProjectForksHelper using RSpec::Parameterized::TableSyntax - let(:project) { create :project, :repository } - let(:resource) { create(:merge_request, source_project: project, target_project: project) } - let(:user) { create(:user) } + let_it_be(:project) { create :project, :repository } + let_it_be(:resource) { create(:merge_request, source_project: project, target_project: project) } + let_it_be(:user) { create(:user) } let(:request) { double('request', current_user: user, project: project) } + let(:options) { {} } subject do - described_class.new(resource, request: request).as_json + described_class.new(resource, { request: request }.merge(options)).as_json end it 'has default_merge_commit_message_with_description' do @@ -22,20 +23,33 @@ RSpec.describe MergeRequestPollWidgetEntity do end describe 'merge_pipeline' do + before do + stub_feature_flags(merge_request_cached_merge_pipeline_serializer: false) + end + it 'returns nil' do expect(subject[:merge_pipeline]).to be_nil end context 'when is merged' do - let(:resource) { create(:merged_merge_request, source_project: project, merge_commit_sha: project.commit.id) } - let(:pipeline) { create(:ci_empty_pipeline, project: project, ref: resource.target_branch, sha: resource.merge_commit_sha) } + let_it_be(:resource) { create(:merged_merge_request, source_project: project, merge_commit_sha: project.commit.id) } + let_it_be(:pipeline) { create(:ci_empty_pipeline, project: project, ref: resource.target_branch, sha: resource.merge_commit_sha) } before do project.add_maintainer(user) end + context 'when user cannot read pipelines on target project' do + before do + project.team.truncate + end + + it 'returns nil' do + expect(subject[:merge_pipeline]).to be_nil + end + end + it 'returns merge_pipeline' do - pipeline.reload pipeline_payload = MergeRequests::PipelineEntity .represent(pipeline, request: request) @@ -44,9 +58,9 @@ RSpec.describe MergeRequestPollWidgetEntity do expect(subject[:merge_pipeline]).to eq(pipeline_payload) end - context 'when user cannot read pipelines on target project' do + context 'when merge_request_cached_merge_pipeline_serializer is enabled' do before do - project.add_guest(user) + stub_feature_flags(merge_request_cached_merge_pipeline_serializer: true) end it 'returns nil' do @@ -73,72 +87,6 @@ RSpec.describe MergeRequestPollWidgetEntity do end end - describe 'terraform_reports_path' do - context 'when merge request has terraform reports' do - before do - allow(resource).to receive(:has_terraform_reports?).and_return(true) - end - - it 'set the path to poll data' do - expect(subject[:terraform_reports_path]).to be_present - end - end - - context 'when merge request has no terraform reports' do - before do - allow(resource).to receive(:has_terraform_reports?).and_return(false) - end - - it 'set the path to poll data' do - expect(subject[:terraform_reports_path]).to be_nil - end - end - end - - describe 'accessibility_report_path' do - context 'when merge request has accessibility reports' do - before do - allow(resource).to receive(:has_accessibility_reports?).and_return(true) - end - - it 'set the path to poll data' do - expect(subject[:accessibility_report_path]).to be_present - end - end - - context 'when merge request has no accessibility reports' do - before do - allow(resource).to receive(:has_accessibility_reports?).and_return(false) - end - - it 'set the path to poll data' do - expect(subject[:accessibility_report_path]).to be_nil - end - end - end - - describe 'exposed_artifacts_path' do - context 'when merge request has exposed artifacts' do - before do - expect(resource).to receive(:has_exposed_artifacts?).and_return(true) - end - - it 'set the path to poll data' do - expect(subject[:exposed_artifacts_path]).to be_present - end - end - - context 'when merge request has no exposed artifacts' do - before do - expect(resource).to receive(:has_exposed_artifacts?).and_return(false) - end - - it 'set the path to poll data' do - expect(subject[:exposed_artifacts_path]).to be_nil - end - end - end - describe 'auto merge' do before do project.add_maintainer(user) @@ -226,19 +174,6 @@ RSpec.describe MergeRequestPollWidgetEntity do expect(subject[:pipeline]).to be_nil end - context 'when merge_request_cached_pipeline_serializer is disabled' do - it 'returns detailed info about pipeline' do - stub_feature_flags(merge_request_cached_pipeline_serializer: false) - - pipeline_payload = - MergeRequests::PipelineEntity - .represent(pipeline, request: req) - .as_json - - expect(subject[:pipeline]).to eq(pipeline_payload) - end - end - it 'returns ci_status' do expect(subject[:ci_status]).to eq('pending') end @@ -278,4 +213,39 @@ RSpec.describe MergeRequestPollWidgetEntity do ]) end end + + describe '#mergeable' do + it 'shows whether a merge request is mergeable' do + expect(subject[:mergeable]).to eq(true) + end + + context 'when merge request is in checking state' do + before do + resource.mark_as_unchecked! + resource.mark_as_checking! + end + + it 'calculates mergeability and returns true' do + expect(subject[:mergeable]).to eq(true) + end + + context 'when async_mergeability_check is passed' do + let(:options) { { async_mergeability_check: true } } + + it 'returns false' do + expect(subject[:mergeable]).to eq(false) + end + + context 'when check_mergeability_async_in_widget is disabled' do + before do + stub_feature_flags(check_mergeability_async_in_widget: false) + end + + it 'calculates mergeability and returns true' do + expect(subject[:mergeable]).to eq(true) + end + end + end + end + end end diff --git a/spec/serializers/merge_request_user_entity_spec.rb b/spec/serializers/merge_request_user_entity_spec.rb index 697fa3001e3..026a229322e 100644 --- a/spec/serializers/merge_request_user_entity_spec.rb +++ b/spec/serializers/merge_request_user_entity_spec.rb @@ -5,6 +5,7 @@ require 'spec_helper' RSpec.describe MergeRequestUserEntity do let_it_be(:user) { create(:user) } let_it_be(:merge_request) { create(:merge_request) } + let(:request) { EntityRequest.new(project: merge_request.target_project, current_user: user) } let(:entity) do diff --git a/spec/serializers/merge_requests/pipeline_entity_spec.rb b/spec/serializers/merge_requests/pipeline_entity_spec.rb index b91d5e7679f..03a049401c1 100644 --- a/spec/serializers/merge_requests/pipeline_entity_spec.rb +++ b/spec/serializers/merge_requests/pipeline_entity_spec.rb @@ -30,7 +30,7 @@ RSpec.describe MergeRequests::PipelineEntity do ) expect(subject[:commit]).to include(:short_id, :commit_path) expect(subject[:ref]).to include(:branch) - expect(subject[:details]).to include(:artifacts, :name, :status, :stages) + expect(subject[:details]).to include(:artifacts, :name, :status, :stages, :finished_at) expect(subject[:details][:status]).to include(:icon, :favicon, :text, :label, :tooltip) expect(subject[:flags]).to include(:merge_request_pipeline) end diff --git a/spec/serializers/namespace_basic_entity_spec.rb b/spec/serializers/namespace_basic_entity_spec.rb index 8b69af5696a..379a49e364e 100644 --- a/spec/serializers/namespace_basic_entity_spec.rb +++ b/spec/serializers/namespace_basic_entity_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe NamespaceBasicEntity do let_it_be(:group) { create(:group) } + let(:entity) do described_class.represent(group) end diff --git a/spec/serializers/pipeline_details_entity_spec.rb b/spec/serializers/pipeline_details_entity_spec.rb index 2f54f45866b..5756656d146 100644 --- a/spec/serializers/pipeline_details_entity_spec.rb +++ b/spec/serializers/pipeline_details_entity_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe PipelineDetailsEntity do let_it_be(:user) { create(:user) } + let(:request) { double('request') } let(:entity) do diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb index bcaaa61eb04..6028da301f3 100644 --- a/spec/serializers/pipeline_serializer_spec.rb +++ b/spec/serializers/pipeline_serializer_spec.rb @@ -202,13 +202,32 @@ RSpec.describe PipelineSerializer do # Existing numbers are high and require performance optimization # Ongoing issue: # https://gitlab.com/gitlab-org/gitlab/-/issues/225156 - expected_queries = Gitlab.ee? ? 85 : 76 + expected_queries = Gitlab.ee? ? 82 : 76 expect(recorded.count).to be_within(2).of(expected_queries) expect(recorded.cached_count).to eq(0) end end + context 'with build environments' do + let(:ref) { 'feature' } + + it 'verifies number of queries', :request_store do + stub_licensed_features(protected_environments: true) + + env = create(:environment, project: project) + create(:ci_build, :scheduled, project: project, environment: env.name) + create(:ci_build, :scheduled, project: project, environment: env.name) + create(:ci_build, :scheduled, project: project, environment: env.name) + + recorded = ActiveRecord::QueryRecorder.new { subject } + expected_queries = Gitlab.ee? ? 61 : 57 + + expect(recorded.count).to be_within(1).of(expected_queries) + expect(recorded.cached_count).to eq(0) + end + end + context 'with scheduled and manual builds' do let(:ref) { 'feature' } diff --git a/spec/serializers/project_import_entity_spec.rb b/spec/serializers/project_import_entity_spec.rb index 1481d4122ae..94af9f1cbd8 100644 --- a/spec/serializers/project_import_entity_spec.rb +++ b/spec/serializers/project_import_entity_spec.rb @@ -6,6 +6,7 @@ RSpec.describe ProjectImportEntity do include ImportHelper let_it_be(:project) { create(:project, import_status: :started, import_source: 'namespace/project') } + let(:provider_url) { 'https://provider.com' } let(:entity) { described_class.represent(project, provider_url: provider_url) } diff --git a/spec/serializers/project_serializer_spec.rb b/spec/serializers/project_serializer_spec.rb index 4bf0657129f..317a3714f0c 100644 --- a/spec/serializers/project_serializer_spec.rb +++ b/spec/serializers/project_serializer_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe ProjectSerializer do let_it_be(:project) { create(:project) } + let(:provider_url) { 'http://provider.com' } context 'when serializer option is :import' do diff --git a/spec/serializers/review_app_setup_entity_spec.rb b/spec/serializers/review_app_setup_entity_spec.rb index 0893d7ee47f..9b068a2e9dd 100644 --- a/spec/serializers/review_app_setup_entity_spec.rb +++ b/spec/serializers/review_app_setup_entity_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe ReviewAppSetupEntity do let_it_be(:user) { create(:admin) } + let(:project) { create(:project) } let(:presenter) { ProjectPresenter.new(project, current_user: user) } let(:entity) { described_class.new(presenter) } diff --git a/spec/serializers/runner_entity_spec.rb b/spec/serializers/runner_entity_spec.rb index e864b52c0f2..39cac65c5ac 100644 --- a/spec/serializers/runner_entity_spec.rb +++ b/spec/serializers/runner_entity_spec.rb @@ -20,6 +20,7 @@ RSpec.describe RunnerEntity do it 'contains required fields' do expect(subject).to include(:id, :description) expect(subject).to include(:edit_path) + expect(subject).to include(:short_sha) end end end diff --git a/spec/serializers/service_event_entity_spec.rb b/spec/serializers/service_event_entity_spec.rb index 09bb8bca43b..64baa57fd6d 100644 --- a/spec/serializers/service_event_entity_spec.rb +++ b/spec/serializers/service_event_entity_spec.rb @@ -17,7 +17,7 @@ RSpec.describe ServiceEventEntity do let(:event) { 'push' } it 'exposes correct attributes' do - expect(subject[:description]).to eq('Event will be triggered by a push to the repository') + expect(subject[:description]).to eq('Trigger event for pushes to the repository.') expect(subject[:name]).to eq('push_events') expect(subject[:title]).to eq('push') expect(subject[:value]).to be(true) @@ -29,7 +29,7 @@ RSpec.describe ServiceEventEntity do let(:event) { 'note' } it 'exposes correct attributes' do - expect(subject[:description]).to eq('Event will be triggered when someone adds a comment') + expect(subject[:description]).to eq('Trigger event for new comments.') expect(subject[:name]).to eq('note_events') expect(subject[:title]).to eq('note') expect(subject[:value]).to eq(false) diff --git a/spec/serializers/service_field_entity_spec.rb b/spec/serializers/service_field_entity_spec.rb index f10639dfa1b..007042e1087 100644 --- a/spec/serializers/service_field_entity_spec.rb +++ b/spec/serializers/service_field_entity_spec.rb @@ -23,10 +23,10 @@ RSpec.describe ServiceFieldEntity do type: 'text', name: 'username', title: 'Username or Email', - placeholder: 'Use a username for server version and an email for cloud version', + placeholder: nil, + help: 'Use a username for server version and an email for cloud version.', required: true, choices: nil, - help: nil, value: 'jira_username' } @@ -41,11 +41,11 @@ RSpec.describe ServiceFieldEntity do expected_hash = { type: 'password', name: 'password', - title: 'Password or API token', - placeholder: 'Use a password for server version and an API token for cloud version', + title: 'Enter new password or API token', + placeholder: nil, + help: 'Leave blank to use your current password or API token.', required: true, choices: nil, - help: nil, value: 'true' } @@ -72,7 +72,7 @@ RSpec.describe ServiceFieldEntity do } is_expected.to include(expected_hash) - expect(subject[:help]).to include("Send notifications from the committer's email address if the domain is part of the domain GitLab is running on") + expect(subject[:help]).to include("Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance") end end |