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:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-07-30 14:35:33 +0400
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-07-30 14:35:33 +0400
commit0d715bcd812ca6c99884e117f28a400669aa8e57 (patch)
tree5690fa43c790af40c51441425b9d8be068d4139d /spec/lib
parent4f07a6a99cab8f8ae3ad0a786a6cc9a837955c08 (diff)
parent4d373005968b8269a8d2fe56b7776820396127a4 (diff)
Merge branch 'mr-on-fork' of https://github.com/karlhungus/gitlabhq into karlhungus-mr-on-fork
Conflicts: app/views/projects/commit/show.html.haml app/views/projects/compare/show.html.haml app/views/projects/merge_requests/branch_from.js.haml
Diffstat (limited to 'spec/lib')
-rw-r--r--spec/lib/gitlab/satellite/action_spec.rb116
-rw-r--r--spec/lib/gitlab/satellite/merge_action_spec.rb135
2 files changed, 251 insertions, 0 deletions
diff --git a/spec/lib/gitlab/satellite/action_spec.rb b/spec/lib/gitlab/satellite/action_spec.rb
new file mode 100644
index 00000000000..5e0a825c3c3
--- /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_with_code) }
+ let(:user) { create(:user) }
+
+ describe '#prepare_satellite!' do
+
+ 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
+ starting_remote_count.should >= 1
+ #kind of hookey way to add a second remote
+ origin_uri = repo.git.remote({v: true}).split(" ")[1]
+ begin
+ repo.git.remote({raise: true}, 'add', 'another-remote', origin_uri)
+ repo.git.branch({raise: true}, 'a-new-branch')
+
+ repo.heads.size.should > (starting_remote_count)
+ repo.git.remote().split(" ").size.should > (starting_remote_count)
+ rescue
+ end
+
+ repo.git.config({}, "user.name", "#{user.name} -- foo")
+ repo.git.config({}, "user.email", "#{user.email} -- foo")
+ repo.config['user.name'].should =="#{user.name} -- foo"
+ repo.config['user.email'].should =="#{user.email} -- foo"
+
+
+ #These must happen in the context of the satellite directory...
+ satellite_action = Gitlab::Satellite::Action.new(user, project)
+ project.satellite.lock {
+ #Now clean it up, use send to get around prepare_satellite! being protected
+ satellite_action.send(:prepare_satellite!, repo)
+ }
+
+ #verify it's clean
+ heads = repo.heads.map(&:name)
+ heads.size.should == 1
+ heads.include?(Gitlab::Satellite::Satellite::PARKING_BRANCH).should == true
+ remotes = repo.git.remote().split(' ')
+ remotes.size.should == 1
+ remotes.include?('origin').should == true
+ repo.config['user.name'].should ==user.name
+ repo.config['user.email'].should ==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
+ File.rm(project.satellite.lock_file) unless !File.exists? project.satellite.lock_file
+
+ File.exists?(project.satellite.lock_file).should be_false
+
+ satellite_action = Gitlab::Satellite::Action.new(user, project)
+ satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo|
+ repo.should == sat_repo
+ (File.exists? project.satellite.lock_file).should be_true
+ called = true
+ end
+
+ called.should be_true
+
+ 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
+ FileLockStatusChecker.new(project.satellite.lock_file).flocked?.should be_false
+ end
+
+ satellite_action = Gitlab::Satellite::Action.new(user, project)
+ satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo|
+ called = true
+ repo.should == sat_repo
+ (File.exists? project.satellite.lock_file).should be_true
+ FileLockStatusChecker.new(project.satellite.lock_file).flocked?.should be_true
+ end
+
+ called.should be_true
+ FileLockStatusChecker.new(project.satellite.lock_file).flocked?.should be_false
+
+ 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..98e475e715d
--- /dev/null
+++ b/spec/lib/gitlab/satellite/merge_action_spec.rb
@@ -0,0 +1,135 @@
+require 'spec_helper'
+
+describe 'Gitlab::Satellite::MergeAction' do
+ before(:each) do
+# TestEnv.init(mailer: false, init_repos: true, repos: true)
+ @master = ['master', 'bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a']
+ @one_after_stable = ['stable', '6ea87c47f0f8a24ae031c3fff17bc913889ecd00'] #this commit sha is one after stable
+ @wiki_branch = ['wiki', '635d3e09b72232b6e92a38de6cc184147e5bcb41'] #this is the commit sha where the wiki branch goes off from master
+ @conflicting_metior = ['metior', '313d96e42b313a0af5ab50fa233bf43e27118b3f'] #this branch conflicts with the wiki branch
+
+ #these commits are quite close together, itended to make string diffs/format patches small
+ @close_commit1 = ['2_3_notes_fix', '8470d70da67355c9c009e4401746b1d5410af2e3']
+ @close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633']
+ end
+
+ let(:project) { create(:project_with_code) }
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
+ let(:merge_request_fork) { create(:merge_request) }
+ describe '#commits_between' do
+ def verify_commits(commits, first_commit_sha, last_commit_sha)
+ commits.each { |commit| commit.class.should == Gitlab::Git::Commit }
+ commits.first.id.should == first_commit_sha
+ commits.last.id.should == last_commit_sha
+ end
+
+ context 'on fork' do
+ it 'should get proper commits between' do
+ merge_request_fork.target_branch = @one_after_stable[0]
+ merge_request_fork.source_branch = @master[0]
+ commits = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).commits_between
+ verify_commits(commits, @one_after_stable[1], @master[1])
+
+ merge_request_fork.target_branch = @wiki_branch[0]
+ merge_request_fork.source_branch = @master[0]
+ commits = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).commits_between
+ verify_commits(commits, @wiki_branch[1], @master[1])
+ end
+ end
+
+ context 'between branches' do
+ it 'should raise exception -- not expected to be used by non forks' do
+ merge_request.target_branch = @one_after_stable[0]
+ merge_request.source_branch = @master[0]
+ expect {Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between}.to raise_error
+
+ merge_request.target_branch = @wiki_branch[0]
+ merge_request.source_branch = @master[0]
+ expect {Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between}.to raise_error
+ end
+ end
+ end
+
+ describe '#format_patch' do
+ context 'on fork' do
+ it 'should build a format patch' do
+ merge_request_fork.target_branch = @close_commit1[0]
+ merge_request_fork.source_branch = @close_commit2[0]
+ patch = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).format_patch
+ (patch.include? "From #{@close_commit2[1]}").should be_true
+ (patch.include? "From #{@close_commit1[1]}").should be_true
+ end
+ end
+
+ context 'between branches' do
+ it 'should build a format patch' do
+ merge_request.target_branch = @close_commit1[0]
+ merge_request.source_branch = @close_commit2[0]
+ patch = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).format_patch
+ (patch.include? "From #{@close_commit2[1]}").should be_true
+ (patch.include? "From #{@close_commit1[1]}").should be_true
+ 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
+ diff_count.should >= 1
+ diffs.size.should == diff_count
+ diffs.each do |a_diff|
+ a_diff.class.should == Gitlab::Git::Diff
+ (diff.include? a_diff.diff).should be_true
+ end
+ end
+
+ context 'on fork' do
+ it 'should get proper diffs' do
+ merge_request_fork.target_branch = @close_commit1[0]
+ merge_request_fork.source_branch = @master[0]
+ diffs = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).diffs_between_satellite
+
+ merge_request_fork.target_branch = @close_commit1[0]
+ merge_request_fork.source_branch = @master[0]
+ 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
+ merge_request.target_branch = @close_commit1[0]
+ merge_request.source_branch = @master[0]
+ expect{Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite}.to raise_error
+ end
+ end
+ end
+
+ describe '#can_be_merged?' do
+ context 'on fork' do
+ it 'return true or false depending on if something is mergable' do
+ merge_request_fork.target_branch = @one_after_stable[0]
+ merge_request_fork.source_branch = @master[0]
+ Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).can_be_merged?.should be_true
+
+ merge_request_fork.target_branch = @conflicting_metior[0]
+ merge_request_fork.source_branch = @wiki_branch[0]
+ Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).can_be_merged?.should be_false
+ end
+ end
+
+ context 'between branches' do
+ it 'return true or false depending on if something is mergable' do
+ merge_request.target_branch = @one_after_stable[0]
+ merge_request.source_branch = @master[0]
+ Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).can_be_merged?.should be_true
+
+ merge_request.target_branch = @conflicting_metior[0]
+ merge_request.source_branch = @wiki_branch[0]
+ Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).can_be_merged?.should be_false
+ end
+ end
+ end
+end \ No newline at end of file