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/serializers')
-rw-r--r--spec/serializers/admin/user_entity_spec.rb3
-rw-r--r--spec/serializers/admin/user_serializer_spec.rb2
-rw-r--r--spec/serializers/build_artifact_entity_spec.rb25
-rw-r--r--spec/serializers/ci/dag_pipeline_entity_spec.rb4
-rw-r--r--spec/serializers/ci/group_variable_entity_spec.rb2
-rw-r--r--spec/serializers/ci/lint/result_serializer_spec.rb1
-rw-r--r--spec/serializers/ci/pipeline_entity_spec.rb3
-rw-r--r--spec/serializers/container_repository_entity_spec.rb1
-rw-r--r--spec/serializers/container_tag_entity_spec.rb1
-rw-r--r--spec/serializers/deployment_serializer_spec.rb1
-rw-r--r--spec/serializers/diff_file_entity_spec.rb10
-rw-r--r--spec/serializers/environment_serializer_spec.rb50
-rw-r--r--spec/serializers/evidences/evidence_entity_spec.rb1
-rw-r--r--spec/serializers/fork_namespace_entity_spec.rb1
-rw-r--r--spec/serializers/group_link/group_group_link_entity_spec.rb1
-rw-r--r--spec/serializers/group_link/project_group_link_entity_spec.rb1
-rw-r--r--spec/serializers/issue_board_entity_spec.rb1
-rw-r--r--spec/serializers/member_entity_spec.rb1
-rw-r--r--spec/serializers/member_serializer_spec.rb65
-rw-r--r--spec/serializers/member_user_entity_spec.rb1
-rw-r--r--spec/serializers/merge_request_diff_entity_spec.rb1
-rw-r--r--spec/serializers/merge_request_poll_cached_widget_entity_spec.rb88
-rw-r--r--spec/serializers/merge_request_poll_widget_entity_spec.rb146
-rw-r--r--spec/serializers/merge_request_user_entity_spec.rb1
-rw-r--r--spec/serializers/merge_requests/pipeline_entity_spec.rb2
-rw-r--r--spec/serializers/namespace_basic_entity_spec.rb1
-rw-r--r--spec/serializers/pipeline_details_entity_spec.rb1
-rw-r--r--spec/serializers/pipeline_serializer_spec.rb21
-rw-r--r--spec/serializers/project_import_entity_spec.rb1
-rw-r--r--spec/serializers/project_serializer_spec.rb1
-rw-r--r--spec/serializers/review_app_setup_entity_spec.rb1
-rw-r--r--spec/serializers/runner_entity_spec.rb1
-rw-r--r--spec/serializers/service_event_entity_spec.rb4
-rw-r--r--spec/serializers/service_field_entity_spec.rb12
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