summaryrefslogtreecommitdiff
path: root/spec/support/shared_examples/features/sidebar/sidebar_labels_shared_examples.rb
blob: a332fdec963daad328b0976754483ca09d530b8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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
124
125
126
127
128
129
130
# frozen_string_literal: true

RSpec.shared_examples 'labels sidebar widget' do
  context 'editing labels' do
    let_it_be(:development) { create(:group_label, group: group, name: 'Development') }
    let_it_be(:stretch)     { create(:label, project: project, name: 'Stretch') }
    let_it_be(:xss_label) { create(:label, project: project, title: '<script>alert("xss");</script>') }

    let(:labels_widget) { find('[data-testid="sidebar-labels"]') }

    before do
      page.within(labels_widget) do
        click_on 'Edit'
      end

      wait_for_all_requests
    end

    it 'shows labels list in the dropdown' do
      expect(labels_widget.find('.gl-dropdown-contents')).to have_selector('li.gl-dropdown-item', count: 4)
    end

    it 'adds a label' do
      within(labels_widget) do
        adds_label(stretch)

        page.within('[data-testid="value-wrapper"]') do
          expect(page).to have_content(stretch.name)
        end
      end
    end

    it 'removes a label' do
      within(labels_widget) do
        adds_label(stretch)
        page.within('[data-testid="value-wrapper"]') do
          expect(page).to have_content(stretch.name)
        end

        click_on 'Remove label'

        wait_for_requests

        page.within('[data-testid="value-wrapper"]') do
          expect(page).not_to have_content(stretch.name)
        end
      end
    end

    it 'adds first label by pressing enter when search' do
      within(labels_widget) do
        page.within('[data-testid="value-wrapper"]') do
          expect(page).not_to have_content(development.name)
        end

        fill_in 'Search', with: 'Devel'
        expect(page).to have_css('.labels-fetch-loading')
        wait_for_all_requests

        expect(page).to have_css('[data-testid="dropdown-content"] .gl-dropdown-item')
        expect(page.all(:css, '[data-testid="dropdown-content"] .gl-dropdown-item').length).to eq(1)

        find_field('Search').native.send_keys(:enter)
        click_button 'Close'
        wait_for_requests

        page.within('[data-testid="value-wrapper"]') do
          expect(page).to have_content(development.name)
        end
      end
    end

    it 'escapes XSS when viewing issuable labels' do
      page.within(labels_widget) do
        expect(page).to have_content '<script>alert("xss");</script>'
      end
    end

    it 'shows option to create a label' do
      page.within(labels_widget) do
        expect(page).to have_content 'Create'
      end
    end

    context 'creating a label', :js do
      before do
        page.within(labels_widget) do
          page.find('[data-testid="create-label-button"]').click
        end
      end

      it 'shows dropdown switches to "create label" section' do
        page.within(labels_widget) do
          expect(page.find('[data-testid="dropdown-header"]')).to have_content 'Create'
        end
      end

      it 'creates new label', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/391240' do
        page.within(labels_widget) do
          fill_in 'Name new label', with: 'wontfix'
          page.find('.suggest-colors a', match: :first).click
          page.find('button', text: 'Create').click
          wait_for_requests

          expect(page).to have_content 'wontfix'
        end
      end

      it 'shows error message if label title is taken' do
        page.within(labels_widget) do
          fill_in 'Name new label', with: development.title
          page.find('.suggest-colors a', match: :first).click
          page.find('button', text: 'Create').click
          wait_for_requests

          page.within('.dropdown-input') do
            expect(page.find('.gl-alert')).to have_content 'Title'
          end
        end
      end
    end
  end

  def adds_label(label)
    click_button label.name
    click_button 'Close'

    wait_for_requests
  end
end