rebase_service_spec.rb 5.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
require 'spec_helper'

describe MergeRequests::RebaseService do
  include ProjectForksHelper

  let(:user) { create(:user) }
  let(:merge_request) do
    create(:merge_request,
           source_branch: 'feature_conflict',
           target_branch: 'master')
  end
  let(:project) { merge_request.project }
  let(:repository) { project.repository.raw }

  subject(:service) { described_class.new(project, user, {}) }

  before do
    project.add_master(user)
  end

  describe '#execute' do
    context 'when another rebase is already in progress' do
      before do
        allow(merge_request).to receive(:rebase_in_progress?).and_return(true)
      end

      it 'saves the error message' do
        subject.execute(merge_request)

        expect(merge_request.reload.merge_error).to eq 'Rebase task canceled: Another rebase is already in progress'
      end

      it 'returns an error' do
        expect(service.execute(merge_request)).to match(status: :error,
35
                                                        message: described_class::REBASE_ERROR)
36 37 38
      end
    end

39
    context 'when unexpected error occurs', :disable_gitaly do
40 41 42 43
      before do
        allow(repository).to receive(:run_git!).and_raise('Something went wrong')
      end

44
      it 'saves a generic error message' do
45 46
        subject.execute(merge_request)

47
        expect(merge_request.reload.merge_error).to eq described_class::REBASE_ERROR
48 49 50 51
      end

      it 'returns an error' do
        expect(service.execute(merge_request)).to match(status: :error,
52
                                                        message: described_class::REBASE_ERROR)
53 54 55
      end
    end

56
    context 'with git command failure', :disable_gitaly do
57 58 59 60
      before do
        allow(repository).to receive(:run_git!).and_raise(Gitlab::Git::Repository::GitError, 'Something went wrong')
      end

61
      it 'saves a generic error message' do
62 63
        subject.execute(merge_request)

64
        expect(merge_request.reload.merge_error).to eq described_class::REBASE_ERROR
65 66 67 68
      end

      it 'returns an error' do
        expect(service.execute(merge_request)).to match(status: :error,
69
                                                        message: described_class::REBASE_ERROR)
70 71 72 73
      end
    end

    context 'valid params' do
74 75 76 77
      shared_examples 'successful rebase' do
        before do
          service.execute(merge_request)
        end
78

79 80 81 82 83
        it 'rebases source branch' do
          parent_sha = merge_request.source_project.repository.commit(merge_request.source_branch).parents.first.sha
          target_branch_sha = merge_request.target_project.repository.commit(merge_request.target_branch).sha
          expect(parent_sha).to eq(target_branch_sha)
        end
84

85 86 87 88 89 90 91 92 93 94 95 96 97
        it 'records the new SHA on the merge request' do
          head_sha = merge_request.source_project.repository.commit(merge_request.source_branch).sha
          expect(merge_request.reload.rebase_commit_sha).to eq(head_sha)
        end

        it 'logs correct author and commiter' do
          head_commit = merge_request.source_project.repository.commit(merge_request.source_branch)

          expect(head_commit.author_email).to eq('dmitriy.zaporozhets@gmail.com')
          expect(head_commit.author_name).to eq('Dmitriy Zaporozhets')
          expect(head_commit.committer_email).to eq(user.email)
          expect(head_commit.committer_name).to eq(user.name)
        end
98 99
      end

100 101 102
      context 'when Gitaly rebase feature is enabled' do
        it_behaves_like 'successful rebase'
      end
103

104 105
      context 'when Gitaly rebase feature is disabled', :disable_gitaly do
        it_behaves_like 'successful rebase'
106 107
      end

108
      context 'git commands', :disable_gitaly do
109 110
        it 'sets GL_REPOSITORY env variable when calling git commands' do
          expect(repository).to receive(:popen).exactly(3)
111
            .with(anything, anything, hash_including('GL_REPOSITORY'), anything)
112 113 114 115 116 117 118
            .and_return(['', 0])

          service.execute(merge_request)
        end
      end

      context 'fork' do
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
        shared_examples 'successful fork rebase' do
          let(:forked_project) do
            fork_project(project, user, repository: true)
          end

          let(:merge_request_from_fork) do
            forked_project.repository.create_file(
              user,
              'new-file-to-target',
              '',
              message: 'Add new file to target',
              branch_name: 'master')

            create(:merge_request,
                  source_branch: 'master', source_project: forked_project,
                  target_branch: 'master', target_project: project)
          end

          it 'rebases source branch' do
            parent_sha = forked_project.repository.commit(merge_request_from_fork.source_branch).parents.first.sha
            target_branch_sha = project.repository.commit(merge_request_from_fork.target_branch).sha
            expect(parent_sha).to eq(target_branch_sha)
          end
142 143
        end

144 145
        context 'when Gitaly rebase feature is enabled' do
          it_behaves_like 'successful fork rebase'
146 147
        end

148 149
        context 'when Gitaly rebase feature is disabled', :disable_gitaly do
          it_behaves_like 'successful fork rebase'
150 151 152 153 154
        end
      end
    end
  end
end