Skip to content
Snippets Groups Projects
merge_request_spec.rb 41.2 KiB
Newer Older
  • Learn to ignore specific revisions
  •       allow(subject).to receive(:diff_discussions).and_return([first_discussion, second_discussion, third_discussion])
    
        end
    
        describe "#discussions_resolvable?" do
          context "when all discussions are unresolvable" do
            before do
              allow(first_discussion).to receive(:resolvable?).and_return(false)
              allow(second_discussion).to receive(:resolvable?).and_return(false)
              allow(third_discussion).to receive(:resolvable?).and_return(false)
            end
    
            it "returns false" do
              expect(subject.discussions_resolvable?).to be false
            end
          end
    
          context "when some discussions are unresolvable and some discussions are resolvable" do
            before do
              allow(first_discussion).to receive(:resolvable?).and_return(true)
              allow(second_discussion).to receive(:resolvable?).and_return(false)
              allow(third_discussion).to receive(:resolvable?).and_return(true)
            end
    
            it "returns true" do
              expect(subject.discussions_resolvable?).to be true
            end
          end
    
          context "when all discussions are resolvable" do
            before do
              allow(first_discussion).to receive(:resolvable?).and_return(true)
              allow(second_discussion).to receive(:resolvable?).and_return(true)
              allow(third_discussion).to receive(:resolvable?).and_return(true)
            end
    
            it "returns true" do
              expect(subject.discussions_resolvable?).to be true
            end
          end
        end
    
        describe "#discussions_resolved?" do
          context "when discussions are not resolvable" do
            before do
              allow(subject).to receive(:discussions_resolvable?).and_return(false)
            end
    
            it "returns false" do
              expect(subject.discussions_resolved?).to be false
            end
          end
    
          context "when discussions are resolvable" do
            before do
              allow(subject).to receive(:discussions_resolvable?).and_return(true)
    
              allow(first_discussion).to receive(:resolvable?).and_return(true)
              allow(second_discussion).to receive(:resolvable?).and_return(false)
              allow(third_discussion).to receive(:resolvable?).and_return(true)
            end
    
            context "when all resolvable discussions are resolved" do
              before do
                allow(first_discussion).to receive(:resolved?).and_return(true)
                allow(third_discussion).to receive(:resolved?).and_return(true)
              end
    
              it "returns true" do
                expect(subject.discussions_resolved?).to be true
              end
            end
    
            context "when some resolvable discussions are not resolved" do
              before do
                allow(first_discussion).to receive(:resolved?).and_return(true)
                allow(third_discussion).to receive(:resolved?).and_return(false)
              end
    
              it "returns false" do
                expect(subject.discussions_resolved?).to be false
              end
            end
          end
        end
      end
    
      describe '#conflicts_can_be_resolved_in_ui?' do
    
        def create_merge_request(source_branch)
          create(:merge_request, source_branch: source_branch, target_branch: 'conflict-start') do |mr|
            mr.mark_as_unmergeable
          end
        end
    
        it 'returns a falsey value when the MR can be merged without conflicts' do
          merge_request = create_merge_request('master')
          merge_request.mark_as_mergeable
    
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
    
        it 'returns a falsey value when the MR is marked as having conflicts, but has none' do
          merge_request = create_merge_request('master')
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
        end
    
    
        it 'returns a falsey value when the MR has a missing ref after a force push' do
          merge_request = create_merge_request('conflict-resolvable')
          allow(merge_request.conflicts).to receive(:merge_index).and_raise(Rugged::OdbError)
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
        end
    
    
        it 'returns a falsey value when the MR does not support new diff notes' do
          merge_request = create_merge_request('conflict-resolvable')
          merge_request.merge_request_diff.update_attributes(start_commit_sha: nil)
    
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
    
        end
    
        it 'returns a falsey value when the conflicts contain a large file' do
          merge_request = create_merge_request('conflict-too-large')
    
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
    
        end
    
        it 'returns a falsey value when the conflicts contain a binary file' do
          merge_request = create_merge_request('conflict-binary-file')
    
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
    
        end
    
        it 'returns a falsey value when the conflicts contain a file with ambiguous conflict markers' do
          merge_request = create_merge_request('conflict-contains-conflict-markers')
    
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
    
        end
    
        it 'returns a falsey value when the conflicts contain a file edited in one branch and deleted in another' do
          merge_request = create_merge_request('conflict-missing-side')
    
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
    
        end
    
        it 'returns a truthy value when the conflicts are resolvable in the UI' do
          merge_request = create_merge_request('conflict-resolvable')
    
    
          expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_truthy
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
      describe "#forked_source_project_missing?" do
    
        let(:project)      { create(:project) }
        let(:fork_project) { create(:project, forked_from_project: project) }
        let(:user)         { create(:user) }
        let(:unlink_project) { Projects::UnlinkForkService.new(fork_project, user) }
    
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
        context "when the fork exists" do
    
          let(:merge_request) do
            create(:merge_request,
              source_project: fork_project,
              target_project: project)
          end
    
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
          it { expect(merge_request.forked_source_project_missing?).to be_falsey }
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
        context "when the source project is the same as the target project" do
    
          let(:merge_request) { create(:merge_request, source_project: project) }
    
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
          it { expect(merge_request.forked_source_project_missing?).to be_falsey }
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
        context "when the fork does not exist" do
    
          let(:merge_request) do
            create(:merge_request,
              source_project: fork_project,
              target_project: project)
          end
    
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
          it "returns true" do
    
            unlink_project.execute
            merge_request.reload
    
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
            expect(merge_request.forked_source_project_missing?).to be_truthy
    
          end
        end
      end
    
      describe "#closed_without_fork?" do
        let(:project)      { create(:project) }
        let(:fork_project) { create(:project, forked_from_project: project) }
        let(:user)         { create(:user) }
        let(:unlink_project) { Projects::UnlinkForkService.new(fork_project, user) }
    
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
        context "when the merge request is closed" do
    
          let(:closed_merge_request) do
            create(:closed_merge_request,
              source_project: fork_project,
              target_project: project)
          end
    
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
          it "returns false if the fork exist" do
    
            expect(closed_merge_request.closed_without_fork?).to be_falsey
          end
    
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
          it "returns true if the fork does not exist" do
    
            unlink_project.execute
            closed_merge_request.reload
    
            expect(closed_merge_request.closed_without_fork?).to be_truthy
          end
        end
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
        context "when the merge request is open" do
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
          let(:open_merge_request) do
            create(:merge_request,
              source_project: fork_project,
              target_project: project)
          end
    
          it "returns false" do
            expect(open_merge_request.closed_without_fork?).to be_falsey
          end
        end
    
      describe '#closed_without_source_project?' do
    
        let(:project)      { create(:project) }
        let(:user)         { create(:user) }
    
        let(:fork_project) { create(:project, forked_from_project: project, namespace: user.namespace) }
    
        let(:destroy_service) { Projects::DestroyService.new(fork_project, user) }
    
        context 'when the merge request is closed' do
    
          let(:closed_merge_request) do
            create(:closed_merge_request,
              source_project: fork_project,
              target_project: project)
          end
    
    
          it 'returns false if the source project exists' do
    
            expect(closed_merge_request.closed_without_source_project?).to be_falsey
          end
    
    
          it 'returns true if the source project does not exist' do
    
            destroy_service.execute
    
            closed_merge_request.reload
    
            expect(closed_merge_request.closed_without_source_project?).to be_truthy
          end
        end
    
    
        context 'when the merge request is open' do
          it 'returns false' do
            expect(subject.closed_without_source_project?).to be_falsey
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
    
    
      describe '#reopenable?' do
    
        context 'when the merge request is closed' do
          it 'returns true' do
            subject.close
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
    
    
            expect(subject.reopenable?).to be_truthy
    
          end
    
          context 'forked project' do
            let(:project)      { create(:project) }
            let(:user)         { create(:user) }
    
            let(:fork_project) { create(:project, forked_from_project: project, namespace: user.namespace) }
    
            let(:merge_request) do
              create(:closed_merge_request,
                source_project: fork_project,
                target_project: project)
            end
    
            it 'returns false if unforked' do
              Projects::UnlinkForkService.new(fork_project, user).execute
    
    
              expect(merge_request.reload.reopenable?).to be_falsey
    
            end
    
            it 'returns false if the source project is deleted' do
    
              Projects::DestroyService.new(fork_project, user).execute
    
              expect(merge_request.reload.reopenable?).to be_falsey
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
            it 'returns false if the merge request is merged' do
    
              merge_request.update_attributes(state: 'merged')
    
    
              expect(merge_request.reload.reopenable?).to be_falsey
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
        context 'when the merge request is opened' do
    
          it 'returns false' do
    
            expect(subject.reopenable?).to be_falsey
    
    Katarzyna Kobierska's avatar
    Katarzyna Kobierska committed
        end
      end