conflicts_spec.rb 6.4 KB
Newer Older
S
Sean McGivern 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
require 'spec_helper'

feature 'Merge request conflict resolution', js: true, feature: true do
  include WaitForAjax

  let(:user) { create(:user) }
  let(:project) { create(:project) }

  def create_merge_request(source_branch)
    create(:merge_request, source_branch: source_branch, target_branch: 'conflict-start', source_project: project) do |mr|
      mr.mark_as_unmergeable
    end
  end

15 16 17 18 19
  shared_examples "conflicts are resolved in Interactive mode" do
    it 'conflicts are resolved in Interactive mode' do
      within find('.files-wrapper .diff-file', text: 'files/ruby/popen.rb') do
        click_button 'Use ours'
      end
S
Sean McGivern 已提交
20

21 22 23 24 25
      within find('.files-wrapper .diff-file', text: 'files/ruby/regex.rb') do
        all('button', text: 'Use ours').each do |button|
          button.click
        end
      end
S
Sean McGivern 已提交
26

27 28
      click_button 'Commit conflict resolution'
      wait_for_ajax
S
Sean McGivern 已提交
29

30 31
      expect(page).to have_content('All merge conflicts were resolved')
      merge_request.reload_diff
S
Sean McGivern 已提交
32

33 34
      click_on 'Changes'
      wait_for_ajax
S
Sean McGivern 已提交
35

36 37 38
      within find('.diff-file', text: 'files/ruby/popen.rb') do
        expect(page).to have_selector('.line_content.new', text: "vars = { 'PWD' => path }")
        expect(page).to have_selector('.line_content.new', text: "options = { chdir: path }")
S
Sean McGivern 已提交
39
      end
40

41 42 43 44 45 46 47 48 49 50
      within find('.diff-file', text: 'files/ruby/regex.rb') do
        expect(page).to have_selector('.line_content.new', text: "def username_regexp")
        expect(page).to have_selector('.line_content.new', text: "def project_name_regexp")
        expect(page).to have_selector('.line_content.new', text: "def path_regexp")
        expect(page).to have_selector('.line_content.new', text: "def archive_formats_regexp")
        expect(page).to have_selector('.line_content.new', text: "def git_reference_regexp")
        expect(page).to have_selector('.line_content.new', text: "def default_regexp")
      end
    end
  end
51

52 53 54
  shared_examples "conflicts are resolved in Edit inline mode" do
    it 'conflicts are resolved in Edit inline mode' do
      expect(find('#conflicts')).to have_content('popen.rb')
55

56 57 58 59
      within find('.files-wrapper .diff-file', text: 'files/ruby/popen.rb') do
        click_button 'Edit inline'
        wait_for_ajax
        execute_script('ace.edit($(".files-wrapper .diff-file pre")[0]).setValue("One morning");')
60
      end
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

      within find('.files-wrapper .diff-file', text: 'files/ruby/regex.rb') do
        click_button 'Edit inline'
        wait_for_ajax
        execute_script('ace.edit($(".files-wrapper .diff-file pre")[1]).setValue("Gregor Samsa woke from troubled dreams");')
      end

      click_button 'Commit conflict resolution'
      wait_for_ajax
      expect(page).to have_content('All merge conflicts were resolved')
      merge_request.reload_diff

      click_on 'Changes'
      wait_for_ajax

      expect(page).to have_content('One morning')
      expect(page).to have_content('Gregor Samsa woke from troubled dreams')
S
Sean McGivern 已提交
78 79 80
    end
  end

81
  context 'can be resolved in the UI' do
82 83 84
    before do
      project.team << [user, :developer]
      login_as(user)
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
    end

    context 'the conflicts are resolvable' do
      let(:merge_request) { create_merge_request('conflict-resolvable') }

      before { visit namespace_project_merge_request_path(project.namespace, project, merge_request) }

      it 'shows a link to the conflict resolution page' do
        expect(page).to have_link('conflicts', href: /\/conflicts\Z/)
      end

      context 'in Inline view mode' do
        before { click_link('conflicts', href: /\/conflicts\Z/) }

        include_examples "conflicts are resolved in Interactive mode"
        include_examples "conflicts are resolved in Edit inline mode"
      end

      context 'in Parallel view mode' do
        before do
          click_link('conflicts', href: /\/conflicts\Z/) 
          click_button 'Side-by-side'
        end
108

109 110 111
        include_examples "conflicts are resolved in Interactive mode"
        include_examples "conflicts are resolved in Edit inline mode"
      end
112 113
    end

114 115 116 117 118 119 120 121 122 123 124 125 126 127
    context 'the conflict contain markers' do
      let(:merge_request) { create_merge_request('conflict-contains-conflict-markers') }

      before do
        visit namespace_project_merge_request_path(project.namespace, project, merge_request)
        click_link('conflicts', href: /\/conflicts\Z/)
      end

      it 'conflicts can not be resolved in Interactive mode' do
        within find('.files-wrapper .diff-file', text: 'files/markdown/ruby-style-guide.md') do
          expect(page).not_to have_content 'Interactive mode'
          expect(page).not_to have_content 'Edit inline'
        end
      end
128

129
      it 'conflicts are resolved in Edit inline mode' do
130
        within find('.files-wrapper .diff-file', text: 'files/markdown/ruby-style-guide.md') do
131
          wait_for_ajax
132
          execute_script('ace.edit($(".files-wrapper .diff-file pre")[0]).setValue("Gregor Samsa woke from troubled dreams");')
133 134 135 136 137 138 139 140 141 142 143
        end

        click_button 'Commit conflict resolution'
        wait_for_ajax

        expect(page).to have_content('All merge conflicts were resolved')

        merge_request.reload_diff

        click_on 'Changes'
        wait_for_ajax
144
        find('.click-to-expand').click
145 146 147 148 149 150 151
        wait_for_ajax

        expect(page).to have_content('Gregor Samsa woke from troubled dreams')
      end
    end
  end

S
Sean McGivern 已提交
152 153 154
  UNRESOLVABLE_CONFLICTS = {
    'conflict-too-large' => 'when the conflicts contain a large file',
    'conflict-binary-file' => 'when the conflicts contain a binary file',
155 156
    'conflict-missing-side' => 'when the conflicts contain a file edited in one branch and deleted in another',
    'conflict-non-utf8' => 'when the conflicts contain a non-UTF-8 file',
S
Sean McGivern 已提交
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
  }

  UNRESOLVABLE_CONFLICTS.each do |source_branch, description|
    context description do
      let(:merge_request) { create_merge_request(source_branch) }

      before do
        project.team << [user, :developer]
        login_as(user)

        visit namespace_project_merge_request_path(project.namespace, project, merge_request)
      end

      it 'does not show a link to the conflict resolution page' do
        expect(page).not_to have_link('conflicts', href: /\/conflicts\Z/)
      end

      it 'shows an error if the conflicts page is visited directly' do
        visit current_url + '/conflicts'
        wait_for_ajax

178
        expect(find('#conflicts')).to have_content('Please try to resolve them locally.')
S
Sean McGivern 已提交
179 180 181 182
      end
    end
  end
end