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
path: root/spec/lib
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib')
-rw-r--r--spec/lib/gitlab/reference_extractor_spec.rb8
-rw-r--r--spec/lib/gitlab/satellite/action_spec.rb116
-rw-r--r--spec/lib/gitlab/satellite/merge_action_spec.rb104
3 files changed, 224 insertions, 4 deletions
diff --git a/spec/lib/gitlab/reference_extractor_spec.rb b/spec/lib/gitlab/reference_extractor_spec.rb
index 088e34f050c..f921dd9cc09 100644
--- a/spec/lib/gitlab/reference_extractor_spec.rb
+++ b/spec/lib/gitlab/reference_extractor_spec.rb
@@ -25,7 +25,7 @@ describe Gitlab::ReferenceExtractor do
project.team << [@u_bar, :guest]
subject.analyze(%Q{
- Inline code: `@foo`
+ Inline code: `@foo`
Code block:
@@ -33,7 +33,7 @@ describe Gitlab::ReferenceExtractor do
@bar
```
- Quote:
+ Quote:
> @offteam
})
@@ -49,8 +49,8 @@ describe Gitlab::ReferenceExtractor do
end
it 'accesses valid merge requests' do
- @m0 = create(:merge_request, source_project: project, target_project: project, source_branch: 'markdown')
- @m1 = create(:merge_request, source_project: project, target_project: project, source_branch: 'feature_conflict')
+ @m0 = create(:merge_request, source_project: project, target_project: project, source_branch: 'aaa')
+ @m1 = create(:merge_request, source_project: project, target_project: project, source_branch: 'bbb')
subject.analyze("!999, !#{@m1.iid}, and !#{@m0.iid}.")
expect(subject.merge_requests).to eq([@m1, @m0])
diff --git a/spec/lib/gitlab/satellite/action_spec.rb b/spec/lib/gitlab/satellite/action_spec.rb
new file mode 100644
index 00000000000..0a93676edc3
--- /dev/null
+++ b/spec/lib/gitlab/satellite/action_spec.rb
@@ -0,0 +1,116 @@
+require 'spec_helper'
+
+describe 'Gitlab::Satellite::Action' do
+ let(:project) { create(:project) }
+ let(:user) { create(:user) }
+
+ describe '#prepare_satellite!' do
+ it 'should be able to fetch timeout from conf' do
+ expect(Gitlab::Satellite::Action::DEFAULT_OPTIONS[:git_timeout]).to eq(30.seconds)
+ end
+
+ it 'create a repository with a parking branch and one remote: origin' do
+ repo = project.satellite.repo
+
+ #now lets dirty it up
+
+ starting_remote_count = repo.git.list_remotes.size
+ expect(starting_remote_count).to be >= 1
+ #kind of hookey way to add a second remote
+ origin_uri = repo.git.remote({ v: true }).split(" ")[1]
+
+ repo.git.remote({ raise: true }, 'add', 'another-remote', origin_uri)
+ repo.git.branch({ raise: true }, 'a-new-branch')
+
+ expect(repo.heads.size).to be > (starting_remote_count)
+ expect(repo.git.remote().split(" ").size).to be > (starting_remote_count)
+
+ repo.git.config({}, "user.name", "#{user.name} -- foo")
+ repo.git.config({}, "user.email", "#{user.email} -- foo")
+ expect(repo.config['user.name']).to eq("#{user.name} -- foo")
+ expect(repo.config['user.email']).to eq("#{user.email} -- foo")
+
+
+ #These must happen in the context of the satellite directory...
+ satellite_action = Gitlab::Satellite::Action.new(user, project)
+ project.satellite.lock do
+ #Now clean it up, use send to get around prepare_satellite! being protected
+ satellite_action.send(:prepare_satellite!, repo)
+ end
+
+ #verify it's clean
+ heads = repo.heads.map(&:name)
+ expect(heads.size).to eq(1)
+ expect(heads.include?(Gitlab::Satellite::Satellite::PARKING_BRANCH)).to eq(true)
+ remotes = repo.git.remote().split(' ')
+ expect(remotes.size).to eq(1)
+ expect(remotes.include?('origin')).to eq(true)
+ expect(repo.config['user.name']).to eq(user.name)
+ expect(repo.config['user.email']).to eq(user.email)
+ end
+ end
+
+ describe '#in_locked_and_timed_satellite' do
+
+ it 'should make use of a lockfile' do
+ repo = project.satellite.repo
+ called = false
+
+ #set assumptions
+ FileUtils.rm_f(project.satellite.lock_file)
+
+ expect(File.exists?(project.satellite.lock_file)).to be_falsey
+
+ satellite_action = Gitlab::Satellite::Action.new(user, project)
+ satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo|
+ expect(repo).to eq(sat_repo)
+ expect(File.exists? project.satellite.lock_file).to be_truthy
+ called = true
+ end
+
+ expect(called).to be_truthy
+
+ end
+
+ it 'should be able to use the satellite after locking' do
+ repo = project.satellite.repo
+ called = false
+
+ # Set base assumptions
+ if File.exists? project.satellite.lock_file
+ expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_falsey
+ end
+
+ satellite_action = Gitlab::Satellite::Action.new(user, project)
+ satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo|
+ called = true
+ expect(repo).to eq(sat_repo)
+ expect(File.exists? project.satellite.lock_file).to be_truthy
+ expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_truthy
+ end
+
+ expect(called).to be_truthy
+ expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_falsey
+
+ end
+
+ class FileLockStatusChecker < File
+ def flocked?(&block)
+ status = flock LOCK_EX|LOCK_NB
+ case status
+ when false
+ return true
+ when 0
+ begin
+ block ? block.call : false
+ ensure
+ flock LOCK_UN
+ end
+ else
+ raise SystemCallError, status
+ end
+ end
+ end
+
+ end
+end
diff --git a/spec/lib/gitlab/satellite/merge_action_spec.rb b/spec/lib/gitlab/satellite/merge_action_spec.rb
new file mode 100644
index 00000000000..9b1c9a34e29
--- /dev/null
+++ b/spec/lib/gitlab/satellite/merge_action_spec.rb
@@ -0,0 +1,104 @@
+require 'spec_helper'
+
+describe 'Gitlab::Satellite::MergeAction' do
+ include RepoHelpers
+
+ let(:project) { create(:project, namespace: create(:group)) }
+ let(:fork_project) { create(:project, namespace: create(:group), forked_from_project: project) }
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
+ let(:merge_request_fork) { create(:merge_request, source_project: fork_project, target_project: project) }
+
+ let(:merge_request_with_conflict) { create(:merge_request, :conflict, source_project: project, target_project: project) }
+ let(:merge_request_fork_with_conflict) { create(:merge_request, :conflict, source_project: project, target_project: project) }
+
+ describe '#commits_between' do
+ def verify_commits(commits, first_commit_sha, last_commit_sha)
+ commits.each { |commit| expect(commit.class).to eq(Gitlab::Git::Commit) }
+ expect(commits.first.id).to eq(first_commit_sha)
+ expect(commits.last.id).to eq(last_commit_sha)
+ end
+
+ context 'on fork' do
+ it 'should get proper commits between' do
+ commits = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).commits_between
+ verify_commits(commits, sample_compare.commits.first, sample_compare.commits.last)
+ end
+ end
+
+ context 'between branches' do
+ it 'should raise exception -- not expected to be used by non forks' do
+ expect { Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between }.to raise_error(RuntimeError)
+ end
+ end
+ end
+
+ describe '#format_patch' do
+ def verify_content(patch)
+ sample_compare.commits.each do |commit|
+ expect(patch.include?(commit)).to be_truthy
+ end
+ end
+
+ context 'on fork' do
+ it 'should build a format patch' do
+ patch = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).format_patch
+ verify_content(patch)
+ end
+ end
+
+ context 'between branches' do
+ it 'should build a format patch' do
+ patch = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request).format_patch
+ verify_content(patch)
+ end
+ end
+ end
+
+ describe '#diffs_between_satellite tested against diff_in_satellite' do
+ def is_a_matching_diff(diff, diffs)
+ diff_count = diff.scan('diff --git').size
+ expect(diff_count).to be >= 1
+ expect(diffs.size).to eq(diff_count)
+ diffs.each do |a_diff|
+ expect(a_diff.class).to eq(Gitlab::Git::Diff)
+ expect(diff.include? a_diff.diff).to be_truthy
+ end
+ end
+
+ context 'on fork' do
+ it 'should get proper diffs' do
+ diffs = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).diffs_between_satellite
+ diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diff_in_satellite
+ is_a_matching_diff(diff, diffs)
+ end
+ end
+
+ context 'between branches' do
+ it 'should get proper diffs' do
+ expect{ Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite }.to raise_error(RuntimeError)
+ end
+ end
+ end
+
+ describe '#can_be_merged?' do
+ context 'on fork' do
+ it do
+ expect(Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).can_be_merged?).to be_truthy
+ end
+
+ it do
+ expect(Gitlab::Satellite::MergeAction.new(merge_request_fork_with_conflict.author, merge_request_fork_with_conflict).can_be_merged?).to be_falsey
+ end
+ end
+
+ context 'between branches' do
+ it do
+ expect(Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).can_be_merged?).to be_truthy
+ end
+
+ it do
+ expect(Gitlab::Satellite::MergeAction.new(merge_request_with_conflict.author, merge_request_with_conflict).can_be_merged?).to be_falsey
+ end
+ end
+ end
+end