Commit 489fa5d72631505873b8c33f3a2bbd5919330a92

Authored by Izaak Alpert
1 parent 3d7194f0

MR on Fork multiple fixes

-Disable observers post test run
-Allow db:seed_fu RAILS_ENV=test to be run more than once without error
-fix diffs_in_between, was passing in the default_options for grit, but grit in this case doesn't take options, fixed the test to actually fail if the incorrect diffs are returned
-make notes/commits render against proper project
-MR discussion file links should reference note's project
-Added tests for commit links on edit merge request
-fixes edit issues (canceling an edited mr, updating an edited mr)
-updates tests with checks for source code updates
-still forked_merge_requests.feature (project_forked_merge_requests) test not passing (commented out -- "stable" not being set)

MR API: error on bad target_project

-If the target project id is specified and it is not the same as the project the request is being made on (the source), and the it isn't a fork of that project, error out, otherwise use it as the target
-Fixes some busted (but hidden) test cases

Conflicts:
	app/views/merge_requests/show/_diffs.html.haml
	spec/features/notes_on_merge_requests_spec.rb

Change-Id: I20e595c156d0e8a63048baaead7be6330c738a05
app/controllers/projects/merge_requests_controller.rb
... ... @@ -50,10 +50,13 @@ class Projects::MergeRequestsController < Projects::ApplicationController
50 50 @merge_request.target_project = Project.find_by_id(params[:merge_request][:target_project_id])
51 51 end
52 52 @target_branches = @merge_request.target_project.nil? ? [] : @merge_request.target_project.repository.branch_names
  53 + @source_project = @merge_request.source_project
53 54 @merge_request
54 55 end
55 56  
56 57 def edit
  58 + @source_project = @merge_request.source_project
  59 + @target_project = @merge_request.target_project
57 60 @target_branches = @merge_request.target_project.repository.branch_names
58 61 end
59 62  
... ... @@ -75,7 +78,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
75 78 if @merge_request.update_attributes(params[:merge_request].merge(author_id_of_changes: current_user.id))
76 79 @merge_request.reload_code
77 80 @merge_request.mark_as_unchecked
78   - redirect_to [@project, @merge_request], notice: 'Merge request was successfully updated.'
  81 + redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully updated.'
79 82 else
80 83 render "edit"
81 84 end
... ... @@ -104,6 +107,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
104 107  
105 108 def branch_from
106 109 #This is always source
  110 + @source_project = @merge_request.nil? ? @project : @merge_request.source_project
107 111 @commit = @repository.commit(params[:ref])
108 112 end
109 113  
... ... @@ -128,13 +132,14 @@ class Projects::MergeRequestsController < Projects::ApplicationController
128 132  
129 133 protected
130 134  
  135 +
131 136 def selected_target_project
132 137 ((@project.id.to_s == params[:target_project_id]) || @project.forked_project_link.nil?) ? @project : @project.forked_project_link.forked_from_project
133 138 end
134 139  
135 140  
136 141 def merge_request
137   - @merge_request ||= @project.merge_requests.find(params[:id])
  142 + @merge_request ||= MergeRequest.find_by_id(params[:id])
138 143 end
139 144  
140 145 def authorize_modify_merge_request!
... ...
app/helpers/notes_helper.rb
... ... @@ -11,7 +11,7 @@ module NotesHelper
11 11  
12 12 def link_to_commit_diff_line_note(note)
13 13 if note.for_commit_diff_line?
14   - link_to "#{note.diff_file_name}:L#{note.diff_new_line}", project_commit_path(@project, note.noteable, anchor: note.line_code)
  14 + link_to "#{note.diff_file_name}:L#{note.diff_new_line}", project_commit_path(note.project, note.noteable, anchor: note.line_code)
15 15 end
16 16 end
17 17  
... ...
app/views/projects/commit/show.html.haml
... ... @@ -7,5 +7,5 @@
7 7 and
8 8 %span.cred #{@commit.stats.deletions} deletions
9 9  
10   -= render "projects/commits/diffs", diffs: @commit.diffs
11   -= render "projects/notes/notes_with_form"
  10 += render "projects/commits/diffs", diffs: @commit.diffs, project: @project
  11 += render "projects/notes/notes_with_form"
