discussion_comments_shared_example.rb 9.6 KB
Newer Older
L
Luke "Jared" Bennett 已提交
1 2 3 4 5 6 7
shared_examples 'discussion comments' do |resource_name|
  let(:form_selector) { '.js-main-target-form' }
  let(:dropdown_selector) { "#{form_selector} .comment-type-dropdown" }
  let(:toggle_selector) { "#{dropdown_selector} .dropdown-toggle" }
  let(:menu_selector) { "#{dropdown_selector} .dropdown-menu" }
  let(:submit_selector) { "#{form_selector} .js-comment-submit-button" }
  let(:close_selector) { "#{form_selector} .btn-comment-and-close" }
L
Luke "Jared" Bennett 已提交
8
  let(:comments_selector) { '.timeline > .note.timeline-entry' }
L
Luke "Jared" Bennett 已提交
9

10
  it 'clicking "Comment" will post a comment' do
L
Luke "Jared" Bennett 已提交
11 12
    expect(page).to have_selector toggle_selector

13 14 15 16
    find("#{form_selector} .note-textarea").send_keys('a')

    find(submit_selector).click

17 18
    wait_for_requests

L
Luke "Jared" Bennett 已提交
19 20
    find(comments_selector, match: :first)
    new_comment = all(comments_selector).last
21 22 23 24 25

    expect(new_comment).to have_content 'a'
    expect(new_comment).not_to have_selector '.discussion'
  end

26
  if resource_name == 'issue'
L
Luke "Jared" Bennett 已提交
27
    it "clicking 'Comment & close #{resource_name}' will post a comment and close the #{resource_name}" do
28 29 30
      find("#{form_selector} .note-textarea").send_keys('a')

      find(close_selector).click
31
      wait_for_requests
32

L
Luke "Jared" Bennett 已提交
33 34 35
      find(comments_selector, match: :first)
      find("#{comments_selector}.system-note")
      entries = all(comments_selector)
36 37 38 39 40 41 42 43
      close_note = entries.last
      new_comment = entries[-2]

      expect(close_note).to have_content 'closed'
      expect(new_comment).not_to have_selector '.discussion'
    end
  end

L
Luke "Jared" Bennett 已提交
44 45 46 47 48 49 50
  describe 'when the toggle is clicked' do
    before do
      find("#{form_selector} .note-textarea").send_keys('a')

      find(toggle_selector).click
    end

51
    it 'has a "Comment" item (selected by default) and "Start discussion" item' do
L
Luke "Jared" Bennett 已提交
52 53
      expect(page).to have_selector menu_selector

54
      find("#{menu_selector} li", match: :first)
L
Luke "Jared" Bennett 已提交
55 56 57
      items = all("#{menu_selector} li")

      expect(items.first).to have_content 'Comment'
58
      expect(items.first).to have_content "Add a general comment to this #{resource_name}."
L
Luke "Jared" Bennett 已提交
59
      expect(items.first).to have_selector '.fa-check'
60
      expect(items.first['class']).to match 'droplab-item-selected'
L
Luke "Jared" Bennett 已提交
61 62

      expect(items.last).to have_content 'Start discussion'
63
      expect(items.last).to have_content "Discuss a specific suggestion or question#{' that needs to be resolved' if resource_name == 'merge request'}."
L
Luke "Jared" Bennett 已提交
64
      expect(items.last).not_to have_selector '.fa-check'
65
      expect(items.last['class']).not_to match 'droplab-item-selected'
L
Luke "Jared" Bennett 已提交
66 67
    end

68
    it 'closes the menu when clicking the toggle or body' do
L
Luke "Jared" Bennett 已提交
69 70 71 72
      find(toggle_selector).click

      expect(page).not_to have_selector menu_selector

73
      find(toggle_selector).click
A
Annabel Dunstone Gray 已提交
74
      execute_script("document.querySelector('body').click()")
L
Luke "Jared" Bennett 已提交
75 76 77 78

      expect(page).not_to have_selector menu_selector
    end

79
    it 'clicking the ul padding or divider should not change the text' do
80
      execute_script("document.querySelector('#{menu_selector}').click()")
L
Luke "Jared" Bennett 已提交
81

82 83
      # on issues page, the menu closes when clicking anywhere, on other pages it will
      # remain open if clicking divider or menu padding, but should not change button action
J
Jan Provaznik 已提交
84 85 86 87
      #
      # if dropdown menu is not toggled (and also not present),
      # it's "issue-type" dropdown
      if first(menu_selector).nil?
88
        expect(find(dropdown_selector)).to have_content 'Comment'
89

90
        find(toggle_selector).click
91
        execute_script("document.querySelector('#{menu_selector} .divider').click()")
92
      else
93
        execute_script("document.querySelector('#{menu_selector}').click()")
94

95 96
        expect(page).to have_selector menu_selector
        expect(find(dropdown_selector)).to have_content 'Comment'
97

98
        execute_script("document.querySelector('#{menu_selector} .divider').click()")
99

100
        expect(page).to have_selector menu_selector
101
      end
102

103
      expect(find(dropdown_selector)).to have_content 'Comment'
L
Luke "Jared" Bennett 已提交
104 105
    end

L
Luke "Jared" Bennett 已提交
106 107
    describe 'when selecting "Start discussion"' do
      before do
108
        find("#{menu_selector} li", match: :first)
L
Luke "Jared" Bennett 已提交
109
        all("#{menu_selector} li").last.click
L
Luke "Jared" Bennett 已提交
110 111
      end

112
      it 'updates the submit button text and closes the dropdown' do
J
Jan Provaznik 已提交
113 114
        button = find(submit_selector)

115
        # on issues page, the submit input is a <button>, on other pages it is <input>
J
Jan Provaznik 已提交
116
        if button.tag_name == 'button'
117 118 119
          expect(find(submit_selector)).to have_content 'Start discussion'
        else
          expect(find(submit_selector).value).to eq 'Start discussion'
120
        end
121

122
        expect(page).not_to have_selector menu_selector
L
Luke "Jared" Bennett 已提交
123 124 125 126 127 128
      end

      if resource_name =~ /(issue|merge request)/
        it 'updates the close button text' do
          expect(find(close_selector)).to have_content "Start discussion & close #{resource_name}"
        end
L
Luke "Jared" Bennett 已提交
129 130 131 132 133 134

        it 'typing does not change the close button text' do
          find("#{form_selector} .note-textarea").send_keys('b')

          expect(find(close_selector)).to have_content "Start discussion & close #{resource_name}"
        end
L
Luke "Jared" Bennett 已提交
135 136
      end

137 138 139
      describe 'creating a discussion' do
        before do
          find(submit_selector).click
J
Jan Provaznik 已提交
140 141
          wait_for_requests

142 143
          find(comments_selector, match: :first)
        end
L
Luke "Jared" Bennett 已提交
144

145 146 147 148 149 150
        it 'clicking "Start discussion" will post a discussion' do
          new_comment = all(comments_selector).last

          expect(new_comment).to have_content 'a'
          expect(new_comment).to have_selector '.discussion'
        end
L
Luke "Jared" Bennett 已提交
151

152
        if resource_name == 'merge request'
153 154
          let(:note_id) { find("#{comments_selector} .note", match: :first)['data-note-id'] }

155 156
          it 'shows resolved discussion when toggled' do
            click_button "Resolve discussion"
L
Luke "Jared" Bennett 已提交
157

158
            expect(page).to have_selector(".note-row-#{note_id}", visible: true)
L
Luke "Jared" Bennett 已提交
159

160 161 162
            refresh
            click_button "Toggle discussion"

163
            expect(page).to have_selector(".note-row-#{note_id}", visible: true)
164 165
          end
        end
L
Luke "Jared" Bennett 已提交
166 167
      end

168
      if resource_name == 'issue'
L
Luke "Jared" Bennett 已提交
169
        it "clicking 'Start discussion & close #{resource_name}' will post a discussion and close the #{resource_name}" do
L
Luke "Jared" Bennett 已提交
170 171
          find(close_selector).click

L
Luke "Jared" Bennett 已提交
172 173 174
          find(comments_selector, match: :first)
          find("#{comments_selector}.system-note")
          entries = all(comments_selector)
L
Luke "Jared" Bennett 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188
          close_note = entries.last
          new_discussion = entries[-2]

          expect(close_note).to have_content 'closed'
          expect(new_discussion).to have_selector '.discussion'
        end
      end

      describe 'when opening the menu' do
        before do
          find(toggle_selector).click
        end

        it 'should have "Start discussion" selected' do
