notes_on_merge_requests_spec.rb 6.85 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

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

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
13 14
    before do
      login_as :admin
Vinnie Okada's avatar
Vinnie Okada committed
15
      visit namespace_project_merge_request_path(project.namespace, project, merge_request)
16 17
    end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
18
    subject { page }
19

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

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
30
      describe 'with text' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
31
        before do
32
          page.within('.js-main-target-form') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
33
            fill_in 'note[note]', with: 'This is awesome'
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
34 35 36 37
          end
        end

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

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

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

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
67 68
    describe 'when editing a note', js: true do
      describe 'editing the note' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
69 70 71
        before do
          find('.note').hover
          find(".js-note-edit").click
Jack Weeden's avatar
Jack Weeden committed
72 73
        end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
74
        it 'should show the note edit form and hide the note body' do
75
          page.within("#note_#{note.id}") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
76 77
            expect(find('.current-note-edit-form', visible: true)).to be_visible
            expect(find('.note-edit-form', visible: true)).to be_visible
78
            expect(find(:css, '.note-body > .note-text', visible: false)).not_to be_visible
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
79
          end
Jack Weeden's avatar
Jack Weeden committed
80 81
        end

82
        # TODO: fix after 7.7 release
83 84 85 86 87 88 89
        # 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
90

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
91
        it 'appends the edited at time to the note' do
92
          page.within('.current-note-edit-form') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
93 94
            fill_in 'note[note]', with: 'Some new content'
            find('.btn-save').click
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
95 96
          end

97
          page.within("#note_#{note.id}") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
98 99 100
            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
101
          end
Jack Weeden's avatar
Jack Weeden committed
102 103 104
        end
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
105
      describe 'deleting an attachment' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
106 107
        before do
          find('.note').hover
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
108
          find('.js-note-edit').click
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
109
        end
Jack Weeden's avatar
Jack Weeden committed
110

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
111
        it 'shows the delete link' do
112
          page.within('.note-attachment') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
113
            is_expected.to have_css('.js-note-attachment-delete')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
114
          end
Jack Weeden's avatar
Jack Weeden committed
115 116
        end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
117 118 119 120 121
        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')
          expect(find('.current-note-edit-form', visible: false)).
            not_to be_visible
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
122
        end
Jack Weeden's avatar
Jack Weeden committed
123 124 125
      end
    end
  end
126

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
127
  describe 'On a merge request diff', js: true, feature: true do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
128 129
    let(:merge_request) { create(:merge_request) }
    let(:project) { merge_request.source_project }
130 131

    before do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
132
      login_as :admin
Vinnie Okada's avatar
Vinnie Okada committed
133
      visit diffs_namespace_project_merge_request_path(project.namespace, project, merge_request)
134 135
    end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
136
    subject { page }
137

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
138
    describe 'when adding a note' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
139
      before do
140
        click_diff_line
141 142
      end

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

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
146
        it 'has .new_note css class' do
147
          page.within('.js-temp-notes-holder') do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
148 149 150
            expect(subject).to have_css('.new_note')
          end
        end
151 152
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
153
      describe 'the note form' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
154
        it "shouldn't add a second form for same row" do
155
          click_diff_line
156

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
157 158 159
          is_expected.
            to have_css("tr[id='#{line_code}'] + .js-temp-notes-holder form",
                        count: 1)
160
        end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
161

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
162
        it 'should be removed when canceled' do
163
          page.within(".diff-file form[rel$='#{line_code}']") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
164
            find('.js-close-discussion-note-form').trigger('click')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
165 166
          end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
167
          is_expected.to have_no_css('.js-temp-notes-holder')
168 169 170 171
        end
      end
    end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
172
    describe 'with muliple note forms' do
173
      before do
174 175
        click_diff_line
        click_diff_line(line_code_2)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
176 177
      end

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

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
180
      describe 'previewing them separately' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
181 182
        before do
          # add two separate texts and trigger previews on both
183
          page.within("tr[id='#{line_code}'] + .js-temp-notes-holder") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
184
            fill_in 'note[note]', with: 'One comment on line 7'
185
            find('.js-md-preview-button').click
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
186
          end
187
          page.within("tr[id='#{line_code_2}'] + .js-temp-notes-holder") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
188
            fill_in 'note[note]', with: 'Another comment on line 10'
189
            find('.js-md-preview-button').click
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
190
          end
191 192 193
        end
      end

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
194
      describe 'posting a note' do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
195
        before do
196
          page.within("tr[id='#{line_code_2}'] + .js-temp-notes-holder") do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
197 198
            fill_in 'note[note]', with: 'Another comment on line 10'
            click_button('Add Comment')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
199 200 201 202
          end
        end

        it 'should be added as discussion' do
Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
203 204 205
          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)
206
          is_expected.to have_button('Reply')
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
207
        end
208
      end
209 210
    end
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
211 212 213 214 215 216 217 218

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

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

220 221
  def click_diff_line(data = line_code)
    page.find(%Q{button[data-line-code="#{data}"]}, visible: false).click
222
  end
223
end