summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorIzaak Alpert <ihalpert@blackberry.com>2013-04-25 10:15:33 -0400
committerIzaak Alpert <ialpert@blackberry.com>2013-07-17 22:41:30 -0400
commit3d7194f0112da12e8732df9ffe8b34fe7d0a9f6b (patch)
tree9b3c68c04b5ead5e35456595a07453b036b2dbc8 /spec
parentfd033671933fcc0f472480d98c907aefde357416 (diff)
downloadgitlab-ce-3d7194f0112da12e8732df9ffe8b34fe7d0a9f6b.tar.gz
Merge Request on forked projects
The good: - You can do a merge request for a forked commit and it will merge properly (i.e. it does work). - Push events take into account merge requests on forked projects - Tests around merge_actions now present, spinach, and other rspec tests - Satellites now clean themselves up rather then recreate The questionable: - Events only know about target projects - Project's merge requests only hold on to MR's where they are the target - All operations performed in the satellite The bad: - Duplication between project's repositories and satellites (e.g. commits_between) (for reference: http://feedback.gitlab.com/forums/176466-general/suggestions/3456722-merge-requests-between-projects-repos) Fixes: Make test repos/satellites only create when needed -Spinach/Rspec now only initialize test directory, and setup stubs (things that are relatively cheap) -project_with_code, source_project_with_code, and target_project_with_code now create/destroy their repos individually -fixed remote removal -How to merge renders properly -Update emails to show project/branches -Edit MR doesn't set target branch -Fix some failures on editing/creating merge requests, added a test -Added back a test around merge request observer -Clean up project_transfer_spec, Remove duplicate enable/disable observers -Ensure satellite lock files are cleaned up, Attempted to add some testing around these as well -Signifant speed ups for tests -Update formatting ordering in notes_on_merge_requests -Remove wiki schema update Fixes for search/search results -Search results was using by_project for a list of projects, updated this to use in_projects -updated search results to reference the correct (target) project -udpated search results to print both sides of the merge request Change-Id: I19407990a0950945cc95d62089cbcc6262dab1a8
Diffstat (limited to 'spec')
-rw-r--r--spec/contexts/filter_context_spec.rb57
-rw-r--r--spec/controllers/commit_controller_spec.rb5
-rw-r--r--spec/controllers/commits_controller_spec.rb2
-rw-r--r--spec/controllers/merge_requests_controller_spec.rb4
-rw-r--r--spec/factories.rb50
-rw-r--r--spec/factories_spec.rb2
-rw-r--r--spec/features/gitlab_flavored_markdown_spec.rb12
-rw-r--r--spec/features/notes_on_merge_requests_spec.rb72
-rw-r--r--spec/features/profile_spec.rb1
-rw-r--r--spec/features/projects_spec.rb1
-rw-r--r--spec/features/security/project_access_spec.rb19
-rw-r--r--spec/helpers/gitlab_markdown_helper_spec.rb2
-rw-r--r--spec/lib/gitlab/satellite/action_spec.rb131
-rw-r--r--spec/lib/gitlab/satellite/merge_action_spec.rb136
-rw-r--r--spec/mailers/notify_spec.rb4
-rw-r--r--spec/models/commit_spec.rb1
-rw-r--r--spec/models/forked_project_link_spec.rb12
-rw-r--r--spec/models/merge_request_spec.rb40
-rw-r--r--spec/models/note_spec.rb16
-rw-r--r--spec/models/project_spec.rb10
-rw-r--r--spec/observers/activity_observer_spec.rb12
-rw-r--r--spec/observers/issue_observer_spec.rb6
-rw-r--r--spec/observers/merge_request_observer_spec.rb52
-rw-r--r--spec/observers/user_observer_spec.rb1
-rw-r--r--spec/observers/users_project_observer_spec.rb1
-rw-r--r--spec/requests/api/merge_requests_spec.rb120
-rw-r--r--spec/requests/api/milestones_spec.rb1
-rw-r--r--spec/requests/api/notes_spec.rb2
-rw-r--r--spec/requests/api/projects_spec.rb74
-rw-r--r--spec/services/notification_service_spec.rb3
-rw-r--r--spec/services/project_transfer_service_spec.rb2
-rw-r--r--spec/spec_helper.rb7
-rw-r--r--spec/support/test_env.rb98
33 files changed, 751 insertions, 205 deletions
diff --git a/spec/contexts/filter_context_spec.rb b/spec/contexts/filter_context_spec.rb
new file mode 100644
index 00000000000..1732353dd76
--- /dev/null
+++ b/spec/contexts/filter_context_spec.rb
@@ -0,0 +1,57 @@
+require 'spec_helper'
+
+describe FilterContext do
+
+ let(:user) { create :user }
+ let(:user2) { create :user }
+ let(:project1) { create(:project, creator_id: user.id) }
+ let(:project2) { create(:project, creator_id: user.id) }
+ let(:merge_request1) { create(:merge_request, author_id: user.id, source_project: project1, target_project: project2) }
+ let(:merge_request2) { create(:merge_request, author_id: user.id, source_project: project2, target_project: project1) }
+ let(:merge_request3) { create(:merge_request, author_id: user.id, source_project: project2, target_project: project2) }
+ let(:merge_request4) { create(:merge_request, author_id: user2.id, source_project: project2, target_project: project2) }
+ let(:issue1) { create(:issue, assignee_id: user.id, project: project1) }
+ let(:issue2) { create(:issue, assignee_id: user.id, project: project2) }
+ let(:issue3) { create(:issue, assignee_id: user2.id, project: project2) }
+
+ describe 'merge requests' do
+ before :each do
+ merge_request1
+ merge_request2
+ merge_request3
+ merge_request4
+ end
+ it 'should by default filter properly' do
+ merge_requests = user.cared_merge_requests
+ params ={}
+ merge_requests = FilterContext.new(merge_requests, params).execute
+ merge_requests.size.should == 3
+ end
+ it 'should apply blocks passed in on creation to the filters' do
+ merge_requests = user.cared_merge_requests
+ params = {:project_id => project1.id}
+ merge_requests = FilterContext.new(merge_requests, params).execute
+ merge_requests.size.should == 2
+ end
+ end
+
+ describe 'issues' do
+ before :each do
+ issue1
+ issue2
+ issue3
+ end
+ it 'should by default filter projects properly' do
+ issues = user.assigned_issues
+ params = {}
+ issues = FilterContext.new(issues, params).execute
+ issues.size.should == 2
+ end
+ it 'should apply blocks passed in on creation to the filters' do
+ issues = user.assigned_issues
+ params = {:project_id => project1.id}
+ issues = FilterContext.new(issues, params).execute
+ issues.size.should == 1
+ end
+ end
+end \ No newline at end of file
diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb
index 87c54143a05..8e98b0a3ce3 100644
--- a/spec/controllers/commit_controller_spec.rb
+++ b/spec/controllers/commit_controller_spec.rb
@@ -2,12 +2,11 @@ require 'spec_helper'
describe Projects::CommitController do
let(:project) { create(:project_with_code) }
- let(:user) { create(:user) }
- let(:commit) { project.repository.last_commit_for("master") }
+ let(:user) { create(:user) }
+ let(:commit) { project.repository.last_commit_for("master") }
before do
sign_in(user)
-
project.team << [user, :master]
end
diff --git a/spec/controllers/commits_controller_spec.rb b/spec/controllers/commits_controller_spec.rb
index c9931a19622..facae17a0ad 100644
--- a/spec/controllers/commits_controller_spec.rb
+++ b/spec/controllers/commits_controller_spec.rb
@@ -2,7 +2,7 @@ require 'spec_helper'
describe Projects::CommitsController do
let(:project) { create(:project_with_code) }
- let(:user) { create(:user) }
+ let(:user) { create(:user) }
before do
sign_in(user)
diff --git a/spec/controllers/merge_requests_controller_spec.rb b/spec/controllers/merge_requests_controller_spec.rb
index 51ba6ca5945..d344e3eb14c 100644
--- a/spec/controllers/merge_requests_controller_spec.rb
+++ b/spec/controllers/merge_requests_controller_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe Projects::MergeRequestsController do
let(:project) { create(:project_with_code) }
let(:user) { create(:user) }
- let(:merge_request) { create(:merge_request_with_diffs, project: project, target_branch: "bcf03b5d~3", source_branch: "bcf03b5d") }
+ let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "bcf03b5d~3", source_branch: "bcf03b5d") }
before do
sign_in(user)
@@ -28,7 +28,7 @@ describe Projects::MergeRequestsController do
it "should render it" do
get :show, project_id: project.code, id: merge_request.id, format: format
- expect(response.body).to eq(merge_request.send(:"to_#{format}"))
+ expect(response.body).to eq((merge_request.send(:"to_#{format}",user)).to_s)
end
it "should not escape Html" do
diff --git a/spec/factories.rb b/spec/factories.rb
index 793bd2434e8..831b4fbd46b 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -1,4 +1,8 @@
+<<<<<<< HEAD
include ActionDispatch::TestProcess
+=======
+require Rails.root.join('spec', 'support', 'test_env.rb')
+>>>>>>> Merge Request on forked projects
FactoryGirl.define do
sequence :sentence, aliases: [:title, :content] do
@@ -29,8 +33,19 @@ FactoryGirl.define do
sequence(:name) { |n| "project#{n}" }
path { name.downcase.gsub(/\s/, '_') }
creator
+
+ trait :source do
+ sequence(:name) { |n| "source project#{n}" }
+ end
+ trait :target do
+ sequence(:name) { |n| "target project#{n}" }
+ end
+
+ factory :source_project, traits: [:source]
+ factory :target_project, traits: [:target]
end
+
factory :redmine_project, parent: :project do
issues_tracker { "redmine" }
issues_tracker_id { "project_name_in_redmine" }
@@ -39,14 +54,24 @@ FactoryGirl.define do
factory :project_with_code, parent: :project do
path { 'gitlabhq' }
+ trait :source_path do
+ path { 'source_gitlabhq' }
+ end
+
+ trait :target_path do
+ path { 'target_gitlabhq' }
+ end
+
+ factory :source_project_with_code, traits: [:source, :source_path]
+ factory :target_project_with_code, traits: [:target, :target_path]
+
after :create do |project|
- repos_path = Rails.root.join('tmp', 'test-git-base-path')
- seed_repo = Rails.root.join('tmp', 'repositories', 'gitlabhq')
- target_repo = File.join(repos_path, project.path_with_namespace + '.git')
- system("ln -s #{seed_repo} #{target_repo}")
+ TestEnv.clear_repo_dir(project.namespace, project.path)
+ TestEnv.create_repo(project.namespace, project.path)
end
end
+
factory :group do
sequence(:name) { |n| "group#{n}" }
path { name.downcase.gsub(/\s/, '_') }
@@ -86,7 +111,8 @@ FactoryGirl.define do
factory :merge_request do
title
author
- project factory: :project_with_code
+ source_project factory: :source_project_with_code
+ target_project factory: :target_project_with_code
source_branch "master"
target_branch "stable"
@@ -96,13 +122,13 @@ FactoryGirl.define do
source_branch "stable" # pretend bcf03b5d
st_commits do
[
- project.repository.commit('bcf03b5d').to_hash,
- project.repository.commit('bcf03b5d~1').to_hash,
- project.repository.commit('bcf03b5d~2').to_hash
+ source_project.repository.commit('bcf03b5d').to_hash,
+ source_project.repository.commit('bcf03b5d~1').to_hash,
+ source_project.repository.commit('bcf03b5d~2').to_hash
]
end
st_diffs do
- project.repo.diff("bcf03b5d~3", "bcf03b5d")
+ source_project.repo.diff("bcf03b5d~3", "bcf03b5d")
end
end
@@ -133,7 +159,7 @@ FactoryGirl.define do
trait :on_commit do
project factory: :project_with_code
- commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
+ commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
noteable_type "Commit"
end
@@ -143,12 +169,12 @@ FactoryGirl.define do
trait :on_merge_request do
project factory: :project_with_code
- noteable_id 1
+ noteable_id 1
noteable_type "MergeRequest"
end
trait :on_issue do
- noteable_id 1
+ noteable_id 1
noteable_type "Issue"
end
diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb
index 8360477d8fe..7f887be9ce9 100644
--- a/spec/factories_spec.rb
+++ b/spec/factories_spec.rb
@@ -5,8 +5,10 @@ INVALID_FACTORIES = [
:invalid_key,
]
+
FactoryGirl.factories.map(&:name).each do |factory_name|
next if INVALID_FACTORIES.include?(factory_name)
+
describe "#{factory_name} factory" do
it 'should be valid' do
build(factory_name).should be_valid
diff --git a/spec/features/gitlab_flavored_markdown_spec.rb b/spec/features/gitlab_flavored_markdown_spec.rb
index e67df7c1fb0..349d68399fc 100644
--- a/spec/features/gitlab_flavored_markdown_spec.rb
+++ b/spec/features/gitlab_flavored_markdown_spec.rb
@@ -3,11 +3,11 @@ require 'spec_helper'
describe "GitLab Flavored Markdown" do
let(:project) { create(:project_with_code) }
let(:issue) { create(:issue, project: project) }
- let(:merge_request) { create(:merge_request, project: project) }
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:fred) do
- u = create(:user, name: "fred")
- project.team << [u, :master]
- u
+ u = create(:user, name: "fred")
+ project.team << [u, :master]
+ u
end
before do
@@ -83,9 +83,7 @@ describe "GitLab Flavored Markdown" do
describe "for merge requests" do
before do
- @merge_request = create(:merge_request,
- project: project,
- title: "fix ##{issue.id}")
+ @merge_request = create(:merge_request, source_project: project, target_project: project, title: "fix ##{issue.id}")
end
it "should render title in merge_requests#index" do
diff --git a/spec/features/notes_on_merge_requests_spec.rb b/spec/features/notes_on_merge_requests_spec.rb
index 4aa8937926c..34e07e72056 100644
--- a/spec/features/notes_on_merge_requests_spec.rb
+++ b/spec/features/notes_on_merge_requests_spec.rb
@@ -2,8 +2,8 @@ require 'spec_helper'
describe "On a merge request", js: true do
let!(:project) { create(:project_with_code) }
- let!(:merge_request) { create(:merge_request, project: project) }
- let!(:note) { create(:note_on_merge_request_with_attachment, project: project) }
+ let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
+ let!(:note) { create(:note_on_merge_request_with_attachment, source_project: project, target_project: project) }
before do
login_as :user
@@ -62,7 +62,7 @@ describe "On a merge request", js: true do
it 'should be added and form reset' do
should have_content("This is awsome!")
- within(".js-main-target-form") { should have_no_field("note[note]", with: "This is awesome!") }
+ within(".js-main-target-form") { should have_no_field("note[note]", with: "This is awesome!") }
within(".js-main-target-form") { should have_css(".js-note-preview", visible: false) }
within(".js-main-target-form") { should have_css(".js-note-text", visible: true) }
end
@@ -135,8 +135,8 @@ describe "On a merge request", js: true do
end
describe "On a merge request diff", js: true, focus: true do
- let!(:project) { create(:project_with_code) }
- let!(:merge_request) { create(:merge_request_with_diffs, project: project) }
+ let!(:project) { create(:source_project_with_code) }
+ let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
before do
login_as :user
@@ -144,6 +144,7 @@ describe "On a merge request diff", js: true, focus: true do
visit diffs_project_merge_request_path(project, merge_request)
end
+
subject { page }
describe "when adding a note" do
@@ -205,13 +206,13 @@ describe "On a merge request diff", js: true, focus: true do
# TODO: fix
#it 'should check if previews were rendered separately' do
- #within("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185'] + .js-temp-notes-holder") do
- #should have_css(".js-note-preview", text: "One comment on line 185")
- #end
+ #within("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185'] + .js-temp-notes-holder") do
+ #should have_css(".js-note-preview", text: "One comment on line 185")
+ #end
- #within("tr[id='342e16cbbd482ac2047dc679b2749d248cc1428f_18_17'] + .js-temp-notes-holder") do
- #should have_css(".js-note-preview", text: "Another comment on line 17")
- #end
+ #within("tr[id='342e16cbbd482ac2047dc679b2749d248cc1428f_18_17'] + .js-temp-notes-holder") do
+ #should have_css(".js-note-preview", text: "Another comment on line 17")
+ #end
#end
end
@@ -238,39 +239,38 @@ describe "On a merge request diff", js: true, focus: true do
# TODO: fix
#it "should remove last note of a discussion" do
- #within("tr[id='342e16cbbd482ac2047dc679b2749d248cc1428f_18_17'] + .notes-holder") do
- #find(".js-note-delete").click
- #end
-
- #should_not have_css(".note_holder")
+ # within("tr[id='342e16cbbd482ac2047dc679b2749d248cc1428f_18_17'] + .notes-holder") do
+ # find(".js-note-delete").click
+ # end
+ # should_not have_css(".note_holder")
#end
end
end
# TODO: fix
#describe "when replying to a note" do
- #before do
- ## create first note
- #find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184"]').click
+ #before do
+ ## create first note
+ # find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184"]').click
- #within(".js-temp-notes-holder") do
- #fill_in "note[note]", with: "One comment on line 184"
- #click_button("Add Comment")
- #end
+ # within(".js-temp-notes-holder") do
+ # fill_in "note[note]", with: "One comment on line 184"
+ # click_button("Add Comment")
+ #end
- #within(".js-temp-notes-holder") do
- #find(".js-discussion-reply-button").click
- #fill_in "note[note]", with: "An additional comment in reply"
- #click_button("Add Comment")
- #end
- #end
-
- #it 'should be inserted and form removed from reply' do
- #should have_content("An additional comment in reply")
- #within(".notes_holder") { should have_css(".note", count: 2) }
- #within(".notes_holder") { should have_no_css("form") }
- #within(".notes_holder") { should have_link("Reply") }
- #end
+ # within(".js-temp-notes-holder") do
+ # find(".js-discussion-reply-button").click
+ # fill_in "note[note]", with: "An additional comment in reply"
+ # click_button("Add Comment")
+ # end
+ #end
+
+ #it 'should be inserted and form removed from reply' do
+ # should have_content("An additional comment in reply")
+ # within(".notes_holder") { should have_css(".note", count: 2) }
+ # within(".notes_holder") { should have_no_css("form") }
+ # within(".notes_holder") { should have_link("Reply") }
+ # end
#end
end
diff --git a/spec/features/profile_spec.rb b/spec/features/profile_spec.rb
index d46882d4e42..7fa474d0ea1 100644
--- a/spec/features/profile_spec.rb
+++ b/spec/features/profile_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe "Profile account page" do
before(:each) { enable_observers }
+ after(:each) {disable_observers}
let(:user) { create(:user) }
before do
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index f0a1f75e1e0..9d5f9d5a2e2 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe "Projects" do
before(:each) { enable_observers }
+ after(:each) {disable_observers}
before { login_as :user }
describe "DELETE /projects/:id" do
diff --git a/spec/features/security/project_access_spec.rb b/spec/features/security/project_access_spec.rb
index 6bc04726a9d..e426e40bb5d 100644
--- a/spec/features/security/project_access_spec.rb
+++ b/spec/features/security/project_access_spec.rb
@@ -14,13 +14,14 @@ describe "Application access" do
end
describe "Project" do
- let(:project) { create(:project_with_code) }
+ let(:project) { create(:project_with_code) }
- let(:master) { create(:user) }
- let(:guest) { create(:user) }
+ let(:master) { create(:user) }
+ let(:guest) { create(:user) }
let(:reporter) { create(:user) }
before do
+
# full access
project.team << [master, :master]
@@ -108,7 +109,7 @@ describe "Application access" do
describe "GET /project_code/blob" do
before do
commit = project.repository.commit
- path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob)}.first.name
+ path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob) }.first.name
@blob_path = project_blob_path(project, File.join(commit.id, path))
end
@@ -232,13 +233,13 @@ describe "Application access" do
describe "PublicProject" do
- let(:project) { create(:project_with_code) }
+ let(:project) { create(:project_with_code) }
- let(:master) { create(:user) }
- let(:guest) { create(:user) }
+ let(:master) { create(:user) }
+ let(:guest) { create(:user) }
let(:reporter) { create(:user) }
- let(:admin) { create(:user) }
+ let(:admin) { create(:user) }
before do
# public project
@@ -339,7 +340,7 @@ describe "Application access" do
describe "GET /project_code/blob" do
before do
commit = project.repository.commit
- path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob)}.first.name
+ path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob) }.first.name
@blob_path = project_blob_path(project, File.join(commit.id, path))
end
diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb
index 0f206f47234..1e7b5336b8d 100644
--- a/spec/helpers/gitlab_markdown_helper_spec.rb
+++ b/spec/helpers/gitlab_markdown_helper_spec.rb
@@ -9,7 +9,7 @@ describe GitlabMarkdownHelper do
let(:user) { create(:user, username: 'gfm') }
let(:commit) { project.repository.commit }
let(:issue) { create(:issue, project: project) }
- let(:merge_request) { create(:merge_request, project: project) }
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:snippet) { create(:project_snippet, project: project) }
let(:member) { project.users_projects.where(user_id: user).first }
diff --git a/spec/lib/gitlab/satellite/action_spec.rb b/spec/lib/gitlab/satellite/action_spec.rb
new file mode 100644
index 00000000000..3a2dd0bf6d3
--- /dev/null
+++ b/spec/lib/gitlab/satellite/action_spec.rb
@@ -0,0 +1,131 @@
+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
+ pending "can't test this, doesn't seem to be a way to the the flock status on a file, throwing piles of processes at it seems lousy too"
+ repo = project.satellite.repo
+ first_call = false
+
+ (File.exists? project.satellite.lock_file).should be_false
+
+ test_file = ->(called) {
+ File.exists?(project.satellite.lock_file).should be_true
+ called.should be_true
+ File.readlines.should == "some test code"
+ File.truncate(project.satellite.lock, 0)
+ File.readlines.should == ""
+ }
+
+ write_file = ->(called, checker) {
+ if (File.exists?(project.satellite.lock_file))
+ file = File.open(project.satellite.lock, '+w')
+ file.write("some test code")
+ file.close
+ checker.call(called)
+ end
+ }
+
+
+ satellite_action = Gitlab::Satellite::Action.new(user, project)
+ satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo|
+ write_file.call(first_call, test_file)
+ first_call = true
+ repo.should == sat_repo
+ (File.exists? project.satellite.lock_file).should be_true
+
+ end
+
+ first_call.should be_true
+ puts File.stat(project.satellite.lock_file).inspect
+
+ second_call = false
+ satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo|
+ write_file.call(second_call, test_file)
+ second_call = true
+ repo.should == sat_repo
+ (File.exists? project.satellite.lock_file).should be_true
+ end
+
+ second_call.should be_true
+ (File.exists? project.satellite.lock_file).should be_true
+ 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..36e6b3c7973
--- /dev/null
+++ b/spec/lib/gitlab/satellite/merge_action_spec.rb
@@ -0,0 +1,136 @@
+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
+ 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
+ commits.first.id.should == @one_after_stable[1]
+ commits.last.id.should == @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
+ commits.first.id.should == @wiki_branch[1]
+ commits.last.id.should == @master[1]
+ end
+ end
+
+ context 'between branches' do
+ it 'should get proper commits between' do
+ merge_request.target_branch = @one_after_stable[0]
+ merge_request.source_branch = @master[0]
+ commits = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between
+ commits.first.id.should == @one_after_stable[1]
+ commits.last.id.should == @master[1]
+
+ merge_request.target_branch = @wiki_branch[0]
+ merge_request.source_branch = @master[0]
+ commits = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between
+ commits.first.id.should == @wiki_branch[1]
+ commits.last.id.should == @master[1]
+ 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
+ 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).diffs_between_satellite
+
+ diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
+ end
+ end
+
+ context 'between branches' do
+ it 'should get proper diffs' do
+ merge_request.target_branch = @close_commit1[0]
+ merge_request.source_branch = @wiki_branch[0]
+ diffs = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
+
+
+ merge_request.target_branch = @close_commit1[0]
+ merge_request.source_branch = @master[0]
+ diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
+
+ diffs.each {|a_diff| (diff.include? a_diff.diff).should be_true}
+ 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
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index e7e8bc5b028..d89029276d8 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -167,7 +167,7 @@ describe Notify do
end
context 'for merge requests' do
- let(:merge_request) { create(:merge_request, assignee: assignee, project: project) }
+ let(:merge_request) { create(:merge_request, assignee: assignee, source_project: project, target_project: project) }
describe 'that are new' do
subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
@@ -311,7 +311,7 @@ describe Notify do
end
describe 'on a merge request' do
- let(:merge_request) { create(:merge_request, project: project) }
+ let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:note_on_merge_request_path) { project_merge_request_path(project, merge_request, anchor: "note_#{note.id}") }
before(:each) { note.stub(:noteable).and_return(merge_request) }
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index ad99d8a390b..b84f24bf3ad 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -3,7 +3,6 @@ require 'spec_helper'
describe Commit do
let(:commit) { create(:project_with_code).repository.commit }
-
describe '#title' do
it "returns no_commit_message when safe_message is blank" do
commit.stub(:safe_message).and_return('')
diff --git a/spec/models/forked_project_link_spec.rb b/spec/models/forked_project_link_spec.rb
index 5f25e2abd23..44b8c6155be 100644
--- a/spec/models/forked_project_link_spec.rb
+++ b/spec/models/forked_project_link_spec.rb
@@ -12,9 +12,9 @@
require 'spec_helper'
describe ForkedProjectLink, "add link on fork" do
- let(:project_from) {create(:project)}
- let(:namespace) {create(:namespace)}
- let(:user) {create(:user, namespace: namespace)}
+ let(:project_from) { create(:project) }
+ let(:namespace) { create(:namespace) }
+ let(:user) { create(:user, namespace: namespace) }
before do
@project_to = fork_project(project_from, user)
@@ -30,9 +30,9 @@ describe ForkedProjectLink, "add link on fork" do
end
describe :forked_from_project do
- let(:forked_project_link) {build(:forked_project_link)}
- let(:project_from) {create(:project)}
- let(:project_to) {create(:project, forked_project_link: forked_project_link)}
+ let(:forked_project_link) { build(:forked_project_link) }
+ let(:project_from) { create(:project) }
+ let(:project_to) { create(:project, forked_project_link: forked_project_link) }
before :each do
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index a0a43fbb815..cb15d250c12 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -41,15 +41,12 @@ describe MergeRequest do
it { should include_module(Issuable) }
end
- describe "#mr_and_commit_notes" do
-
- end
describe "#mr_and_commit_notes" do
let!(:merge_request) { create(:merge_request) }
before do
- merge_request.stub(:commits) { [merge_request.project.repository.commit] }
+ merge_request.stub(:commits) { [merge_request.source_project.repository.commit] }
create(:note, commit_id: merge_request.commits.first.id, noteable_type: 'Commit')
create(:note, noteable: merge_request)
end
@@ -71,4 +68,39 @@ describe MergeRequest do
subject.is_being_reassigned?.should be_false
end
end
+
+ describe '#for_fork?' do
+ it 'returns true if the merge request is for a fork' do
+ subject.source_project = create(:source_project)
+ subject.target_project = create(:target_project)
+
+ subject.for_fork?.should be_true
+ end
+ it 'returns false if is not for a fork' do
+ subject.source_project = create(:source_project)
+ subject.target_project = subject.source_project
+ subject.for_fork?.should be_false
+ end
+ end
+
+
+ describe '#allow_source_branch_removal?' do
+ it 'should not allow removal when mr is a fork' do
+
+ subject.disallow_source_branch_removal?.should be_true
+ end
+ it 'should not allow removal when the mr is not a fork, but the source branch is the root reference' do
+ subject.target_project = subject.source_project
+ subject.source_branch = subject.source_project.repository.root_ref
+ subject.disallow_source_branch_removal?.should be_true
+ end
+
+ it 'should not disallow removal when the mr is not a fork, and but source branch is not the root reference' do
+ subject.target_project = subject.source_project
+ subject.source_branch = "Something Different #{subject.source_project.repository.root_ref}"
+ subject.for_fork?.should be_false
+ subject.disallow_source_branch_removal?.should be_false
+ end
+ end
+
end
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index ba94f940dc8..0f3af588457 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -144,12 +144,12 @@ describe Note do
end
describe '#create_status_change_note' do
- let(:project) { create(:project) }
- let(:thing) { create(:issue, project: project) }
- let(:author) { create(:user) }
- let(:status) { 'new_status' }
+ let(:project) { create(:project) }
+ let(:thing) { create(:issue, project: project) }
+ let(:author) { create(:user) }
+ let(:status) { 'new_status' }
- subject { Note.create_status_change_note(thing, author, status) }
+ subject { Note.create_status_change_note(thing, project, author, status) }
it 'creates and saves a Note' do
should be_a Note
@@ -157,9 +157,9 @@ describe Note do
end
its(:noteable) { should == thing }
- its(:project) { should == thing.project }
- its(:author) { should == author }
- its(:note) { should =~ /Status changed to #{status}/ }
+ its(:project) { should == thing.project }
+ its(:author) { should == author }
+ its(:note) { should =~ /Status changed to #{status}/ }
end
describe :authorization do
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 0845d2edea3..2f6a20a1b24 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -26,6 +26,9 @@
require 'spec_helper'
describe Project do
+ before(:each) { enable_observers }
+ after(:each) { disable_observers }
+
describe "Associations" do
it { should belong_to(:group) }
it { should belong_to(:namespace) }
@@ -95,12 +98,11 @@ describe Project do
end
describe "last_activity methods" do
- before { enable_observers }
- let(:project) { create(:project) }
+ let(:project) { create(:project) }
let(:last_event) { double(created_at: Time.now) }
describe "last_activity" do
- it "should alias last_activity to last_event"do
+ it "should alias last_activity to last_event" do
project.stub(last_event: last_event)
project.last_activity.should == last_event
end
@@ -122,7 +124,7 @@ describe Project do
let(:project) { create(:project_with_code) }
before do
- @merge_request = create(:merge_request, project: project)
+ @merge_request = create(:merge_request, source_project: project, target_project: project)
@key = create(:key, user_id: project.owner.id)
end
diff --git a/spec/observers/activity_observer_spec.rb b/spec/observers/activity_observer_spec.rb
index 3d503027360..e93c969d5fe 100644
--- a/spec/observers/activity_observer_spec.rb
+++ b/spec/observers/activity_observer_spec.rb
@@ -8,18 +8,6 @@ describe ActivityObserver do
it { @event.project.should == project }
end
- describe "Merge Request created" do
- before do
- MergeRequest.observers.enable :activity_observer do
- @merge_request = create(:merge_request, project: project)
- @event = Event.last
- end
- end
-
- it_should_be_valid_event
- it { @event.action.should == Event::CREATED }
- it { @event.target.should == @merge_request }
- end
describe "Issue created" do
before do
diff --git a/spec/observers/issue_observer_spec.rb b/spec/observers/issue_observer_spec.rb
index 3cc621013d2..c9e88aee1a5 100644
--- a/spec/observers/issue_observer_spec.rb
+++ b/spec/observers/issue_observer_spec.rb
@@ -26,14 +26,13 @@ describe IssueObserver do
before { mock_issue.stub(state: 'closed') }
it 'note is created if the issue is being closed' do
- Note.should_receive(:create_status_change_note).with(mock_issue, some_user, 'closed')
+ Note.should_receive(:create_status_change_note).with(mock_issue, mock_issue.project, some_user, 'closed')
subject.after_close(mock_issue, nil)
end
it 'trigger notification to send emails' do
subject.notification.should_receive(:close_issue).with(mock_issue, some_user)
-
subject.after_close(mock_issue, nil)
end
end
@@ -42,8 +41,7 @@ describe IssueObserver do
before { mock_issue.stub(state: 'reopened') }
it 'note is created if the issue is being reopened' do
- Note.should_receive(:create_status_change_note).with(mock_issue, some_user, 'reopened')
-
+ Note.should_receive(:create_status_change_note).with(mock_issue, mock_issue.project, some_user, 'reopened')
subject.after_reopen(mock_issue, nil)
end
end
diff --git a/spec/observers/merge_request_observer_spec.rb b/spec/observers/merge_request_observer_spec.rb
index 82c3fbc8a30..249700f543d 100644
--- a/spec/observers/merge_request_observer_spec.rb
+++ b/spec/observers/merge_request_observer_spec.rb
@@ -1,19 +1,21 @@
require 'spec_helper'
describe MergeRequestObserver do
- let(:some_user) { create :user }
- let(:assignee) { create :user }
- let(:author) { create :user }
- let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author) }
- let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author) }
+ let(:some_user) { create :user }
+ let(:assignee) { create :user }
+ let(:author) { create :user }
+ let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author) }
+ let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author) }
let(:unassigned_mr) { create(:merge_request, author: author) }
- let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author) }
+ let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author) }
let(:closed_unassigned_mr) { create(:closed_merge_request, author: author) }
before { subject.stub(:current_user).and_return(some_user) }
before { subject.stub(notification: mock('NotificationService').as_null_object) }
+ before { mr_mock.stub(:author_id) }
+ before { mr_mock.stub(:target_project) }
before(:each) { enable_observers }
-
+ after(:each) { disable_observers }
subject { MergeRequestObserver.instance }
@@ -30,7 +32,7 @@ describe MergeRequestObserver do
end
it 'is called when a merge request is changed' do
- changed = create(:merge_request, project: create(:project))
+ changed = create(:merge_request, source_project: create(:project))
subject.should_receive(:after_update)
MergeRequest.observers.enable :merge_request_observer do
@@ -59,13 +61,13 @@ describe MergeRequestObserver do
context '#after_close' do
context 'a status "closed"' do
it 'note is created if the merge request is being closed' do
- Note.should_receive(:create_status_change_note).with(assigned_mr, some_user, 'closed')
+ Note.should_receive(:create_status_change_note).with(assigned_mr, assigned_mr.target_project, some_user, 'closed')
assigned_mr.close
end
it 'notification is delivered only to author if the merge request is being closed' do
- Note.should_receive(:create_status_change_note).with(unassigned_mr, some_user, 'closed')
+ Note.should_receive(:create_status_change_note).with(unassigned_mr, unassigned_mr.target_project, some_user, 'closed')
unassigned_mr.close
end
@@ -75,16 +77,42 @@ describe MergeRequestObserver do
context '#after_reopen' do
context 'a status "reopened"' do
it 'note is created if the merge request is being reopened' do
- Note.should_receive(:create_status_change_note).with(closed_assigned_mr, some_user, 'reopened')
+ Note.should_receive(:create_status_change_note).with(closed_assigned_mr, closed_assigned_mr.target_project, some_user, 'reopened')
closed_assigned_mr.reopen
end
it 'notification is delivered only to author if the merge request is being reopened' do
- Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, some_user, 'reopened')
+ Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, closed_unassigned_mr.target_project, some_user, 'reopened')
closed_unassigned_mr.reopen
end
end
end
+
+
+ describe "Merge Request created" do
+ def self.it_should_be_valid_event
+ it { @event.should_not be_nil }
+ it { @event.should_not be_nil }
+ it { @event.project.should == project }
+ it { @event.project.should == project }
+ end
+
+ let(:project) { create(:project) }
+ before do
+ TestEnv.enable_observers
+ @merge_request = create(:merge_request, source_project: project, target_project: project)
+ @event = Event.last
+ end
+
+ after do
+ TestEnv.enable_observers
+ end
+
+ it_should_be_valid_event
+ it { @event.action.should == Event::CREATED }
+ it { @event.target.should == @merge_request }
+ end
+
end
diff --git a/spec/observers/user_observer_spec.rb b/spec/observers/user_observer_spec.rb
index e0902b7eaf3..b74fceb98b1 100644
--- a/spec/observers/user_observer_spec.rb
+++ b/spec/observers/user_observer_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe UserObserver do
before(:each) { enable_observers }
+ after(:each) {disable_observers}
subject { UserObserver.instance }
before { subject.stub(notification: mock('NotificationService').as_null_object) }
diff --git a/spec/observers/users_project_observer_spec.rb b/spec/observers/users_project_observer_spec.rb
index b5f72946492..e33d8cc50fd 100644
--- a/spec/observers/users_project_observer_spec.rb
+++ b/spec/observers/users_project_observer_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe UsersProjectObserver do
before(:each) { enable_observers }
+ after(:each) { disable_observers }
let(:user) { create(:user) }
let(:project) { create(:project) }
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 5bf228a7448..7e5bf29788d 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -3,10 +3,12 @@ require "spec_helper"
describe API::API do
include ApiHelpers
- let(:user) { create(:user ) }
- let!(:project) { create(:project_with_code, creator_id: user.id) }
- let!(:merge_request) { create(:merge_request, author: user, assignee: user, project: project, title: "Test") }
- before { project.team << [user, :reporters] }
+ let(:user) { create(:user) }
+ let!(:project) {create(:project_with_code, creator_id: user.id) }
+ let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
+ before {
+ project.team << [user, :reporters]
+ }
describe "GET /projects/:id/merge_requests" do
context "when unauthenticated" do
@@ -40,35 +42,91 @@ describe API::API do
end
describe "POST /projects/:id/merge_requests" do
- it "should return merge_request" do
- post api("/projects/#{project.id}/merge_requests", user),
- title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user
- response.status.should == 201
- json_response['title'].should == 'Test merge_request'
- end
+ context 'between branches projects' do
+ it "should return merge_request" do
+ post api("/projects/#{project.id}/merge_requests", user),
+ title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user
+ response.status.should == 201
+ json_response['title'].should == 'Test merge_request'
+ end
- it "should return 422 when source_branch equals target_branch" do
- post api("/projects/#{project.id}/merge_requests", user),
- title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
- response.status.should == 422
- end
+ it "should return 422 when source_branch equals target_branch" do
+ post api("/projects/#{project.id}/merge_requests", user),
+ title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
+ response.status.should == 422
+ end
- it "should return 400 when source_branch is missing" do
- post api("/projects/#{project.id}/merge_requests", user),
- title: "Test merge_request", target_branch: "master", author: user
- response.status.should == 400
- end
+ it "should return 400 when source_branch is missing" do
+ post api("/projects/#{project.id}/merge_requests", user),
+ title: "Test merge_request", target_branch: "master", author: user
+ response.status.should == 400
+ end
- it "should return 400 when target_branch is missing" do
- post api("/projects/#{project.id}/merge_requests", user),
- title: "Test merge_request", source_branch: "stable", author: user
- response.status.should == 400
+ it "should return 400 when target_branch is missing" do
+ post api("/projects/#{project.id}/merge_requests", user),
+ title: "Test merge_request", source_branch: "stable", author: user
+ response.status.should == 400
+ end
+
+ it "should return 400 when title is missing" do
+ post api("/projects/#{project.id}/merge_requests", user),
+ target_branch: 'master', source_branch: 'stable'
+ response.status.should == 400
+ end
end
- it "should return 400 when title is missing" do
- post api("/projects/#{project.id}/merge_requests", user),
- target_branch: 'master', source_branch: 'stable'
- response.status.should == 400
+ context 'forked projects' do
+ let!(:user2) {create(:user)}
+ let!(:forked_project_link) { build(:forked_project_link) }
+ let!(:fork_project) { create(:source_project_with_code, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }
+
+ before :each do |each|
+ fork_project.team << [user2, :reporters]
+ forked_project_link.forked_from_project = project
+ forked_project_link.forked_to_project = fork_project
+ forked_project_link.save!
+ end
+
+ it "should return merge_request" do
+ post api("/projects/#{fork_project.id}/merge_requests", user2),
+ title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id
+ response.status.should == 201
+ json_response['title'].should == 'Test merge_request'
+ end
+
+ it "should not return 422 when source_branch equals target_branch" do
+ project.id.should_not == fork_project.id
+ fork_project.forked?.should be_true
+ fork_project.forked_from_project.should == project
+ post api("/projects/#{fork_project.id}/merge_requests", user2),
+ title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
+ response.status.should == 201
+ json_response['title'].should == 'Test merge_request'
+ end
+
+ it "should return 400 when source_branch is missing" do
+ post api("/projects/#{fork_project.id}/merge_requests", user2),
+ title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
+ response.status.should == 400
+ end
+
+ it "should return 400 when target_branch is missing" do
+ post api("/projects/#{fork_project.id}/merge_requests", user2),
+ title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
+ response.status.should == 400
+ end
+
+ it "should return 400 when title is missing" do
+ post api("/projects/#{fork_project.id}/merge_requests", user2),
+ target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id
+ response.status.should == 400
+ end
+
+ it "should return 400 when target_branch is specified and not a forked project" do
+ post api("/projects/#{project.id}/merge_requests", user),
+ target_branch: 'master', source_branch: 'stable', author: user, target_project: fork_project.id
+ response.status.should == 400
+ end
end
end
@@ -97,14 +155,14 @@ describe API::API do
it "should return 422 when source_branch and target_branch are renamed the same" do
put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user),
- source_branch: "master", target_branch: "master"
+ source_branch: "master", target_branch: "master"
response.status.should == 422
end
it "should return merge_request with renamed target_branch" do
- put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), target_branch: "test"
+ put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), target_branch: "wiki"
response.status.should == 200
- json_response['target_branch'].should == 'test'
+ json_response['target_branch'].should == 'wiki'
end
end
diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb
index af12c088c8f..246fe262ce8 100644
--- a/spec/requests/api/milestones_spec.rb
+++ b/spec/requests/api/milestones_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
describe API::API do
include ApiHelpers
before(:each) { enable_observers }
+ after(:each) {disable_observers}
let(:user) { create(:user) }
let!(:project) { create(:project, namespace: user.namespace ) }
diff --git a/spec/requests/api/notes_spec.rb b/spec/requests/api/notes_spec.rb
index 11296aea73e..48a2d111f8c 100644
--- a/spec/requests/api/notes_spec.rb
+++ b/spec/requests/api/notes_spec.rb
@@ -6,7 +6,7 @@ describe API::API do
let(:user) { create(:user) }
let!(:project) { create(:project, namespace: user.namespace ) }
let!(:issue) { create(:issue, project: project, author: user) }
- let!(:merge_request) { create(:merge_request, project: project, author: user) }
+ let!(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: user) }
let!(:snippet) { create(:project_snippet, project: project, author: user) }
let!(:issue_note) { create(:note, noteable: issue, project: project, author: user) }
let!(:merge_request_note) { create(:note, noteable: merge_request, project: project, author: user) }
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 863ecc61bbb..b728cfc9678 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
describe API::API do
include ApiHelpers
before(:each) { enable_observers }
+ after(:each) { disable_observers }
let(:user) { create(:user) }
let(:user2) { create(:user) }
@@ -14,7 +15,8 @@ describe API::API do
let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
let!(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }
- before { project.team << [user, :reporter] }
+ before {
+ project.team << [user, :reporter] }
describe "GET /projects" do
context "when unauthenticated" do
@@ -46,16 +48,16 @@ describe API::API do
it "should not create new project" do
expect {
post api("/projects", user2), name: 'foo'
- }.to change {Project.count}.by(0)
+ }.to change { Project.count }.by(0)
end
end
it "should create new project without path" do
- expect { post api("/projects", user), name: 'foo' }.to change {Project.count}.by(1)
+ expect { post api("/projects", user), name: 'foo' }.to change { Project.count }.by(1)
end
it "should not create new project without name" do
- expect { post api("/projects", user) }.to_not change {Project.count}
+ expect { post api("/projects", user) }.to_not change { Project.count }
end
it "should return a 400 error if name not given" do
@@ -89,17 +91,17 @@ describe API::API do
it "should assign attributes to project" do
project = attributes_for(:project, {
- description: Faker::Lorem.sentence,
- default_branch: 'stable',
- issues_enabled: false,
- wall_enabled: false,
- merge_requests_enabled: false,
- wiki_enabled: false
+ description: Faker::Lorem.sentence,
+ default_branch: 'stable',
+ issues_enabled: false,
+ wall_enabled: false,
+ merge_requests_enabled: false,
+ wiki_enabled: false
})
post api("/projects", user), project
- project.each_pair do |k,v|
+ project.each_pair do |k, v|
next if k == :path
json_response[k.to_s].should == v
end
@@ -125,11 +127,11 @@ describe API::API do
before { admin }
it "should create new project without path" do
- expect { post api("/projects/user/#{user.id}", admin), name: 'foo' }.to change {Project.count}.by(1)
+ expect { post api("/projects/user/#{user.id}", admin), name: 'foo' }.to change { Project.count }.by(1)
end
it "should not create new project without name" do
- expect { post api("/projects/user/#{user.id}", admin) }.to_not change {Project.count}
+ expect { post api("/projects/user/#{user.id}", admin) }.to_not change { Project.count }
end
it "should respond with 201 on success" do
@@ -144,17 +146,17 @@ describe API::API do
it "should assign attributes to project" do
project = attributes_for(:project, {
- description: Faker::Lorem.sentence,
- default_branch: 'stable',
- issues_enabled: false,
- wall_enabled: false,
- merge_requests_enabled: false,
- wiki_enabled: false
+ description: Faker::Lorem.sentence,
+ default_branch: 'stable',
+ issues_enabled: false,
+ wall_enabled: false,
+ merge_requests_enabled: false,
+ wiki_enabled: false
})
post api("/projects/user/#{user.id}", admin), project
- project.each_pair do |k,v|
+ project.each_pair do |k, v|
next if k == :path
json_response[k.to_s].should == v
end
@@ -267,7 +269,7 @@ describe API::API do
it "should add user to project team" do
expect {
post api("/projects/#{project.id}/members", user), user_id: user2.id,
- access_level: UsersProject::DEVELOPER
+ access_level: UsersProject::DEVELOPER
}.to change { UsersProject.count }.by(1)
response.status.should == 201
@@ -277,10 +279,10 @@ describe API::API do
it "should return a 201 status if user is already project member" do
post api("/projects/#{project.id}/members", user), user_id: user2.id,
- access_level: UsersProject::DEVELOPER
+ access_level: UsersProject::DEVELOPER
expect {
post api("/projects/#{project.id}/members", user), user_id: user2.id,
- access_level: UsersProject::DEVELOPER
+ access_level: UsersProject::DEVELOPER
}.not_to change { UsersProject.count }.by(1)
response.status.should == 201
@@ -411,8 +413,8 @@ describe API::API do
it "should add hook to project" do
expect {
post api("/projects/#{project.id}/hooks", user),
- url: "http://example.com"
- }.to change {project.hooks.count}.by(1)
+ url: "http://example.com"
+ }.to change { project.hooks.count }.by(1)
response.status.should == 201
end
@@ -430,7 +432,7 @@ describe API::API do
describe "PUT /projects/:id/hooks/:hook_id" do
it "should update an existing project hook" do
put api("/projects/#{project.id}/hooks/#{hook.id}", user),
- url: 'http://example.org'
+ url: 'http://example.org'
response.status.should == 200
json_response['url'].should == 'http://example.org'
end
@@ -455,7 +457,7 @@ describe API::API do
it "should delete hook from project" do
expect {
delete api("/projects/#{project.id}/hooks/#{hook.id}", user)
- }.to change {project.hooks.count}.by(-1)
+ }.to change { project.hooks.count }.by(-1)
response.status.should == 200
end
@@ -501,26 +503,26 @@ describe API::API do
describe "POST /projects/:id/snippets" do
it "should create a new project snippet" do
post api("/projects/#{project.id}/snippets", user),
- title: 'api test', file_name: 'sample.rb', code: 'test'
+ title: 'api test', file_name: 'sample.rb', code: 'test'
response.status.should == 201
json_response['title'].should == 'api test'
end
it "should return a 400 error if title is not given" do
post api("/projects/#{project.id}/snippets", user),
- file_name: 'sample.rb', code: 'test'
+ file_name: 'sample.rb', code: 'test'
response.status.should == 400
end
it "should return a 400 error if file_name not given" do
post api("/projects/#{project.id}/snippets", user),
- title: 'api test', code: 'test'
+ title: 'api test', code: 'test'
response.status.should == 400
end
it "should return a 400 error if code not given" do
post api("/projects/#{project.id}/snippets", user),
- title: 'api test', file_name: 'sample.rb'
+ title: 'api test', file_name: 'sample.rb'
response.status.should == 400
end
end
@@ -528,7 +530,7 @@ describe API::API do
describe "PUT /projects/:id/snippets/:shippet_id" do
it "should update an existing project snippet" do
put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
- code: 'updated code'
+ code: 'updated code'
response.status.should == 200
json_response['title'].should == 'example'
snippet.reload.content.should == 'updated code'
@@ -536,7 +538,7 @@ describe API::API do
it "should update an existing project snippet with new title" do
put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
- title: 'other api test'
+ title: 'other api test'
response.status.should == 200
json_response['title'].should == 'other api test'
end
@@ -598,7 +600,7 @@ describe API::API do
describe "POST /projects/:id/keys" do
it "should not create an invalid ssh key" do
- post api("/projects/#{project.id}/keys", user), { title: "invalid key" }
+ post api("/projects/#{project.id}/keys", user), {title: "invalid key"}
response.status.should == 404
end
@@ -606,7 +608,7 @@ describe API::API do
key_attrs = attributes_for :key
expect {
post api("/projects/#{project.id}/keys", user), key_attrs
- }.to change{ project.deploy_keys.count }.by(1)
+ }.to change { project.deploy_keys.count }.by(1)
end
end
@@ -616,7 +618,7 @@ describe API::API do
it "should delete existing key" do
expect {
delete api("/projects/#{project.id}/keys/#{deploy_key.id}", user)
- }.to change{ project.deploy_keys.count }.by(-1)
+ }.to change { project.deploy_keys.count }.by(-1)
end
it "should return 404 Not Found with invalid ID" do
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 76501482303..82f033a6e81 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -156,7 +156,8 @@ describe NotificationService do
let(:merge_request) { create :merge_request, assignee: create(:user) }
before do
- build_team(merge_request.project)
+ build_team(merge_request.source_project)
+ build_team(merge_request.target_project)
end
describe :new_merge_request do
diff --git a/spec/services/project_transfer_service_spec.rb b/spec/services/project_transfer_service_spec.rb
index 7b11c9785a9..bc26403b7f4 100644
--- a/spec/services/project_transfer_service_spec.rb
+++ b/spec/services/project_transfer_service_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
describe ProjectTransferService do
before(:each) { enable_observers }
+ after(:each) {disable_observers}
context 'namespace -> namespace' do
let(:user) { create(:user) }
@@ -24,6 +25,7 @@ describe ProjectTransferService do
@result = service.transfer(project, nil)
end
+
it { @result.should be_true }
it { project.namespace.should == nil }
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 3c318a4be82..dd008ed02ad 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -48,8 +48,11 @@ Spork.prefork do
# instead of true.
config.use_transactional_fixtures = false
- config.before do
- TestEnv.init(observers: false)
+ config.before(:suite) do
+ TestEnv.init(observers: false, init_repos: true, repos: false)
+ end
+ config.before(:each) do
+ TestEnv.setup_stubs
end
end
end
diff --git a/spec/support/test_env.rb b/spec/support/test_env.rb
index 3230301eead..b9e03be4ed3 100644
--- a/spec/support/test_env.rb
+++ b/spec/support/test_env.rb
@@ -27,17 +27,65 @@ module TestEnv
# Disable mailer for spinach tests
disable_mailer if opts[:mailer] == false
+ setup_stubs
- # Use tmp dir for FS manipulations
- repos_path = Rails.root.join('tmp', 'test-git-base-path')
- Gitlab.config.gitlab_shell.stub(repos_path: repos_path)
- Gitlab::Git::Repository.stub(repos_path: repos_path)
+ clear_test_repo_dir if opts[:init_repos] == true
+ setup_test_repos(opts) if opts[:repos] == true
+ end
+
+ def testing_path
+ Rails.root.join('tmp', 'test-git-base-path')
+ end
+
+ def seed_repo_path
+ Rails.root.join('tmp', 'repositories', 'gitlabhq')
+ end
+
+ def seed_satellite_path
+ Rails.root.join('tmp', 'satellite', 'gitlabhq')
+ end
+
+ def satellite_path
+ "#{testing_path()}/satellite"
+ end
+
+ def repo(namespace, name)
+ unless (namespace.nil? || namespace.path.nil? || namespace.path.strip.empty?)
+ repo = File.join(testing_path(), "#{namespace.path}/#{name}.git")
+ else
+ repo = File.join(testing_path(), "#{name}.git")
+ end
+ end
+
+ def satellite(namespace, name)
+ unless (namespace.nil? || namespace.path.nil? || namespace.path.strip.empty?)
+ satellite_repo = File.join(satellite_path, namespace.path, name)
+ else
+ satellite_repo = File.join(satellite_path, name)
+ end
+ end
+
+ def setup_test_repos(opts ={})
+ create_repo(nil, 'gitlabhq') #unless opts[:repo].nil? || !opts[:repo].include?('')
+ create_repo(nil, 'source_gitlabhq') #unless opts[:repo].nil? || !opts[:repo].include?('source_')
+ create_repo(nil, 'target_gitlabhq') #unless opts[:repo].nil? || !opts[:repo].include?('target_')
+ end
+
+ def setup_stubs()
+ # Use tmp dir for FS manipulations
+ repos_path = testing_path()
GollumWiki.any_instance.stub(:init_repo) do |path|
create_temp_repo(File.join(repos_path, "#{path}.git"))
end
+ Gitlab.config.gitlab_shell.stub(repos_path: repos_path)
+
+ Gitlab.config.satellites.stub(path: satellite_path)
+
+ Gitlab::Git::Repository.stub(repos_path: repos_path)
+
Gitlab::Shell.any_instance.stub(
add_repository: true,
mv_repository: true,
@@ -48,24 +96,54 @@ module TestEnv
)
Gitlab::Satellite::Satellite.any_instance.stub(
- exists?: true,
- destroy: true,
- create: true
+ exists?: true,
+ destroy: true,
+ create: true,
+ lock_files_dir: repos_path
)
MergeRequest.any_instance.stub(
- check_if_can_be_merged: true
+ check_if_can_be_merged: true
)
-
Repository.any_instance.stub(
- size: 12.45
+ size: 12.45
)
+ end
+ def clear_test_repo_dir
+ setup_stubs
+ # Use tmp dir for FS manipulations
+ repos_path = testing_path()
# Remove tmp/test-git-base-path
FileUtils.rm_rf Gitlab.config.gitlab_shell.repos_path
# Recreate tmp/test-git-base-path
FileUtils.mkdir_p Gitlab.config.gitlab_shell.repos_path
+ #Since much more is happening in satellites
+ FileUtils.mkdir_p Gitlab.config.satellites.path
+ end
+
+ def clear_repo_dir(namespace, name)
+ setup_stubs
+ #Clean any .wiki.git that may have been created
+ FileUtils.rm_rf File.join(testing_path(), "#{name}.wiki.git")
+ end
+
+ #Create a repo and it's satellite
+ def create_repo(namespace, name)
+ setup_stubs
+ repo = repo(namespace, name)
+
+ # Symlink tmp/repositories/gitlabhq to tmp/test-git-base-path/gitlabhq
+ system("ln -s -f #{seed_repo_path()} #{repo}")
+ create_satellite(repo, namespace, name)
+ end
+
+ # Create a testing satellite, and clone the source repo into it
+ def create_satellite(source_repo, namespace, satellite_name)
+ satellite_repo = satellite(namespace, satellite_name)
+ # Symlink tmp/satellite/gitlabhq to tmp/test-git-base-path/satellite/gitlabhq
+ system("ln -s -f #{seed_satellite_path()} #{satellite_repo}")
end
def create_temp_repo(path)