[refs #90] fixed errors, add validations & tests
This commit is contained in:
parent
0c89ca6575
commit
e211fa2fc3
|
@ -16,13 +16,21 @@ class Projects::PullRequestsController < Projects::BaseController
|
||||||
|
|
||||||
@pull.base_ref = @pull.base_project.default_branch
|
@pull.base_ref = @pull.base_project.default_branch
|
||||||
@pull.head_ref = params[:treeish].presence || @pull.head_project.default_branch
|
@pull.head_ref = params[:treeish].presence || @pull.head_project.default_branch
|
||||||
@pull.check
|
if @pull.save
|
||||||
|
@pull.check
|
||||||
repo = Git::Repository.new(@pull.path)
|
if @pull.state == 'already'
|
||||||
@base_commit = repo.commits(@pull.base_ref).first
|
record.errors.add(:head_ref, I18n.t('projects.pull_requests.up_to_date', :base_ref => record.base_ref, :head_ref => record.head_ref))
|
||||||
@head_commit = repo.commits(@pull.head_branch).first
|
flash[:error] = t('flash.pull_request.create_error')
|
||||||
|
flash[:warning] = @pull.errors.full_messages.join('. ')
|
||||||
@diff = Grit::Repo.new(@pull.path).diff @base_commit, @head_commit
|
end
|
||||||
|
repo = Git::Repository.new(@pull.path)
|
||||||
|
@base_commit = repo.commits(@pull.base_ref).first
|
||||||
|
@head_commit = repo.commits(@pull.head_branch).first
|
||||||
|
@diff = Grit::Repo.new(@pull.path).diff @base_commit, @head_commit
|
||||||
|
else
|
||||||
|
flash[:error] = t('flash.pull_request.create_error')
|
||||||
|
flash[:warning] = @pull.errors.full_messages.join('. ')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
@ -33,8 +41,22 @@ class Projects::PullRequestsController < Projects::BaseController
|
||||||
#@pull.head_ref = params[:head_ref] # FIXME need validation!
|
#@pull.head_ref = params[:head_ref] # FIXME need validation!
|
||||||
|
|
||||||
if @pull.save
|
if @pull.save
|
||||||
render :index #FIXME redirect to show
|
@pull.check
|
||||||
|
puts "!!!!!!!!!!!!!!!!!!!!!!!!"
|
||||||
|
puts "pull state is #{@pull.state}"
|
||||||
|
if @pull.state == 'already'
|
||||||
|
@pull.destroy
|
||||||
|
|
||||||
|
@pull.errors.add(:head_ref, I18n.t('projects.pull_requests.up_to_date', :base_ref => @pull.base_ref, :head_ref => @pull.head_ref))
|
||||||
|
flash[:notice] = t('flash.pull_request.saved')
|
||||||
|
flash[:warning] = @pull.errors.full_messages.join('. ')
|
||||||
|
render :new
|
||||||
|
else
|
||||||
|
redirect_to project_pull_request_path(@project, @pull)
|
||||||
|
end
|
||||||
else
|
else
|
||||||
|
flash[:error] = t('flash.pull_request.save_error')
|
||||||
|
flash[:warning] = @pull.errors.full_messages.join('. ')
|
||||||
render :new
|
render :new
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,9 +8,16 @@ class PullRequest < ActiveRecord::Base
|
||||||
delegate :user, :title, :body, :serial_id, :assignee, :state, :to => :issue, :allow_nil => true
|
delegate :user, :title, :body, :serial_id, :assignee, :state, :to => :issue, :allow_nil => true
|
||||||
accepts_nested_attributes_for :issue
|
accepts_nested_attributes_for :issue
|
||||||
#attr_accessible #FIXME disable for development
|
#attr_accessible #FIXME disable for development
|
||||||
validate :uniq_merge#, :not_up_to_date
|
validate :uniq_merge
|
||||||
|
validates_each :head_ref, :base_ref do |record, attr, value|
|
||||||
|
project = attr == :head_ref ? record.head_project : record.base_project
|
||||||
|
if !((project.branches + project.tags).map(&:name).include?(value) || project.git_repository.commits.map(&:id).include?(value))
|
||||||
|
record.errors.add attr, I18n.t('projects.pull_requests.wrong_ref')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
before_create :clean_dir
|
before_create :clean_dir
|
||||||
|
after_destroy :clean_dir
|
||||||
|
|
||||||
scope :needed_checking, includes(:issue).where(:issues => {:state => ['open', 'blocked', 'ready', 'already']})
|
scope :needed_checking, includes(:issue).where(:issues => {:state => ['open', 'blocked', 'ready', 'already']})
|
||||||
|
|
||||||
|
@ -20,11 +27,11 @@ class PullRequest < ActiveRecord::Base
|
||||||
#end
|
#end
|
||||||
|
|
||||||
event :ready do
|
event :ready do
|
||||||
transition [:open, :blocked] => :ready
|
transition [:ready, :open, :blocked] => :ready
|
||||||
end
|
end
|
||||||
|
|
||||||
event :block do
|
event :block do
|
||||||
transition [:open, :ready] => :blocked
|
transition [:blocked, :open, :ready] => :blocked
|
||||||
end
|
end
|
||||||
|
|
||||||
event :already do
|
event :already do
|
||||||
|
@ -151,14 +158,10 @@ class PullRequest < ActiveRecord::Base
|
||||||
|
|
||||||
def uniq_merge
|
def uniq_merge
|
||||||
if base_project.pull_requests.needed_checking.where(:head_project_id => head_project, :base_ref => base_ref, :head_ref => head_ref).where('pull_requests.id <> :id or :id is null', :id => id).count > 0
|
if base_project.pull_requests.needed_checking.where(:head_project_id => head_project, :base_ref => base_ref, :head_ref => head_ref).where('pull_requests.id <> :id or :id is null', :id => id).count > 0
|
||||||
errors.add(:head_ref, I18n.t('projects.pull_requests.duplicate', :head_ref => head_ref))
|
errors.add(:base_branch, I18n.t('projects.pull_requests.duplicate', :head_ref => head_ref))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def not_up_to_date
|
|
||||||
errors.add(:head_ref, I18n.t('projects.pull_requests.up_to_date', :base_ref => base_ref, :head_ref => head_ref)) if state == 'already'
|
|
||||||
end
|
|
||||||
|
|
||||||
def clean_dir
|
def clean_dir
|
||||||
FileUtils.rm_rf path
|
FileUtils.rm_rf path
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,9 +12,16 @@ en:
|
||||||
merge: Merge
|
merge: Merge
|
||||||
duplicate: 'There is already a pull request for %{head_ref}'
|
duplicate: 'There is already a pull request for %{head_ref}'
|
||||||
up_to_date: 'The %{base_ref} branch is already up-to-date with %{head_ref}'
|
up_to_date: 'The %{base_ref} branch is already up-to-date with %{head_ref}'
|
||||||
|
wrong_ref: Wrong tree-ish
|
||||||
|
|
||||||
pull_requests:
|
pull_requests:
|
||||||
tabs:
|
tabs:
|
||||||
discussion: Discussion
|
discussion: Discussion
|
||||||
diff: Diff
|
diff: Diff
|
||||||
Commits: Commits
|
Commits: Commits
|
||||||
|
|
||||||
|
flash:
|
||||||
|
pull_request:
|
||||||
|
new_error: Unable to create pull request
|
||||||
|
saved: Pull request saved
|
||||||
|
save_error: Unable to save pull request
|
|
@ -12,9 +12,16 @@ ru:
|
||||||
merge: Слияние
|
merge: Слияние
|
||||||
duplicate: 'Уже существует запрос на слияние %{head_ref}'
|
duplicate: 'Уже существует запрос на слияние %{head_ref}'
|
||||||
up_to_date: 'Ветка %{base_ref} на данный момент уже содержит последние изменения %{head_ref}'
|
up_to_date: 'Ветка %{base_ref} на данный момент уже содержит последние изменения %{head_ref}'
|
||||||
|
wrong_ref: Неправильный tree-ish
|
||||||
|
|
||||||
pull_requests:
|
pull_requests:
|
||||||
tabs:
|
tabs:
|
||||||
discussion: Дискуссия
|
discussion: Дискуссия
|
||||||
diff: Diff
|
diff: Diff
|
||||||
Commits: Коммиты
|
Commits: Коммиты
|
||||||
|
|
||||||
|
flash:
|
||||||
|
pull_request:
|
||||||
|
new_error: Не удалось создать запрос на слияние
|
||||||
|
saved: Запрос на слияние успешно сохранен
|
||||||
|
save_error: Не удалось сохранить запрос на слияние
|
|
@ -32,7 +32,7 @@ describe Projects::PullRequestsController do
|
||||||
response.should redirect_to(new_user_session_path)
|
response.should redirect_to(new_user_session_path)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should not be able to perform update title and body' do
|
it 'should not update title and body' do
|
||||||
post :update, @update_params
|
post :update, @update_params
|
||||||
PullRequest.joins(:issue).where(:id => @pull.id, :issues => {:title => 'update', :body => 'updating'}).count.should == 0
|
PullRequest.joins(:issue).where(:id => @pull.id, :issues => {:title => 'update', :body => 'updating'}).count.should == 0
|
||||||
end
|
end
|
||||||
|
@ -49,13 +49,23 @@ describe Projects::PullRequestsController do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should be able to perform update action' do
|
it 'should be able to perform update action' do
|
||||||
post :update, @update_params
|
put :update, @update_params
|
||||||
response.should redirect_to(project_pull_request_path(@project, @project.pull_requests.last))
|
response.should redirect_to(project_pull_request_path(@project, @project.pull_requests.last))
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should be able to perform update title and body' do
|
it 'should update title and body' do
|
||||||
post :update, @update_params
|
put :update, @update_params
|
||||||
PullRequest.joins(:issue).where(:id => @pull.id, :issues => {:title => 'update', :body => 'updating'}).count.should == 1
|
PullRequest.joins(:issue).where(:id => @pull.id, :issues => {:title => 'update', :body => 'updating'}).count.should == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should not create same pull" do
|
||||||
|
post :create, @create_params.merge({:pull_request => {:issue_attributes => {:title => 'same', :body => 'creating'}, :head_ref => 'non_conflicts', :base_ref => 'master'}})
|
||||||
|
PullRequest.joins(:issue).where(:issues => {:title => 'same', :body => 'creating'}).count.should == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not create already up-to-date pull" do
|
||||||
|
post :create, @create_params.merge({:pull_request => {:issue_attributes => {:title => 'already', :body => 'creating'}, :base_ref => 'master', :head_ref => 'master'}})
|
||||||
|
PullRequest.joins(:issue).where(:issues => {:title => 'already', :body => 'creating'}).count.should == 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -39,43 +39,43 @@ describe PullRequest do
|
||||||
@other_pull.save
|
@other_pull.save
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'master should can be merged with non_conflicts branch' do
|
it 'master should merge with non_conflicts branch' do
|
||||||
@pull.check
|
@pull.check
|
||||||
@pull.state.should == 'ready'
|
@pull.state.should == 'ready'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'master should not be merged with conflicts branch' do
|
it 'master should not merge with conflicts branch' do
|
||||||
@pull.head_ref = 'conflicts'
|
@pull.head_ref = 'conflicts'
|
||||||
@pull.check
|
@pull.check
|
||||||
@pull.state.should == 'blocked'
|
@pull.state.should == 'blocked'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should not be merged when already up-to-date branches' do
|
it 'should not merge when already up-to-date branches' do
|
||||||
@pull.head_ref = 'master'
|
@pull.head_ref = 'master'
|
||||||
@pull.check
|
@pull.check
|
||||||
@pull.state.should == 'already'
|
@pull.state.should == 'already'
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'for other head project' do
|
context 'for other head project' do
|
||||||
it 'master should can be merged with non_conflicts branch' do
|
it 'master should merge with non_conflicts branch' do
|
||||||
@other_pull.check
|
@other_pull.check
|
||||||
@other_pull.state.should == 'ready'
|
@other_pull.state.should == 'ready'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'master should not be merged with conflicts branch' do
|
it 'master should not merge with conflicts branch' do
|
||||||
@other_pull.head_ref = 'conflicts'
|
@other_pull.head_ref = 'conflicts'
|
||||||
@other_pull.check
|
@other_pull.check
|
||||||
@other_pull.state.should == 'blocked'
|
@other_pull.state.should == 'blocked'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should not be merged when already up-to-date branches' do
|
it 'should not merge when already up-to-date branches' do
|
||||||
@other_pull.head_ref = 'master'
|
@other_pull.head_ref = 'master'
|
||||||
@other_pull.check
|
@other_pull.check
|
||||||
@other_pull.state.should == 'already'
|
@other_pull.state.should == 'already'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should not be created same pull" do
|
it "should not create same pull" do
|
||||||
@same_pull = @project.pull_requests.new(:issue_attributes => {:title => 'same', :body => 'testing'})
|
@same_pull = @project.pull_requests.new(:issue_attributes => {:title => 'same', :body => 'testing'})
|
||||||
@same_pull.issue.user, @same_pull.issue.project = @user, @same_pull.base_project
|
@same_pull.issue.user, @same_pull.issue.project = @user, @same_pull.base_project
|
||||||
@same_pull.base_ref = 'master'
|
@same_pull.base_ref = 'master'
|
||||||
|
@ -84,12 +84,22 @@ describe PullRequest do
|
||||||
@project.pull_requests.joins(:issue).where(:issues => {:title => @same_pull.title}).count.should == 0
|
@project.pull_requests.joins(:issue).where(:issues => {:title => @same_pull.title}).count.should == 0
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should not be created already up-to-date pull" do
|
it "should not create pull with wrong base ref" do
|
||||||
@wrong_pull = @project.pull_requests.new(:issue_attributes => {:title => 'wrong', :body => 'testing'})
|
@wrong_pull = @project.pull_requests.new(:issue_attributes => {:title => 'wrong base', :body => 'testing'})
|
||||||
|
@wrong_pull.issue.user, @wrong_pull.issue.project = @user, @wrong_pull.base_project
|
||||||
|
@wrong_pull.base_ref = 'wrong'
|
||||||
|
@wrong_pull.head_project, @wrong_pull.head_ref = @project, 'non_conflicts'
|
||||||
|
@wrong_pull.save
|
||||||
|
@project.pull_requests.joins(:issue).where(:issues => {:title => @wrong_pull.title}).count.should == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not create pull with wrong head ref" do
|
||||||
|
@wrong_pull = @project.pull_requests.new(:issue_attributes => {:title => 'wrong head', :body => 'testing'})
|
||||||
@wrong_pull.issue.user, @wrong_pull.issue.project = @user, @wrong_pull.base_project
|
@wrong_pull.issue.user, @wrong_pull.issue.project = @user, @wrong_pull.base_project
|
||||||
@wrong_pull.base_ref = 'master'
|
@wrong_pull.base_ref = 'master'
|
||||||
@wrong_pull.head_project, @wrong_pull.head_ref = @project, 'master'
|
@wrong_pull.head_project, @wrong_pull.head_ref = @project, 'wrong'
|
||||||
@wrong_pull.save.should be_false
|
@wrong_pull.save
|
||||||
|
@project.pull_requests.joins(:issue).where(:issues => {:title => @wrong_pull.title}).count.should == 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue