notes_on_merge_requests_spec.rb 7.16 KB
Newer Older
1 2
require 'spec_helper'

3
describe 'Comments', feature: true do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
4
  include RepoHelpers
5
  include WaitForAjax
6

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
7
  describe 'On a merge request', js: true, feature: true do
8 9 10 11 12
    let!(:project) { create(:project) }
    let!(:merge_request) do
      create(:merge_request, source_project: project, target_project: project)
    end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
13
    let!(:note) do
14 15
      create(:note_on_merge_request, :with_attachment, noteable: merge_request,
                                                       project: project)
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
16
    end
17

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
18 19
    before do
      login_as :admin
Vinnie Okada's avatar
Vinnie Okada committed
20
      visit namespace_project_merge_request_path(project.namespace, project, merge_request)
21 22
    end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
23
    subject { page }
24

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
25
    describe 'the note form' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
26
      it 'should be valid' do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
27 28
        is_expected.to have_css('.js-main-target-form', visible: true, count: 1)
        expect(find('.js-main-target-form input[type=submit]').value).
29
          to eq('Comment')
30
        page.within('.js-main-target-form') do
31 32
          expect(page).not_to have_link('Cancel')
        end
33
      end
34

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
35
      describe 'with text' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
36
        before do
37
          page.within('.js-main-target-form') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
38
            fill_in 'note[note]', with: 'This is awesome'
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
39 40 41 42
          end
        end

        it 'should have enable submit button and preview button' do
43
          page.within('.js-main-target-form') do
Vinnie Okada's avatar
Vinnie Okada committed
44
            expect(page).not_to have_css('.js-comment-button[disabled]')
Vinnie Okada's avatar
Vinnie Okada committed
45
            expect(page).to have_css('.js-md-preview-button', visible: true)
46
          end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
47
        end
48 49 50
      end
    end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
51
    describe 'when posting a note' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
52
      before do
53
        page.within('.js-main-target-form') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
54
          fill_in 'note[note]', with: 'This is awsome!'
55
          find('.js-md-preview-button').click
56
          click_button 'Comment'
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
57 58
        end
      end
Jack Weeden's avatar
Jack Weeden committed
59

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
60
      it 'should be added and form reset' do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
61
        is_expected.to have_content('This is awsome!')
62
        page.within('.js-main-target-form') do
Vinnie Okada's avatar
Vinnie Okada committed
63
          expect(page).to have_no_field('note[note]', with: 'This is awesome!')
Vinnie Okada's avatar
Vinnie Okada committed
64
          expect(page).to have_css('.js-md-preview', visible: :hidden)
65
        end
66
        page.within('.js-main-target-form') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
67 68
          is_expected.to have_css('.js-note-text', visible: true)
        end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
69
      end
Jack Weeden's avatar
Jack Weeden committed
70 71
    end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
72
    describe 'when editing a note', js: true do
73 74 75 76 77 78
      it 'should contain the hidden edit form' do
        page.within("#note_#{note.id}") do
          is_expected.to have_css('.note-edit-form', visible: false)
        end
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
79
      describe 'editing the note' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
80 81 82
        before do
          find('.note').hover
          find(".js-note-edit").click
Jack Weeden's avatar
Jack Weeden committed
83 84
        end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
85
        it 'should show the note edit form and hide the note body' do
86
          page.within("#note_#{note.id}") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
87 88
            expect(find('.current-note-edit-form', visible: true)).to be_visible
            expect(find('.note-edit-form', visible: true)).to be_visible
89
            expect(find(:css, '.note-body > .note-text', visible: false)).not_to be_visible
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
90
          end
Jack Weeden's avatar
Jack Weeden committed
91 92
        end

93
        # TODO: fix after 7.7 release
94 95 96 97 98 99 100
        # it "should reset the edit note form textarea with the original content of the note if cancelled" do
        #   within(".current-note-edit-form") do
        #     fill_in "note[note]", with: "Some new content"
        #     find(".btn-cancel").click
        #     expect(find(".js-note-text", visible: false).text).to eq note.note
        #   end
        # end
Jack Weeden's avatar
Jack Weeden committed
101

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
102
        it 'appends the edited at time to the note' do
103
          page.within('.current-note-edit-form') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
104 105
            fill_in 'note[note]', with: 'Some new content'
            find('.btn-save').click
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
106 107
          end

108
          page.within("#note_#{note.id}") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
