Skip to content
Snippets Groups Projects
Commit 3d7194f0 authored by Izaak Alpert's avatar Izaak Alpert Committed by Izaak Alpert
Browse files

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
parent fd033671
No related branches found
No related tags found
1 merge request!4184Merge Request on forked projects
Showing
with 326 additions and 131 deletions
Loading
Loading
@@ -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)
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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) }
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
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 }
 
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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) }
 
Loading
Loading
Loading
Loading
@@ -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) }
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
@@ -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
 
Loading
Loading
Loading
Loading
@@ -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 ) }
Loading
Loading
Loading
Loading
@@ -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) }
Loading
Loading
Loading
Loading
@@ -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) }
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
@@ -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
Loading
Loading
@@ -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'
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
@@ -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
 
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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) }
Loading
Loading
@@ -24,6 +25,7 @@ describe ProjectTransferService do
@result = service.transfer(project, nil)
end
 
it { @result.should be_true }
it { project.namespace.should == nil }
end
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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,
Loading
Loading
@@ -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)
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment