diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-08-19 12:08:42 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-08-19 12:08:42 +0300 |
commit | b76ae638462ab0f673e5915986070518dd3f9ad3 (patch) | |
tree | bdab0533383b52873be0ec0eb4d3c66598ff8b91 /spec/lib/gitlab/checks/changes_access_spec.rb | |
parent | 434373eabe7b4be9593d18a585fb763f1e5f1a6f (diff) |
Add latest changes from gitlab-org/gitlab@14-2-stable-eev14.2.0-rc42
Diffstat (limited to 'spec/lib/gitlab/checks/changes_access_spec.rb')
-rw-r--r-- | spec/lib/gitlab/checks/changes_access_spec.rb | 201 |
1 files changed, 180 insertions, 21 deletions
diff --git a/spec/lib/gitlab/checks/changes_access_spec.rb b/spec/lib/gitlab/checks/changes_access_spec.rb index a46732f8255..4a74dfcec34 100644 --- a/spec/lib/gitlab/checks/changes_access_spec.rb +++ b/spec/lib/gitlab/checks/changes_access_spec.rb @@ -3,40 +3,199 @@ require 'spec_helper' RSpec.describe Gitlab::Checks::ChangesAccess do + include_context 'changes access checks context' + + subject { changes_access } + describe '#validate!' do - include_context 'changes access checks context' + shared_examples '#validate!' do + before do + allow(project).to receive(:lfs_enabled?).and_return(true) + end - before do - allow(project).to receive(:lfs_enabled?).and_return(true) - end + context 'without failed checks' do + it "doesn't raise an error" do + expect { subject.validate! }.not_to raise_error + end - subject { changes_access } + it 'calls lfs checks' do + expect_next_instance_of(Gitlab::Checks::LfsCheck) do |instance| + expect(instance).to receive(:validate!) + end - context 'without failed checks' do - it "doesn't raise an error" do - expect { subject.validate! }.not_to raise_error + subject.validate! + end end - it 'calls lfs checks' do - expect_next_instance_of(Gitlab::Checks::LfsCheck) do |instance| - expect(instance).to receive(:validate!) + context 'when time limit was reached' do + it 'raises a TimeoutError' do + logger = Gitlab::Checks::TimedLogger.new(start_time: timeout.ago, timeout: timeout) + access = described_class.new(changes, + project: project, + user_access: user_access, + protocol: protocol, + logger: logger) + + expect { access.validate! }.to raise_error(Gitlab::Checks::TimedLogger::TimeoutError) end + end + end + + context 'with batched commits enabled' do + before do + stub_feature_flags(changes_batch_commits: true) + end + + it_behaves_like '#validate!' + end + + context 'with batched commits disabled' do + before do + stub_feature_flags(changes_batch_commits: false) + end + + it_behaves_like '#validate!' + end + end + + describe '#commits' do + it 'calls #new_commits' do + expect(project.repository).to receive(:new_commits).and_call_original + + expect(subject.commits).to eq([]) + end + + context 'when changes contain empty revisions' do + let(:changes) { [{ newrev: newrev }, { newrev: '' }, { newrev: Gitlab::Git::BLANK_SHA }] } + let(:expected_commit) { instance_double(Commit) } + + it 'returns only commits with non empty revisions' do + expect(project.repository).to receive(:new_commits).with([newrev], { allow_quarantine: true }) { [expected_commit] } + expect(subject.commits).to eq([expected_commit]) + end + end + end + + describe '#commits_for' do + let(:new_commits) { [] } + let(:expected_commits) { [] } + + shared_examples 'a listing of new commits' do + it 'returns expected commits' do + expect(subject).to receive(:commits).and_return(new_commits) + + expect(subject.commits_for(newrev)).to eq(expected_commits) + end + end + + context 'with no commits' do + it_behaves_like 'a listing of new commits' + end + + context 'with unrelated commits' do + let(:new_commits) { [create_commit('1234', %w[1111 2222])] } + + it_behaves_like 'a listing of new commits' + end + + context 'with single related commit' do + let(:new_commits) { [create_commit(newrev, %w[1111 2222])] } + let(:expected_commits) { new_commits } - subject.validate! + it_behaves_like 'a listing of new commits' + end + + context 'with single related and unrelated commit' do + let(:new_commits) do + [ + create_commit(newrev, %w[1111 2222]), + create_commit('abcd', %w[1111 2222]) + ] + end + + let(:expected_commits) do + [create_commit(newrev, %w[1111 2222])] end + + it_behaves_like 'a listing of new commits' end - context 'when time limit was reached' do - it 'raises a TimeoutError' do - logger = Gitlab::Checks::TimedLogger.new(start_time: timeout.ago, timeout: timeout) - access = described_class.new(changes, - project: project, - user_access: user_access, - protocol: protocol, - logger: logger) + context 'with multiple related commits' do + let(:new_commits) do + [ + create_commit(newrev, %w[1111]), + create_commit('1111', %w[2222]), + create_commit('abcd', []) + ] + end - expect { access.validate! }.to raise_error(Gitlab::Checks::TimedLogger::TimeoutError) + let(:expected_commits) do + [ + create_commit(newrev, %w[1111]), + create_commit('1111', %w[2222]) + ] end + + it_behaves_like 'a listing of new commits' end + + context 'with merge commits' do + let(:new_commits) do + [ + create_commit(newrev, %w[1111 2222 3333]), + create_commit('1111', []), + create_commit('3333', %w[4444]), + create_commit('4444', []) + ] + end + + let(:expected_commits) do + [ + create_commit(newrev, %w[1111 2222 3333]), + create_commit('1111', []), + create_commit('3333', %w[4444]), + create_commit('4444', []) + ] + end + + it_behaves_like 'a listing of new commits' + end + + context 'with criss-cross merges' do + let(:new_commits) do + [ + create_commit(newrev, %w[a1 b1]), + create_commit('a1', %w[a2 b2]), + create_commit('a2', %w[a3 b3]), + create_commit('a3', %w[c]), + create_commit('b1', %w[b2 a2]), + create_commit('b2', %w[b3 a3]), + create_commit('b3', %w[c]), + create_commit('c', []) + ] + end + + let(:expected_commits) do + [ + create_commit(newrev, %w[a1 b1]), + create_commit('a1', %w[a2 b2]), + create_commit('b1', %w[b2 a2]), + create_commit('a2', %w[a3 b3]), + create_commit('b2', %w[b3 a3]), + create_commit('a3', %w[c]), + create_commit('b3', %w[c]), + create_commit('c', []) + ] + end + + it_behaves_like 'a listing of new commits' + end + end + + def create_commit(id, parent_ids) + Gitlab::Git::Commit.new(project.repository, { + id: id, + parent_ids: parent_ids + }) end end |