109 110 111
            is_expected.to have_css('.note_edited_ago')
            expect(find('.note_edited_ago').text).
              to match(/less than a minute ago/)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
112
          end
Jack Weeden's avatar
Jack Weeden committed
113 114 115
        end
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
116
      describe 'deleting an attachment' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
117 118
        before do
          find('.note').hover
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
119
          find('.js-note-edit').click
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
120
        end
Jack Weeden's avatar
Jack Weeden committed
121

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
122
        it 'shows the delete link' do
123
          page.within('.note-attachment') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
124
            is_expected.to have_css('.js-note-attachment-delete')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
125
          end
Jack Weeden's avatar
Jack Weeden committed
126 127
        end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
128 129 130
        it 'removes the attachment div and resets the edit form' do
          find('.js-note-attachment-delete').click
          is_expected.not_to have_css('.note-attachment')
131 132
          is_expected.not_to have_css('.current-note-edit-form')
          wait_for_ajax
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
133
        end
Jack Weeden's avatar
Jack Weeden committed
134 135 136
      end
    end
  end
137

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
138
  describe 'On a merge request diff', js: true, feature: true do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
139 140
    let(:merge_request) { create(:merge_request) }
    let(:project) { merge_request.source_project }
141 142

    before do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
143
      login_as :admin
Vinnie Okada's avatar
Vinnie Okada committed
144
      visit diffs_namespace_project_merge_request_path(project.namespace, project, merge_request)
145 146
    end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
147
    subject { page }
148

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
149
    describe 'when adding a note' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
150
      before do
151
        click_diff_line
152 153
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
154 155
      describe 'the notes holder' do
        it { is_expected.to have_css('.js-temp-notes-holder') }
156

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
157
        it 'has .new_note css class' do
158
          page.within('.js-temp-notes-holder') do
Phil Hughes's avatar
Phil Hughes committed
159
            expect(subject).to have_css('.new-note')
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
160 161
          end
        end
162 163
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
164
      describe 'the note form' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
165
        it "shouldn't add a second form for same row" do
166
          click_diff_line
167

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
168 169 170
          is_expected.
            to have_css("tr[id='#{line_code}'] + .js-temp-notes-holder form",
                        count: 1)
171
        end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
172

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
173
        it 'should be removed when canceled' do
Douwe Maan's avatar
Douwe Maan committed
174
          page.within(".diff-file form[id$='#{line_code}-true']") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
175
            find('.js-close-discussion-note-form').trigger('click')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
176 177
          end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
178
          is_expected.to have_no_css('.js-temp-notes-holder')
179 180 181 182
        end
      end
    end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
183
    describe 'with muliple note forms' do
184
      before do
185 186
        click_diff_line
        click_diff_line(line_code_2)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
187 188
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
189
      it { is_expected.to have_css('.js-temp-notes-holder', count: 2) }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
190

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
191
      describe 'previewing them separately' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
192 193
        before do
          # add two separate texts and trigger previews on both
194
          page.within("tr[id='#{line_code}'] + .js-temp-notes-holder") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
195
            fill_in 'note[note]', with: 'One comment on line 7'
196
            find('.js-md-preview-button').click
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
197
          end
198
          page.within("tr[id='#{line_code_2}'] + .js-temp-notes-holder") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
199
            fill_in 'note[note]', with: 'Another comment on line 10'
200
            find('.js-md-preview-button').click
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
201
          end
202 203 204
        end
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
205
      describe 'posting a note' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
206
        before do
207
          page.within("tr[id='#{line_code_2}'] + .js-temp-notes-holder") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
208
            fill_in 'note[note]', with: 'Another comment on line 10'
209
            click_button('Comment')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
210 211 212 213
          end
        end

        it 'should be added as discussion' do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
214 215 216
          is_expected.to have_content('Another comment on line 10')
          is_expected.to have_css('.notes_holder')
          is_expected.to have_css('.notes_holder .note', count: 1)
Annabel Dunstone's avatar
Annabel Dunstone committed
217
          is_expected.to have_button('Reply...')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
218
        end
219
      end
220 221
    end
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
222 223 224 225 226 227 228 229

  def line_code
    sample_compare.changes.first[:line_code]
  end

  def line_code_2
    sample_compare.changes.last[:line_code]
  end
230

231
  def click_diff_line(data = line_code)
Phil Hughes's avatar
Phil Hughes committed
232
    execute_script("$('button[data-line-code=\"#{data}\"]').click()")
233
  end
234
end