user_sees_versions_spec.rb 7.04 KB
Newer Older
1
require 'rails_helper'
2

3
describe 'Merge request > User sees versions', :js do
4 5
  let(:merge_request) { create(:merge_request, importing: true) }
  let(:project) { merge_request.source_project }
6
  let(:user) { project.creator }
7 8 9
  let!(:merge_request_diff1) { merge_request.merge_request_diffs.create(head_commit_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9') }
  let!(:merge_request_diff2) { merge_request.merge_request_diffs.create(head_commit_sha: nil) }
  let!(:merge_request_diff3) { merge_request.merge_request_diffs.create(head_commit_sha: '5937ac0a7beb003549fc5fd26fc247adbce4a52e') }
10
  let!(:params) { {} }
11

12
  before do
13
    project.add_maintainer(user)
14
    sign_in(user)
15
    visit diffs_project_merge_request_path(project, merge_request, params)
16 17
  end

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
  shared_examples 'allows commenting' do |file_id:, line_code:, comment:|
    it do
      diff_file_selector = ".diff-file[id='#{file_id}']"
      line_code = "#{file_id}_#{line_code}"

      page.within(diff_file_selector) do
        find(".line_holder[id='#{line_code}'] td:nth-of-type(1)").hover
        find(".line_holder[id='#{line_code}'] button").click

        page.within("form[data-line-code='#{line_code}']") do
          fill_in "note[note]", with: comment
          find(".js-comment-button").click
        end

        wait_for_requests

        expect(page).to have_content(comment)
      end
36
    end
37
  end
38

39 40 41 42 43 44 45 46 47 48 49 50 51
  describe 'compare with the latest version' do
    it 'show the latest version of the diff' do
      page.within '.mr-version-dropdown' do
        expect(page).to have_content 'latest version'
      end

      expect(page).to have_content '8 changed files'
    end

    it_behaves_like 'allows commenting',
                    file_id: '7445606fbf8f3683cd42bdc54b05d7a0bc2dfc44',
                    line_code: '1_1',
                    comment: 'Typo, please fix.'
52 53 54 55
  end

  describe 'switch between versions' do
    before do
56
      page.within '.mr-version-dropdown' do
57
        find('.btn-default').click
58 59 60 61 62 63
        click_link 'version 1'
      end

      # Wait for the page to load
      page.within '.mr-version-dropdown' do
        expect(page).to have_content 'version 1'
64 65 66
      end
    end

67
    it 'shows comments that were last relevant at that version' do
68
      expect(page).to have_content '5 changed files'
69
      expect(page).to have_content 'Not all comments are displayed'
Douwe Maan's avatar
Douwe Maan committed
70 71 72 73 74 75 76 77 78 79 80 81

      position = Gitlab::Diff::Position.new(
        old_path: ".gitmodules",
        new_path: ".gitmodules",
        old_line: nil,
        new_line: 4,
        diff_refs: merge_request_diff1.diff_refs
      )
      outdated_diff_note = create(:diff_note_on_merge_request, project: project, noteable: merge_request, position: position)
      outdated_diff_note.position = outdated_diff_note.original_position
      outdated_diff_note.save!

82
      refresh
83

Douwe Maan's avatar
Douwe Maan committed
84 85
      expect(page).to have_css(".diffs .notes[data-discussion-id='#{outdated_diff_note.discussion_id}']")
    end
86

87 88 89 90
    it_behaves_like 'allows commenting',
                    file_id: '7445606fbf8f3683cd42bdc54b05d7a0bc2dfc44',
                    line_code: '2_2',
                    comment: 'Typo, please fix.'
91 92 93 94 95
  end

  describe 'compare with older version' do
    before do
      page.within '.mr-version-compare-dropdown' do
96
        find('.btn-default').click
97 98 99 100 101 102
        click_link 'version 1'
      end

      # Wait for the page to load
      page.within '.mr-version-compare-dropdown' do
        expect(page).to have_content 'version 1'
103 104 105
      end
    end

106
    it 'has a path with comparison context and shows comments that were last relevant at that version' do
107
      expect(page).to have_current_path diffs_project_merge_request_path(
108 109
        project,
        merge_request.iid,
110
        diff_id: merge_request_diff3.id,
111 112
        start_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9'
      )
113 114
      expect(page).to have_content '4 changed files'
      expect(page).to have_content '15 additions 6 deletions'
115 116 117 118 119 120 121 122 123 124
      expect(page).to have_content 'Not all comments are displayed'

      position = Gitlab::Diff::Position.new(
        old_path: ".gitmodules",
        new_path: ".gitmodules",
        old_line: 4,
        new_line: 4,
        diff_refs: merge_request_diff3.compare_with(merge_request_diff1.head_commit_sha).diff_refs
      )
      outdated_diff_note = create(:diff_note_on_merge_request, project: project, noteable: merge_request, position: position)
125 126
      outdated_diff_note.position = outdated_diff_note.original_position
      outdated_diff_note.save!
127

128
      refresh
129
      wait_for_requests
130 131 132 133

      expect(page).to have_css(".diffs .notes[data-discussion-id='#{outdated_diff_note.discussion_id}']")
    end

134
    it 'show diff between new and old version' do
135 136
      expect(page).to have_content '4 changed files'
      expect(page).to have_content '15 additions 6 deletions'
137 138
    end

139
    it 'returns to latest version when "Show latest version" button is clicked' do
140 141 142 143 144 145
      click_link 'Show latest version'
      page.within '.mr-version-dropdown' do
        expect(page).to have_content 'latest version'
      end
      expect(page).to have_content '8 changed files'
    end
146 147

    it_behaves_like 'allows commenting',
Felipe Artur's avatar
Felipe Artur committed
148 149 150
                   file_id: '7445606fbf8f3683cd42bdc54b05d7a0bc2dfc44',
                   line_code: '4_4',
                   comment: 'Typo, please fix.'
151
  end
152 153 154 155 156 157 158 159 160

  describe 'compare with same version' do
    before do
      page.within '.mr-version-compare-dropdown' do
        find('.btn-default').click
        click_link 'version 1'
      end
    end

161
    it 'has 0 chages between versions' do
162
      page.within '.mr-version-compare-dropdown' do
163
        expect(find('.dropdown-menu-toggle')).to have_content 'version 1'
164 165 166 167
      end

      page.within '.mr-version-dropdown' do
        find('.btn-default').click
168
        click_link 'version 1'
169 170 171 172 173 174 175 176 177 178 179 180 181
      end
      expect(page).to have_content '0 changed files'
    end
  end

  describe 'compare with newer version' do
    before do
      page.within '.mr-version-compare-dropdown' do
        find('.btn-default').click
        click_link 'version 2'
      end
    end

182
    it 'sets the compared versions to be the same' do
183
      page.within '.mr-version-compare-dropdown' do
184
        expect(find('.dropdown-menu-toggle')).to have_content 'version 2'
185 186 187 188
      end

      page.within '.mr-version-dropdown' do
        find('.btn-default').click
189
        click_link 'version 1'
190 191 192 193 194 195 196 197 198
      end

      page.within '.mr-version-compare-dropdown' do
        expect(page).to have_content 'version 1'
      end

      expect(page).to have_content '0 changed files'
    end
  end
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218

  describe 'scoped in a commit' do
    let(:params) { { commit_id: '570e7b2abdd848b95f2f578043fc23bd6f6fd24d' } }

    before do
      wait_for_requests
    end

    it 'should only show diffs from the commit' do
      diff_commit_ids = find_all('.diff-file [data-commit-id]').map {|diff| diff['data-commit-id']}

      expect(diff_commit_ids).not_to be_empty
      expect(diff_commit_ids).to all(eq(params[:commit_id]))
    end

    it_behaves_like 'allows commenting',
                    file_id: '2f6fcd96b88b36ce98c38da085c795a27d92a3dd',
                    line_code: '6_6',
                    comment: 'Typo, please fix.'
  end
219
end