issue_sidebar_spec.rb 9.59 KB
Newer Older
1 2
# frozen_string_literal: true

3
require 'spec_helper'
4

5
RSpec.describe 'Issue Sidebar' do
6
  include MobileHelpers
7

8
  let(:group) { create(:group, :nested) }
9
  let(:project) { create(:project, :public, namespace: group) }
10
  let!(:user) { create(:user) }
11
  let!(:label) { create(:label, project: project, title: 'bug') }
12
  let(:issue) { create(:labeled_issue, project: project, labels: [label]) }
13
  let!(:xss_label) { create(:label, project: project, title: '<script>alert("xss");</script>') }
14 15

  before do
16
    sign_in(user)
17 18
  end

19
  context 'assignee', :js do
20 21 22
    let(:user2) { create(:user) }
    let(:issue2) { create(:issue, project: project, author: user2) }

23 24 25 26
    context 'when invite_members_version_a experiment is enabled' do
      before do
        stub_experiment_for_user(invite_members_version_a: true)
      end
27

28 29 30 31
      context 'when user can not see invite members' do
        before do
          project.add_developer(user)
          visit_issue(project, issue2)
32

33 34 35 36
          find('.block.assignee .edit-link').click

          wait_for_requests
        end
37

38 39 40 41 42
        it 'does not see link to invite members' do
          page.within '.dropdown-menu-user' do
            expect(page).not_to have_link('Invite Members')
          end
        end
43 44
      end

45 46 47 48
      context 'when user can see invite members' do
        before do
          project.add_maintainer(user)
          visit_issue(project, issue2)
49

50
          find('.block.assignee .edit-link').click
51

52 53 54 55 56 57
          wait_for_requests
        end

        it 'sees link to invite members' do
          page.within '.dropdown-menu-user' do
            expect(page).to have_link('Invite Members', href: project_project_members_path(project))
58 59
            expect(page).to have_selector('[data-track-event="click_invite_members"]')
            expect(page).to have_selector("[data-track-label='edit_assignee']")
60 61
          end
        end
62 63
      end
    end
64

65 66 67 68 69
    context 'when invite_members_version_a experiment is not enabled' do
      context 'when user is a developer' do
        before do
          project.add_developer(user)
          visit_issue(project, issue2)
70

71
          find('.block.assignee .edit-link').click
72

73 74
          wait_for_requests
        end
75

76 77 78 79 80
        it 'shows author in assignee dropdown' do
          page.within '.dropdown-menu-user' do
            expect(page).to have_content(user2.name)
          end
        end
81

82 83 84 85 86 87 88 89 90 91
        it 'shows author when filtering assignee dropdown' do
          page.within '.dropdown-menu-user' do
            find('.dropdown-input-field').native.send_keys user2.name
            sleep 1 # Required to wait for end of input delay

            wait_for_requests

            expect(page).to have_content(user2.name)
          end
        end
Clement Ho's avatar
Clement Ho committed
92

93 94
        it 'assigns yourself' do
          find('.block.assignee .dropdown-menu-toggle').click
Clement Ho's avatar
Clement Ho committed
95

96
          click_button 'assign yourself'
Clement Ho's avatar
Clement Ho committed
97

98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
          wait_for_requests

          find('.block.assignee .edit-link').click

          page.within '.dropdown-menu-user' do
            expect(page.find('.dropdown-header')).to be_visible
            expect(page.find('.dropdown-menu-user-link.is-active')).to have_content(user.name)
          end
        end

        it 'keeps your filtered term after filtering and dismissing the dropdown' do
          find('.dropdown-input-field').native.send_keys user2.name

          wait_for_requests

          page.within '.dropdown-menu-user' do
            expect(page).not_to have_content 'Unassigned'
            click_link user2.name
          end

          find('.js-right-sidebar').click
          find('.block.assignee .edit-link').click

          expect(page.all('.dropdown-menu-user li').length).to eq(1)
          expect(find('.dropdown-input-field').value).to eq(user2.name)
        end
Clement Ho's avatar
Clement Ho committed
124 125
      end

126 127 128 129 130 131
      context 'when user is a maintainer' do
        before do
          project.add_maintainer(user)
          visit_issue(project, issue2)

          find('.block.assignee .edit-link').click
Clement Ho's avatar
Clement Ho committed
132

133 134 135 136 137 138 139 140 141
          wait_for_requests
        end

        it 'shows author in assignee dropdown and no invite link' do
          page.within '.dropdown-menu-user' do
            expect(page).not_to have_link('Invite Members')
          end
        end
      end
Clement Ho's avatar
Clement Ho committed
142
    end
143 144
  end

145 146
  context 'as a allowed user' do
    before do
147
      project.add_developer(user)
148 149 150
      visit_issue(project, issue)
    end

151
    context 'sidebar', :js do
152 153 154 155 156
      it 'changes size when the screen size is smaller' do
        sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
        # Resize the window
        resize_screen_sm
        # Make sure the sidebar is collapsed
157
        find(sidebar_selector)
