summaryrefslogtreecommitdiff
path: root/spec/features/projects/labels/update_prioritization_spec.rb
blob: f32b155790fcea0a8b4562bd47021795cedd253d (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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
require 'spec_helper'

describe 'Prioritize labels' do
  include DragTo

  let(:user)     { create(:user) }
  let(:group)    { create(:group) }
  let(:project)  { create(:project, :public, namespace: group) }
  let!(:bug)     { create(:label, project: project, title: 'bug') }
  let!(:wontfix) { create(:label, project: project, title: 'wontfix') }
  let!(:feature) { create(:group_label, group: group, title: 'feature') }

  context 'when user belongs to project team' do
    before do
      project.add_developer(user)

      sign_in user
    end

    it 'user can prioritize a group label', :js do
      visit project_labels_path(project)

      expect(page).to have_content('Star labels to start sorting by priority')

      page.within('.other-labels') do
        all('.js-toggle-priority')[1].click
        wait_for_requests
        expect(page).not_to have_content('feature')
      end

      page.within('.prioritized-labels') do
        expect(page).not_to have_content('Star labels to start sorting by priority')
        expect(page).to have_content('feature')
      end
    end

    it 'user can unprioritize a group label', :js do
      create(:label_priority, project: project, label: feature, priority: 1)

      visit project_labels_path(project)

      page.within('.prioritized-labels') do
        expect(page).to have_content('feature')

        first('.js-toggle-priority').click
        wait_for_requests
        expect(page).not_to have_content('bug')
      end

      page.within('.other-labels') do
        expect(page).to have_content('feature')
      end
    end

    it 'user can prioritize a project label', :js do
      visit project_labels_path(project)

      expect(page).to have_content('Star labels to start sorting by priority')

      page.within('.other-labels') do
        first('.js-toggle-priority').click
        wait_for_requests
        expect(page).not_to have_content('bug')
      end

      page.within('.prioritized-labels') do
        expect(page).not_to have_content('Star labels to start sorting by priority')
        expect(page).to have_content('bug')
      end
    end

    it 'user can unprioritize a project label', :js do
      create(:label_priority, project: project, label: bug, priority: 1)

      visit project_labels_path(project)

      page.within('.prioritized-labels') do
        expect(page).to have_content('bug')

        first('.js-toggle-priority').click
        wait_for_requests
        expect(page).not_to have_content('bug')
      end

      page.within('.other-labels') do
        expect(page).to have_content('bug')
        expect(page).to have_content('wontfix')
      end
    end

    it 'user can sort prioritized labels and persist across reloads', :js do
      create(:label_priority, project: project, label: bug, priority: 1)
      create(:label_priority, project: project, label: feature, priority: 2)

      visit project_labels_path(project)

      expect(page).to have_content 'bug'
      expect(page).to have_content 'feature'
      expect(page).to have_content 'wontfix'

      # Sort labels
      drag_to(selector: '.label-list-item', from_index: 1, to_index: 2)

      page.within('.prioritized-labels') do
        expect(first('.label-list-item')).to have_content('feature')
        expect(page.all('.label-list-item').last).to have_content('bug')
      end

      refresh
      wait_for_requests

      page.within('.prioritized-labels') do
        expect(first('.label-list-item')).to have_content('feature')
        expect(page.all('.label-list-item').last).to have_content('bug')
      end
    end

    it 'user can see a primary button when there are only prioritized labels', :js do
      visit project_labels_path(project)

      page.within('.other-labels') do
        all('.js-toggle-priority').each do |el|
          el.click
        end
        wait_for_requests
      end

      page.within('.top-area') do
        expect(page).to have_link('New label')
      end
    end

    it 'shows a help message about prioritized labels' do
      visit project_labels_path(project)

      expect(page).to have_content 'Star a label'
    end
  end

  context 'as a guest' do
    before do
      create(:label_priority, project: project, label: bug, priority: 1)
      create(:label_priority, project: project, label: feature, priority: 2)

      guest = create(:user)

      sign_in guest

      visit project_labels_path(project)
    end

    it 'cannot prioritize labels' do
      expect(page).to have_content 'bug'
      expect(page).to have_content 'wontfix'
      expect(page).to have_content 'feature'
      expect(page).not_to have_content 'Star a label'
    end

    it 'cannot sort prioritized labels', :js do
      drag_to(selector: '.prioritized-labels .label-list-item', from_index: 1, to_index: 2)

      page.within('.prioritized-labels') do
        expect(first('.label-list-item')).to have_content('bug')
        expect(page.all('.label-list-item').last).to have_content('feature')
      end
    end
  end

  context 'as a non signed in user' do
    it 'cannot prioritize labels' do
      visit project_labels_path(project)

      expect(page).to have_content 'bug'
      expect(page).to have_content 'wontfix'
      expect(page).to have_content 'feature'
      expect(page).not_to have_content 'Star a label'
    end
  end
end