diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-07-30 14:35:33 +0400 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-07-30 14:35:33 +0400 |
commit | 0d715bcd812ca6c99884e117f28a400669aa8e57 (patch) | |
tree | 5690fa43c790af40c51441425b9d8be068d4139d /spec/lib | |
parent | 4f07a6a99cab8f8ae3ad0a786a6cc9a837955c08 (diff) | |
parent | 4d373005968b8269a8d2fe56b7776820396127a4 (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.rb | 116 | ||||
-rw-r--r-- | spec/lib/gitlab/satellite/merge_action_spec.rb | 135 |
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 |