189
          find("#{menu_selector} li", match: :first)
L
Luke "Jared" Bennett 已提交
190 191 192 193
          items = all("#{menu_selector} li")

          expect(items.first).to have_content 'Comment'
          expect(items.first).not_to have_selector '.fa-check'
L
Luke "Jared" Bennett 已提交
194
          expect(items.first['class']).not_to match 'droplab-item-selected'
L
Luke "Jared" Bennett 已提交
195 196 197

          expect(items.last).to have_content 'Start discussion'
          expect(items.last).to have_selector '.fa-check'
L
Luke "Jared" Bennett 已提交
198
          expect(items.last['class']).to match 'droplab-item-selected'
L
Luke "Jared" Bennett 已提交
199 200 201 202
        end

        describe 'when selecting "Comment"' do
          before do
L
Luke "Jared" Bennett 已提交
203
            find("#{menu_selector} li", match: :first).click
L
Luke "Jared" Bennett 已提交
204 205
          end

206
          it 'updates the submit button text and closes the dropdown' do
J
Jan Provaznik 已提交
207 208
            button = find(submit_selector)

209
            # on issues page, the submit input is a <button>, on other pages it is <input>
J
Jan Provaznik 已提交
210 211
            if button.tag_name == 'button'
              expect(button).to have_content 'Comment'
212
            else
J
Jan Provaznik 已提交
213
              expect(button.value).to eq 'Comment'
214
            end
215

216
            expect(page).not_to have_selector menu_selector
L
Luke "Jared" Bennett 已提交
217 218 219 220 221 222
          end

          if resource_name =~ /(issue|merge request)/
            it 'updates the close button text' do
              expect(find(close_selector)).to have_content "Comment & close #{resource_name}"
            end
L
Luke "Jared" Bennett 已提交
223 224 225 226 227 228

            it 'typing does not change the close button text' do
              find("#{form_selector} .note-textarea").send_keys('b')

              expect(find(close_selector)).to have_content "Comment & close #{resource_name}"
            end
L
Luke "Jared" Bennett 已提交
229 230 231 232 233
          end

          it 'should have "Comment" selected when opening the menu' do
            find(toggle_selector).click

234
            find("#{menu_selector} li", match: :first)
L
Luke "Jared" Bennett 已提交
235 236 237 238
            items = all("#{menu_selector} li")

            expect(items.first).to have_content 'Comment'
            expect(items.first).to have_selector '.fa-check'
L
Luke "Jared" Bennett 已提交
239
            expect(items.first['class']).to match 'droplab-item-selected'
L
Luke "Jared" Bennett 已提交
240 241 242

            expect(items.last).to have_content 'Start discussion'
            expect(items.last).not_to have_selector '.fa-check'
L
Luke "Jared" Bennett 已提交
243
            expect(items.last['class']).not_to match 'droplab-item-selected'
L
Luke "Jared" Bennett 已提交
244 245 246 247 248
          end
        end
      end
    end
  end
249 250 251

  if resource_name =~ /(issue|merge request)/
    describe "on a closed #{resource_name}" do
L
Luke "Jared" Bennett 已提交
252
      before do
253
        find("#{form_selector} .js-note-target-close").click
254
        wait_for_requests
255 256

        find("#{form_selector} .note-textarea").send_keys('a')
L
Luke "Jared" Bennett 已提交
257 258
      end

259 260
      it "should show a 'Comment & reopen #{resource_name}' button" do
        expect(find("#{form_selector} .js-note-target-reopen")).to have_content "Comment & reopen #{resource_name}"
L
Luke "Jared" Bennett 已提交
261 262
      end

263
      it "should show a 'Start discussion & reopen #{resource_name}' button when 'Start discussion' is selected" do
264
        find(toggle_selector).click
265

L
Luke "Jared" Bennett 已提交
266 267 268
        find("#{menu_selector} li", match: :first)
        all("#{menu_selector} li").last.click

269
        expect(find("#{form_selector} .js-note-target-reopen")).to have_content "Start discussion & reopen #{resource_name}"
L
Luke "Jared" Bennett 已提交
270
      end
271 272
    end
  end
L
Luke "Jared" Bennett 已提交
273
end