158 159
        expect(page).to have_css(sidebar_selector)
        # Once is collapsed let's open the sidebard and reload
160
        open_issue_sidebar
161
        refresh
162
        find(sidebar_selector)
163 164 165
        expect(page).to have_css(sidebar_selector)
        # Restore the window size as it was including the sidebar
        restore_window_size
166
        open_issue_sidebar
167
      end
168 169 170

      it 'escapes XSS when viewing issue labels' do
        page.within('.block.labels') do
171
          click_on 'Edit'
172 173 174 175

          expect(page).to have_content '<script>alert("xss");</script>'
        end
      end
176 177
    end

178
    context 'editing issue labels', :js do
179
      before do
Lin Jen-Shin's avatar
Lin Jen-Shin committed
180
        issue.update(labels: [label])
181
        page.within('.block.labels') do
182
          click_on 'Edit'
183 184
        end
      end
185

186 187 188 189 190 191
      it 'shows the current set of labels' do
        page.within('.issuable-show-labels') do
          expect(page).to have_content label.title
        end
      end

192
      it 'shows option to create a project label' do
193
        page.within('.block.labels') do
194
          expect(page).to have_content 'Create project'
195 196 197
        end
      end

Rémy Coutable's avatar
Rémy Coutable committed
198
      context 'creating a project label', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/27992' do
199 200
        before do
          page.within('.block.labels') do
201
            click_link 'Create project'
202 203
          end
        end
204

205 206
        it 'shows dropdown switches to "create label" section' do
          page.within('.block.labels') do
207
            expect(page).to have_content 'Create project label'
208
          end
209 210
        end

211 212 213
        it 'adds new label' do
          page.within('.block.labels') do
            fill_in 'new_label_name', with: 'wontfix'
214 215
            page.find('.suggest-colors a', match: :first).click
            page.find('button', text: 'Create').click
216 217 218 219 220 221

            page.within('.dropdown-page-one') do
              expect(page).to have_content 'wontfix'
            end
          end
        end
222

223 224 225
        it 'shows error message if label title is taken' do
          page.within('.block.labels') do
            fill_in 'new_label_name', with: label.title
226 227
            page.find('.suggest-colors a', match: :first).click
            page.find('button', text: 'Create').click
228

229 230 231
            page.within('.dropdown-page-two') do
              expect(page).to have_content 'Title has already been taken'
            end
232 233 234 235
          end
        end
      end
    end
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279

    context 'interacting with collapsed sidebar', :js do
      collapsed_sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
      expanded_sidebar_selector = 'aside.right-sidebar.right-sidebar-expanded'
      confidentiality_sidebar_block = '.block.confidentiality'
      lock_sidebar_block = '.block.lock'
      collapsed_sidebar_block_icon = '.sidebar-collapsed-icon'

      before do
        resize_screen_sm
      end

      it 'confidentiality block expands then collapses sidebar' do
        expect(page).to have_css(collapsed_sidebar_selector)

        page.within(confidentiality_sidebar_block) do
          find(collapsed_sidebar_block_icon).click
        end

        expect(page).to have_css(expanded_sidebar_selector)

        page.within(confidentiality_sidebar_block) do
          page.find('button', text: 'Cancel').click
        end

        expect(page).to have_css(collapsed_sidebar_selector)
      end

      it 'lock block expands then collapses sidebar' do
        expect(page).to have_css(collapsed_sidebar_selector)

        page.within(lock_sidebar_block) do
          find(collapsed_sidebar_block_icon).click
        end

        expect(page).to have_css(expanded_sidebar_selector)

        page.within(lock_sidebar_block) do
          page.find('button', text: 'Cancel').click
        end

        expect(page).to have_css(collapsed_sidebar_selector)
      end
    end
280 281 282 283
  end

  context 'as a guest' do
    before do
284
      project.add_guest(user)
285 286 287 288
      visit_issue(project, issue)
    end

    it 'does not have a option to edit labels' do
289
      expect(page).not_to have_selector('.block.labels .js-sidebar-dropdown-toggle')
290
    end
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313

    context 'interacting with collapsed sidebar', :js do
      collapsed_sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
      expanded_sidebar_selector = 'aside.right-sidebar.right-sidebar-expanded'
      lock_sidebar_block = '.block.lock'
      lock_button = '.block.lock .btn-close'
      collapsed_sidebar_block_icon = '.sidebar-collapsed-icon'

      before do
        resize_screen_sm
      end

      it 'expands then does not show the lock dialog form' do
        expect(page).to have_css(collapsed_sidebar_selector)

        page.within(lock_sidebar_block) do
          find(collapsed_sidebar_block_icon).click
        end

        expect(page).to have_css(expanded_sidebar_selector)
        expect(page).not_to have_selector(lock_button)
      end
    end
314 315 316
  end

  def visit_issue(project, issue)
317
    visit project_issue_path(project, issue)
318
  end
319 320

  def open_issue_sidebar
321
    find('aside.right-sidebar.right-sidebar-collapsed .js-sidebar-toggle').click
322
    find('aside.right-sidebar.right-sidebar-expanded')
323
  end
324
end