gitlab-org--gitlab-foss/spec/services/commits/commit_patch_service_spec.rb
Bob Van Landuyt 6fbdc5ed52 Apply patches when creating MR via email
This allows users to add patches as attachments to merge request
created via email.

When an email to create a merge request is sent, all the attachments
ending in `.patch` will be applied to the branch specified in the
subject of the email. If the branch did not exist, it will be created
from the HEAD of the repository.

When the patches could not be applied, the error message will be
replied to the user.

The patches can have a maximum combined size of 2MB for now.
2018-11-07 16:27:55 +01:00

92 lines
2.7 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
describe Commits::CommitPatchService do
describe '#execute' do
let(:patches) do
patches_folder = Rails.root.join('spec/fixtures/patchfiles')
content_1 = File.read(File.join(patches_folder, "0001-This-does-not-apply-to-the-feature-branch.patch"))
content_2 = File.read(File.join(patches_folder, "0001-A-commit-from-a-patch.patch"))
[content_1, content_2]
end
let(:user) { project.creator }
let(:branch_name) { 'branch-with-patches' }
let(:project) { create(:project, :repository) }
let(:start_branch) { nil }
let(:params) { { branch_name: branch_name, patches: patches, start_branch: start_branch } }
subject(:service) do
described_class.new(project, user, params)
end
it 'returns a successful result' do
result = service.execute
branch = project.repository.find_branch(branch_name)
expect(result[:status]).to eq(:success)
expect(result[:result]).to eq(branch.target)
end
it 'is based off HEAD when no start ref is passed' do
service.execute
merge_base = project.repository.merge_base(project.repository.root_ref, branch_name)
expect(merge_base).to eq(project.repository.commit('HEAD').sha)
end
context 'when specifying a different start branch' do
let(:start_branch) { 'with-codeowners' }
it 'is based of the correct branch' do
service.execute
merge_base = project.repository.merge_base(start_branch, branch_name)
expect(merge_base).to eq(project.repository.commit(start_branch).sha)
end
end
shared_examples 'an error response' do |expected_message|
it 'returns the correct error' do
result = service.execute
expect(result[:status]).to eq(:error)
expect(result[:message]).to match(expected_message)
end
end
context 'when the user does not have access' do
let(:user) { create(:user) }
it_behaves_like 'an error response',
'You are not allowed to push into this branch'
end
context 'when the patches are not valid' do
let(:patches) { "a" * 2.1.megabytes }
it_behaves_like 'an error response', 'Patches are too big'
end
context 'when the new branch name is invalid' do
let(:branch_name) { 'HEAD' }
it_behaves_like 'an error response', 'Branch name is invalid'
end
context 'when the patches do not apply' do
let(:branch_name) { 'feature' }
it_behaves_like 'an error response', 'Patch failed at'
end
context 'when specifying a non existent start branch' do
let(:start_branch) { 'does-not-exist' }
it_behaves_like 'an error response', 'Invalid reference name'
end
end
end