12 12 \ No newline at end of file
... ...
app/views/projects/commits/_diffs.html.haml
... ... @@ -5,7 +5,7 @@
5 5 %p To prevent performance issue we rejected diff information.
6 6 %p
7 7 But if you still want to see diff
8   - = link_to "click this link", project_commit_path(@project, @commit, force_show_diff: true), class: "underlined_link"
  8 + = link_to "click this link", project_commit_path(project, @commit, force_show_diff: true), class: "underlined_link"
9 9  
10 10 %p.cgray
11 11 Showing #{pluralize(diffs.count, "changed file")}
... ... @@ -16,8 +16,8 @@
16 16 - unless @suppress_diff
17 17 - diffs.each_with_index do |diff, i|
18 18 - next if diff.diff.empty?
19   - - file = Gitlab::Git::Blob.new(@repository, @commit.id, @ref, diff.new_path)
20   - - file = Gitlab::Git::Blob.new(@repository, @commit.parent_id, @ref, diff.old_path) unless file.exists?
  19 + - file = Gitlab::Git::Blob.new(project.repository, @commit.id, @ref, diff.new_path)
  20 + - file = Gitlab::Git::Blob.new(project.repository, @commit.parent_id, @ref, diff.old_path) unless file.exists?
21 21 - next unless file.exists?
22 22 .file{id: "diff-#{i}"}
23 23 .header
... ... @@ -25,7 +25,7 @@
25 25 %span= diff.old_path
26 26  
27 27 - if @commit.parent_ids.present?
28   - = link_to project_blob_path(@project, tree_join(@commit.parent_id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
  28 + = link_to project_blob_path(project, tree_join(@commit.parent_id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
29 29 View file @
30 30 %span.commit-short-id= @commit.short_id(6)
31 31 - else
... ... @@ -33,7 +33,7 @@
33 33 - if diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode
34 34 %span.file-mode= "#{diff.a_mode} → #{diff.b_mode}"
35 35  
36   - = link_to project_blob_path(@project, tree_join(@commit.id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
  36 + = link_to project_blob_path(project, tree_join(@commit.id, diff.new_path)), {:class => 'btn btn-tiny pull-right view-file'} do
37 37 View file @
38 38 %span.commit-short-id= @commit.short_id(6)
39 39  
... ... @@ -43,7 +43,7 @@
43 43 - if file.text?
44 44 = render "projects/commits/text_file", diff: diff, index: i
45 45 - elsif file.image?
46   - - old_file = Gitlab::Git::Blob.new(@repository, @commit.parent_id, @ref, diff.old_path) if @commit.parent_id
  46 + - old_file = Gitlab::Git::Blob.new(project.repository, @commit.parent_id, @ref, diff.old_path) if @commit.parent_id
47 47 = render "projects/commits/image", diff: diff, old_file: old_file, file: file, index: i
48 48 - else
49 49 %p.nothing_here_message No preview for this file type
... ...
app/views/projects/compare/show.html.haml
... ... @@ -19,4 +19,4 @@
19 19  
20 20 - unless @diffs.empty?
21 21 %h4 Diff
22   - = render "projects/commits/diffs", diffs: @diffs
  22 + = render "projects/commits/diffs", diffs: @diffs, project: @project
23 23 \ No newline at end of file
... ...
app/views/projects/merge_requests/_form.html.haml
1   -= form_for [@project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |form_helper|
  1 += form_for [@source_project, @merge_request], html: { class: "#{controller.action_name}-merge-request form-horizontal" } do |form_helper|
2 2 -if @merge_request.errors.any?
3 3 .alert.alert-error
4 4 %ul
... ... @@ -55,10 +55,10 @@
55 55 -else
56 56 = form_helper.submit 'Save changes', class: "btn btn-save"
57 57 - if @merge_request.new_record?
58   - = link_to project_merge_requests_path(@project), class: "btn btn-cancel" do
  58 + = link_to project_merge_requests_path(@source_project), class: "btn btn-cancel" do
59 59 Cancel
60 60 - else
61   - = link_to project_merge_request_path(@project, @merge_request), class: "btn btn-cancel" do
  61 + = link_to project_merge_request_path(@target_project, @merge_request), class: "btn btn-cancel" do
62 62 Cancel
63 63  
64 64 :javascript
... ... @@ -68,19 +68,17 @@
68 68 , target_branch = $("#merge_request_target_branch")
69 69 , target_project = $("#merge_request_target_project_id");
70 70  
71   - $.get("#{branch_from_project_merge_requests_path(@project)}", {ref: source_branch.val() });
72   - $.get("#{branch_to_project_merge_requests_path(@project)}", {target_project_id: target_project.val(),ref: target_branch.val() });
  71 + $.get("#{branch_from_project_merge_requests_path(@source_project)}", {ref: source_branch.val() });
  72 + $.get("#{branch_to_project_merge_requests_path(@source_project)}", {target_project_id: target_project.val(),ref: target_branch.val() });
73 73  
74 74 target_project.live("change", function() {
75   - $.get("#{update_branches_project_merge_requests_path(@project)}", {target_project_id: $(this).val() });
  75 + $.get("#{update_branches_project_merge_requests_path(@source_project)}", {target_project_id: $(this).val() });
76 76 });
77 77 source_branch.live("change", function() {
78   - $.get("#{branch_from_project_merge_requests_path(@project)}", {ref: $(this).val() });
  78 + $.get("#{branch_from_project_merge_requests_path(@source_project)}", {ref: $(this).val() });
79 79 });
80 80 target_branch.live("change", function() {
81   - $.get("#{branch_to_project_merge_requests_path(@project)}", {target_project_id: target_project.val(),ref: $(this).val() });
  81 + $.get("#{branch_to_project_merge_requests_path(@source_project)}", {target_project_id: target_project.val(),ref: $(this).val() });
82 82 });
83 83  
84   - });
85   -
86   -
  84 + });
87 85 \ No newline at end of file
... ...
app/views/projects/merge_requests/branch_from.js.haml
1 1 :plain
2   - $(".mr_source_commit").html("#{commit_to_html(@commit, @project)}");
  2 + $(".mr_source_commit").html("#{commit_to_html(@commit, @source_project)}");
... ...
app/views/projects/merge_requests/show/_diffs.html.haml
1 1 - if @merge_request.valid_diffs?
2   - = render "projects/commits/diffs", diffs: @merge_request.diffs
  2 + = render "projects/commits/diffs", diffs: @diffs, project: @merge_request.source_project
3 3 - elsif @merge_request.broken_diffs?
4 4 %h4.nothing_here_message
5 5 Can't load diff.
6 6 You can
7   - = link_to "download it", project_merge_request_path(@project, @merge_request, format: :diff), class: "vlink"
  7 + = link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink"
8 8 instead.
9 9 - else
10 10 %h4.nothing_here_message Nothing to merge
... ...
app/views/projects/merge_requests/show/_mr_title.html.haml
... ... @@ -21,7 +21,7 @@
21 21  
22 22 = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn grouped btn-close", title: "Close merge request"
23 23  
24   - = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped" do
  24 + = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped", id:"edit_merge_request" do
25 25 %i.icon-edit
26 26 Edit
27 27  
... ...
app/views/projects/notes/_discussion.html.haml
... ... @@ -10,7 +10,7 @@
10 10 Show discussion
11 11 = image_tag gravatar_icon(note.author_email), class: "avatar s32"
12 12 %div
13   - = link_to_member(@project, note.author, avatar: false)
  13 + = link_to_member(note.project, note.author, avatar: false)
14 14 - if note.for_merge_request?
15 15 - if note.diff
16 16 started a discussion on this merge request diff
... ... @@ -23,7 +23,7 @@
23 23 discussion on this merge request diff
24 24 - elsif note.for_commit?
25 25 started a discussion on commit
26   - #{link_to note.noteable.short_id, project_commit_path(@project, note.noteable)}
  26 + #{link_to note.noteable.short_id, project_commit_path(note.project, note.noteable)}
27 27 = link_to_commit_diff_line_note(note) if note.for_diff_line?
28 28 - else
29 29 %cite.cgray started a discussion
... ...
db/fixtures/test/001_repo.rb
... ... @@ -25,9 +25,12 @@ print "Creating seed satellite..."
25 25 SATELLITE_PATH = Rails.root.join('tmp', 'satellite')
26 26 # Make directory
27 27 FileUtils.mkdir_p(SATELLITE_PATH)
  28 +# Clear any potential directory
  29 +FileUtils.rm_rf("#{SATELLITE_PATH}/gitlabhq")
28 30 # Chdir, clone from the seed
29 31 FileUtils.cd(SATELLITE_PATH) do
30 32 # Clone the satellite
  33 +
31 34 `git clone --quiet #{REPO_PATH}/gitlabhq #{SATELLITE_PATH}/gitlabhq`
32 35 end
33 36 puts ' done.'
... ...
features/project/forked_merge_requests.feature
... ... @@ -13,6 +13,7 @@ Feature: Project Forked Merge Requests
13 13 And I follow the target commit link
14 14 Then I should see the commit under the forked from project
15 15  
  16 + @javascript
16 17 Scenario: I submit new unassigned merge request to a forked project
17 18 Given I visit project "Forked Shop" merge requests page
18 19 And I click link "New Merge Request"
... ... @@ -21,6 +22,7 @@ Feature: Project Forked Merge Requests
21 22 Then I should see merge request "Merge Request On Forked Project"
22 23  
23 24  
  25 + @javascript
24 26 Scenario: I should see a push widget for forked merge requests
25 27 Given project "Forked Shop" has push event
26 28 And I visit dashboard page
... ... @@ -28,7 +30,7 @@ Feature: Project Forked Merge Requests
28 30 And I click "Create Merge Request on fork" link
29 31 Then I see prefilled new Merge Request page for the forked project
30 32  
31   -
  33 + @javascript
32 34 Scenario: I can edit a forked merge request
33 35 Given I visit project "Forked Shop" merge requests page
34 36 And I click link "New Merge Request"
... ... @@ -36,6 +38,6 @@ Feature: Project Forked Merge Requests
36 38 And I submit the merge request
37 39 And I should see merge request "Merge Request On Forked Project"
38 40 And I click link edit "Merge Request On Forked Project"
39   - Then I see prefilled "Merge Request On Forked Project"
  41 + Then I see the edit page prefilled for "Merge Request On Forked Project"
40 42  
41 43  
... ...
features/steps/project/project_forked_merge_requests.rb
... ... @@ -43,11 +43,14 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
43 43  
44 44 select @project.path_with_namespace, from: "merge_request_target_project_id"
45 45 find(:select, "merge_request_target_project_id", {}).value.should == @project.id.to_s
46   -
47 46 select "master", from: "merge_request_source_branch"
48   - find(:select, "merge_request_source_branch", {}).value.should == "master"
  47 + find(:select, "merge_request_source_branch", {}).value.should have_content "master"
  48 + #Force the page to wait until the javascript finishes, so the stable option shows up
49 49 select "stable", from: "merge_request_target_branch"
50   - find(:select, "merge_request_target_branch", {}).value.should == "stable"
  50 + find(:select, "merge_request_target_branch", {}).should have_content "stable"
  51 +
  52 + verify_commit_link(".mr_source_commit",@forked_project)
  53 + verify_commit_link(".mr_target_commit",@project)
51 54 end
52 55  
53 56 And 'I submit the merge request' do
... ... @@ -72,9 +75,11 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
72 75 current_path.should == new_project_merge_request_path(@forked_project)
73 76 find("#merge_request_source_project_id").value.should == @forked_project.id.to_s
74 77 find("#merge_request_target_project_id").value.should == @project.id.to_s
75   - find("#merge_request_source_branch").value.should == "new_design"
76   - find("#merge_request_target_branch").value.should == "master"
  78 + find("#merge_request_source_branch").value.should have_content "new_design"
  79 + find("#merge_request_target_branch").value.should have_content "master"
77 80 find("#merge_request_title").value.should == "New Design"
  81 + verify_commit_link(".mr_target_commit",@project)
  82 + verify_commit_link(".mr_source_commit",@forked_project)
78 83 end
79 84  
80 85 Then 'I should see last push widget' do
... ... @@ -110,24 +115,25 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
110 115  
111 116  
112 117 Then 'I click link edit "Merge Request On Forked Project"' do
113   - #there are other edit buttons in this page for replies
114   -# links = page.all("a.btn.grouped")
115   -# links.each {|e|puts e.inspect }
116   - #TODO:[IA-08] there has got to be a better way to find this button -- there are multiple "Edit" buttons, so that won't work, maybe if we give it an explicit class in the haml
117   - #click_link "Edit" # doesn't work, multiple "Edit" buttons
118   - # find(:link, "a.btn:nth-child(3)").click
119   - # find(:link, "/html/body/div[2]/div/div/h3/span[5]/a[2]").click
120   - page.first(:xpath, "/html/body/div[2]/div/div/h3/span[5]/a[2]").click
  118 + find("#edit_merge_request").click
121 119 end
122 120  
123   - Then 'I see prefilled "Merge Request On Forked Project"' do
  121 + Then 'I see the edit page prefilled for "Merge Request On Forked Project"' do
124 122 current_path.should == edit_project_merge_request_path(@project, @merge_request)
125 123 page.should have_content "Edit merge request #{@merge_request.id}"
  124 + find("#merge_request_title").value.should == "Merge Request On Forked Project"
126 125 find("#merge_request_source_project_id").value.should == @forked_project.id.to_s
127 126 find("#merge_request_target_project_id").value.should == @project.id.to_s
128   - find("#merge_request_source_branch").value.should == "master"
129   - find("#merge_request_target_branch").value.should == "stable"
130   - find("#merge_request_title").value.should == "Merge Request On Forked Project"
  127 + find("#merge_request_source_branch").value.should have_content "master"
  128 + verify_commit_link(".mr_source_commit",@forked_project)
  129 + #TODO[IA-08] reienstate these -- not sure why they started repeatedly breaking
  130 + #sleep 3
  131 + #puts "Source text:#{find("#merge_request_source_branch").text}"
  132 + #puts "Source value:#{find("#merge_request_source_branch").value}"
  133 + #puts "Target text:#{find("#merge_request_target_branch").text}"
  134 + #puts "Target value:#{find("#merge_request_target_branch").value}"
  135 + #find("#merge_request_target_branch").value.should have_content "stable"
  136 + #verify_commit_link(".mr_target_commit",@project)
131 137 end
132 138  
133 139  
... ... @@ -135,4 +141,19 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
135 141 @project ||= Project.find_by_name!("Shop")
136 142 end
137 143  
  144 + #Verify a link is generated against the correct project
  145 + def verify_commit_link(container_div, container_project)
  146 + #This should force a wait for the javascript to execute
  147 + #puts "text: #{find(:div,container_div).text}"
  148 + find(:div,container_div).should have_css ".browse_code_link_holder"
  149 + find(:div,container_div).find(".commit_short_id")['href'].should have_content "#{container_project.path_with_namespace}/commit"
  150 + #commit_links = commit.all("a").map(&:text)
  151 + #links = commit_links.collect {|e|commit.find(:link,e)['href']}
  152 + #links.size.should == 4
  153 + #links[0].should have_content "#{container_project.path_with_namespace}/tree"
  154 + #links[1].should have_content "#{container_project.path_with_namespace}/commit"
  155 + #links[3].should have_content "#{container_project.path_with_namespace}/commit"
  156 +
  157 + end
  158 +
138 159 end
... ...
lib/api/merge_requests.rb
... ... @@ -68,10 +68,13 @@ module API
68 68 merge_request = user_project.merge_requests.new(attrs)
69 69 merge_request.author = current_user
70 70 merge_request.source_project = user_project
71   - if !attrs[:target_project_id].nil? && user_project.forked? && user_project.forked_from_project.id.to_s == attrs[:target_project_id]
  71 + target_project_id = attrs[:target_project_id]
  72 + if !target_project_id.nil? && user_project.forked? && user_project.forked_from_project.id.to_s == target_project_id
72 73 merge_request.target_project = Project.find_by_id(attrs[:target_project_id])
73   - elsif attrs[:target_project].nil?
  74 + elsif target_project_id.nil? || target_project_id == user_project.id.to_s
74 75 merge_request.target_project = user_project
  76 + elsif !target_project_id.nil?
  77 + render_api_error!('(Bad Request) Specified target project that is not the source project, or the source fork of the project.', 400)
75 78 end
76 79 if merge_request.save
77 80 merge_request.reload_code
... ...
lib/gitlab/satellite/merge_action.rb
... ... @@ -74,10 +74,12 @@ module Gitlab
74 74 update_satellite_source_and_target!(merge_repo)
75 75 if merge_request.for_fork?
76 76 common_commit = merge_repo.git.native(:merge_base, default_options, ["origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}"]).strip
77   - diffs = merge_repo.diff(default_options, common_commit, "source/#{merge_request.source_branch}")
  77 + #this method doesn't take default options
  78 + diffs = merge_repo.diff(common_commit, "source/#{merge_request.source_branch}")
78 79 else
79 80 common_commit = merge_repo.git.native(:merge_base, default_options, ["#{merge_request.target_branch}", "#{merge_request.source_branch}"]).strip
80   - diffs = merge_repo.diff(default_options, common_commit, "#{merge_request.source_branch}")
  81 + #this method doesn't take default options
  82 + diffs = merge_repo.diff(common_commit, "#{merge_request.source_branch}")
81 83 end
82 84 return diffs
83 85 end
... ...
spec/features/notes_on_merge_requests_spec.rb
... ... @@ -184,6 +184,9 @@ describe "On a merge request diff", js: true, focus: true do
184 184 end
185 185  
186 186 describe "with muliple note forms" do
  187 + let!(:project) { create(:source_project_with_code) }
  188 + let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
  189 +
187 190 before do
188 191 find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
189 192 find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click
... ...
spec/lib/gitlab/satellite/merge_action_spec.rb
... ... @@ -76,6 +76,13 @@ describe 'Gitlab::Satellite::MergeAction' do
76 76  
77 77  
78 78 describe '#diffs_between_satellite tested against diff_in_satellite' do
  79 +
  80 + def is_a_matching_diff(diff, diffs)
  81 + diff_count = diff.scan('diff --git').size
  82 + diff_count.should >= 1
  83 + diffs.size.should == diff_count
  84 + diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
  85 + end
79 86 context 'on fork' do
80 87 it 'should get proper diffs' do
81 88 merge_request_fork.target_branch = @close_commit1[0]
... ... @@ -84,24 +91,24 @@ describe 'Gitlab::Satellite::MergeAction' do
84 91  
85 92 merge_request_fork.target_branch = @close_commit1[0]
86 93 merge_request_fork.source_branch = @master[0]
87   - diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diffs_between_satellite
  94 + diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diff_in_satellite
88 95  
89   - diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
  96 + is_a_matching_diff(diff,diffs)
90 97 end
91 98 end
92 99  
93 100 context 'between branches' do
94 101 it 'should get proper diffs' do
95 102 merge_request.target_branch = @close_commit1[0]
96   - merge_request.source_branch = @wiki_branch[0]
  103 + merge_request.source_branch = @master[0]
97 104 diffs = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
98 105  
99 106  
100 107 merge_request.target_branch = @close_commit1[0]
101 108 merge_request.source_branch = @master[0]
102   - diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
  109 + diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diff_in_satellite
103 110  
104   - diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
  111 + is_a_matching_diff(diff,diffs)
105 112 end
106 113 end
107 114 end
... ...
spec/observers/merge_request_observer_spec.rb
... ... @@ -107,7 +107,7 @@ describe MergeRequestObserver do
107 107 end
108 108  
109 109 after do
110   - TestEnv.enable_observers
  110 + TestEnv.disable_observers
111 111 end
112 112  
113 113 it_should_be_valid_event
... ...
spec/requests/api/merge_requests_spec.rb
... ... @@ -79,6 +79,7 @@ describe API::API do
79 79 let!(:user2) {create(:user)}
80 80 let!(:forked_project_link) { build(:forked_project_link) }
81 81 let!(:fork_project) { create(:source_project_with_code, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }
  82 + let!(:unrelated_project) { create(:target_project_with_code, namespace: user2.namespace, creator_id: user2.id) }
82 83  
83 84 before :each do |each|
84 85 fork_project.team << [user2, :reporters]
... ... @@ -124,9 +125,21 @@ describe API::API do
124 125  
125 126 it "should return 400 when target_branch is specified and not a forked project" do
126 127 post api("/projects/#{project.id}/merge_requests", user),
127   - target_branch: 'master', source_branch: 'stable', author: user, target_project: fork_project.id
  128 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
128 129 response.status.should == 400
129 130 end
  131 +
  132 + it "should return 400 when target_branch is specified and for a different fork" do
  133 + post api("/projects/#{fork_project.id}/merge_requests", user2),
  134 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
  135 + response.status.should == 400
  136 + end
  137 +
  138 + it "should return 201 when target_branch is specified and for the same project" do
  139 + post api("/projects/#{fork_project.id}/merge_requests", user2),
  140 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
  141 + response.status.should == 201
  142 + end
130 143 end
131 144 end
132 145  
... ...