6b834f2cbc
When a build fails for a commit, create a todo for the author of the merge request that commit is the HEAD of. If the commit isn't the HEAD commit of any MR, don't do anything. If there already is a todo for that user and MR, don't do anything. Current limitations: - This isn't configurable by project. - The author of a merge request might not be the person who pushed the breaking commit.
186 lines
7.2 KiB
Ruby
186 lines
7.2 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe MergeRequests::RefreshService, services: true do
|
|
let(:project) { create(:project) }
|
|
let(:user) { create(:user) }
|
|
let(:service) { MergeRequests::RefreshService }
|
|
|
|
describe :execute do
|
|
before do
|
|
@user = create(:user)
|
|
group = create(:group)
|
|
group.add_owner(@user)
|
|
|
|
@project = create(:project, namespace: group)
|
|
@fork_project = Projects::ForkService.new(@project, @user).execute
|
|
@merge_request = create(:merge_request,
|
|
source_project: @project,
|
|
source_branch: 'master',
|
|
target_branch: 'feature',
|
|
target_project: @project,
|
|
merge_when_build_succeeds: true,
|
|
merge_user: @user)
|
|
|
|
@fork_merge_request = create(:merge_request,
|
|
source_project: @fork_project,
|
|
source_branch: 'master',
|
|
target_branch: 'feature',
|
|
target_project: @project)
|
|
|
|
@build_failed_todo = create(:todo,
|
|
:build_failed,
|
|
user: @user,
|
|
project: @project,
|
|
target: @merge_request,
|
|
author: @user)
|
|
|
|
@fork_build_failed_todo = create(:todo,
|
|
:build_failed,
|
|
user: @user,
|
|
project: @project,
|
|
target: @merge_request,
|
|
author: @user)
|
|
|
|
@commits = @merge_request.commits
|
|
|
|
@oldrev = @commits.last.id
|
|
@newrev = @commits.first.id
|
|
end
|
|
|
|
context 'push to origin repo source branch' do
|
|
let(:refresh_service) { service.new(@project, @user) }
|
|
before do
|
|
allow(refresh_service).to receive(:execute_hooks)
|
|
refresh_service.execute(@oldrev, @newrev, 'refs/heads/master')
|
|
reload_mrs
|
|
end
|
|
|
|
it 'should execute hooks with update action' do
|
|
expect(refresh_service).to have_received(:execute_hooks).
|
|
with(@merge_request, 'update')
|
|
end
|
|
|
|
it { expect(@merge_request.notes).not_to be_empty }
|
|
it { expect(@merge_request).to be_open }
|
|
it { expect(@merge_request.merge_when_build_succeeds).to be_falsey}
|
|
it { expect(@fork_merge_request).to be_open }
|
|
it { expect(@fork_merge_request.notes).to be_empty }
|
|
it { expect(@build_failed_todo).to be_done }
|
|
it { expect(@fork_build_failed_todo).to be_done }
|
|
end
|
|
|
|
context 'push to origin repo target branch' do
|
|
before do
|
|
service.new(@project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
|
|
reload_mrs
|
|
end
|
|
|
|
it { expect(@merge_request.notes.last.note).to include('changed to merged') }
|
|
it { expect(@merge_request).to be_merged }
|
|
it { expect(@fork_merge_request).to be_merged }
|
|
it { expect(@fork_merge_request.notes.last.note).to include('changed to merged') }
|
|
it { expect(@build_failed_todo).to be_pending }
|
|
it { expect(@fork_build_failed_todo).to be_pending }
|
|
end
|
|
|
|
context 'manual merge of source branch' do
|
|
before do
|
|
# Merge master -> feature branch
|
|
author = { email: 'test@gitlab.com', time: Time.now, name: "Me" }
|
|
commit_options = { message: 'Test message', committer: author, author: author }
|
|
master_commit = @project.repository.commit('master')
|
|
@project.repository.merge(@user, master_commit.id, 'feature', commit_options)
|
|
commit = @project.repository.commit('feature')
|
|
service.new(@project, @user).execute(@oldrev, commit.id, 'refs/heads/feature')
|
|
reload_mrs
|
|
end
|
|
|
|
it { expect(@merge_request.notes.last.note).to include('changed to merged') }
|
|
it { expect(@merge_request).to be_merged }
|
|
it { expect(@merge_request.diffs.size).to be > 0 }
|
|
it { expect(@fork_merge_request).to be_merged }
|
|
it { expect(@fork_merge_request.notes.last.note).to include('changed to merged') }
|
|
it { expect(@build_failed_todo).to be_pending }
|
|
it { expect(@fork_build_failed_todo).to be_pending }
|
|
end
|
|
|
|
context 'push to fork repo source branch' do
|
|
let(:refresh_service) { service.new(@fork_project, @user) }
|
|
before do
|
|
allow(refresh_service).to receive(:execute_hooks)
|
|
refresh_service.execute(@oldrev, @newrev, 'refs/heads/master')
|
|
reload_mrs
|
|
end
|
|
|
|
it 'should execute hooks with update action' do
|
|
expect(refresh_service).to have_received(:execute_hooks).
|
|
with(@fork_merge_request, 'update')
|
|
end
|
|
|
|
it { expect(@merge_request.notes).to be_empty }
|
|
it { expect(@merge_request).to be_open }
|
|
it { expect(@fork_merge_request.notes.last.note).to include('Added 4 commits') }
|
|
it { expect(@fork_merge_request).to be_open }
|
|
it { expect(@build_failed_todo).to be_pending }
|
|
it { expect(@fork_build_failed_todo).to be_pending }
|
|
end
|
|
|
|
context 'push to fork repo target branch' do
|
|
before do
|
|
service.new(@fork_project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
|
|
reload_mrs
|
|
end
|
|
|
|
it { expect(@merge_request.notes).to be_empty }
|
|
it { expect(@merge_request).to be_open }
|
|
it { expect(@fork_merge_request.notes).to be_empty }
|
|
it { expect(@fork_merge_request).to be_open }
|
|
it { expect(@build_failed_todo).to be_pending }
|
|
it { expect(@fork_build_failed_todo).to be_pending }
|
|
end
|
|
|
|
context 'push to origin repo target branch after fork project was removed' do
|
|
before do
|
|
@fork_project.destroy
|
|
service.new(@project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
|
|
reload_mrs
|
|
end
|
|
|
|
it { expect(@merge_request.notes.last.note).to include('changed to merged') }
|
|
it { expect(@merge_request).to be_merged }
|
|
it { expect(@fork_merge_request).to be_open }
|
|
it { expect(@fork_merge_request.notes).to be_empty }
|
|
it { expect(@build_failed_todo).to be_pending }
|
|
it { expect(@fork_build_failed_todo).to be_pending }
|
|
end
|
|
|
|
context 'push new branch that exists in a merge request' do
|
|
let(:refresh_service) { service.new(@fork_project, @user) }
|
|
|
|
it 'refreshes the merge request' do
|
|
expect(refresh_service).to receive(:execute_hooks).
|
|
with(@fork_merge_request, 'update')
|
|
allow_any_instance_of(Repository).to receive(:merge_base).and_return(@oldrev)
|
|
|
|
refresh_service.execute(Gitlab::Git::BLANK_SHA, @newrev, 'refs/heads/master')
|
|
reload_mrs
|
|
|
|
expect(@merge_request.notes).to be_empty
|
|
expect(@merge_request).to be_open
|
|
|
|
notes = @fork_merge_request.notes.reorder(:created_at).map(&:note)
|
|
expect(notes[0]).to include('Restored source branch `master`')
|
|
expect(notes[1]).to include('Added 4 commits')
|
|
expect(@fork_merge_request).to be_open
|
|
end
|
|
end
|
|
|
|
|
|
def reload_mrs
|
|
@merge_request.reload
|
|
@fork_merge_request.reload
|
|
@build_failed_todo.reload
|
|
@fork_build_failed_todo.reload
|
|
end
|
|
end
|
|
end
|