Welcome to mirror list, hosted at ThFree Co, Russian Federation.

pinned_nav_items_spec.rb « nav « features « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: a1137536dd5052ee64a6e6a6d4ae4549f48a9cd4 (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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'Navigation menu item pinning', :js, feature_category: :navigation do
  let_it_be(:user) { create(:user) }

  before do
    sign_in(user)
  end

  describe 'non-pinnable navigation menu' do
    before do
      visit explore_projects_path
    end

    it 'does not show the Pinned section' do
      within '#super-sidebar' do
        expect(page).not_to have_content 'Pinned'
      end
    end

    it 'does not show the buttons to pin items' do
      within '#super-sidebar' do
        expect(page).not_to have_css 'button svg[data-testid="thumbtack-icon"]'
      end
    end
  end

  describe 'pinnable navigation menu' do
    let_it_be(:project) { create(:project) }

    before do
      project.add_member(user, :owner)
      visit project_path(project)
    end

    it 'adds sensible defaults' do
      within '[data-testid="pinned-nav-items"]' do
        expect(page).to have_link 'Issues'
      end
    end

    it 'shows the Pinned section' do
      within '#super-sidebar' do
        expect(page).to have_content 'Pinned'
      end
    end

    it 'allows to pin items' do
      within '#super-sidebar' do
        click_on 'Manage'
        add_pin('Activity')
        add_pin('Members')
      end

      within '[data-testid="pinned-nav-items"]' do
        expect(page).to have_link 'Issues'
        expect(page).to have_link 'Activity'
        expect(page).to have_link 'Members'
      end
    end

    describe 'when all pins are removed' do
      before do
        remove_pin('Issues')
      end

      it 'shows the Pinned section as expanded by default' do
        within '#super-sidebar' do
          expect(page).to have_content 'Your pinned items appear here.'
        end
      end

      it 'maintains the collapsed/expanded state between page loads' do
        within '#super-sidebar' do
          click_on 'Pinned'
          visit project_path(project)
          expect(page).not_to have_content 'Your pinned items appear here.'

          click_on 'Pinned'
          visit project_path(project)
          expect(page).to have_content 'Your pinned items appear here.'
        end
      end
    end

    describe 'pinned items' do
      before do
        within '#super-sidebar' do
          click_on 'Operate'
          add_pin('Terraform states')
          add_pin('Terraform modules')
          wait_for_requests
        end
      end

      it 'can be unpinned from within the pinned section' do
        within '[data-testid="pinned-nav-items"]' do
          remove_pin('Terraform states')
          expect(page).not_to have_content 'Terraform states'
        end
      end

      it 'can be unpinned from within its section' do
        section = find("button", text: 'Operate')

        within(section.sibling('div')) do
          remove_pin('Terraform modules')
        end

        within '[data-testid="pinned-nav-items"]' do
          expect(page).not_to have_content 'Terraform modules'
        end
      end

      it 'can be reordered' do
        within '[data-testid="pinned-nav-items"]' do
          pinned_items = page.find_all('a').map(&:text)
          item2 = page.find('a', text: 'Terraform states')
          item3 = page.find('a', text: 'Terraform modules')
          expect(pinned_items[1..2]).to eq [item2.text, item3.text]
          drag_item(item3, to: item2)

          pinned_items = page.find_all('a').map(&:text)
          expect(pinned_items[1..2]).to eq [item3.text, item2.text]
        end
      end
    end
  end

  describe 'reordering pins with hidden pins from non-available features' do
    let_it_be(:project_with_repo) { create(:project, :repository) }
    let_it_be(:project_without_repo) { create(:project, :repository_disabled) }

    before do
      project_with_repo.add_member(user, :owner)
      project_without_repo.add_member(user, :owner)

      visit project_path(project_with_repo)
      within '#super-sidebar' do
        click_on 'Code'
        add_pin('Commits')
        click_on 'Manage'
        add_pin('Activity')
        add_pin('Members')
      end

      visit project_path(project_without_repo)
      within '[data-testid="pinned-nav-items"]' do
        activity_item = page.find('a', text: 'Activity')
        members_item = page.find('a', text: 'Members')
        drag_item(members_item, to: activity_item)
      end

      visit project_path(project_with_repo)
    end

    it 'keeps pins of non-available features' do
      within '[data-testid="pinned-nav-items"]' do
        pinned_items = page.find_all('a')
          .map(&:text)
          .map { |text| text.split("\n").first } # to drop the counter badge text from "Issues\n0"
        expect(pinned_items).to eq ["Issues", "Merge requests", "Commits", "Members", "Activity"]
      end
    end
  end

  private

  def add_pin(nav_item_title)
    nav_item = find("[data-testid=\"nav-item\"]", text: nav_item_title)
    scroll_to(nav_item)
    nav_item.hover
    pin_button = nav_item.find("[data-testid=\"nav-item-pin\"]")
    pin_button.click
    wait_for_requests
  end

  def remove_pin(nav_item_title)
    nav_item = find("[data-testid=\"nav-item\"]", text: nav_item_title)
    scroll_to(nav_item)
    nav_item.hover
    unpin_button = nav_item.find("[data-testid=\"nav-item-unpin\"]")
    unpin_button.click
    wait_for_requests
  end

  def drag_item(item, to:)
    item.hover
    drag_handle = item.find('[data-testid="grip-icon"]')

    # Reduce delay to make it less likely for draggables to
    # change position during drag operation, which reduces
    # flakiness.
    drag_handle.drag_to(to, delay: 0.01)
    wait_for_requests
  end
end