diff options
author | Izaak Alpert <ihalpert@blackberry.com> | 2013-04-25 10:15:33 -0400 |
---|---|---|
committer | Izaak Alpert <ialpert@blackberry.com> | 2013-07-17 22:41:30 -0400 |
commit | 3d7194f0112da12e8732df9ffe8b34fe7d0a9f6b (patch) | |
tree | 9b3c68c04b5ead5e35456595a07453b036b2dbc8 /spec | |
parent | fd033671933fcc0f472480d98c907aefde357416 (diff) | |
download | gitlab-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')
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) |