user_filters_projects_spec.rb 7.1 KB
Newer Older
1 2
require 'spec_helper'

3
describe 'Dashboard > User filters projects' do
4
  let(:user) { create(:user) }
5
  let(:project) { create(:project, name: 'Victorialand', namespace: user.namespace, created_at: 2.seconds.ago, updated_at: 2.seconds.ago) }
6
  let(:user2) { create(:user) }
7
  let(:project2) { create(:project, name: 'Treasure', namespace: user2.namespace, created_at: 1.second.ago, updated_at: 1.second.ago) }
8 9

  before do
10
    project.add_maintainer(user)
11

12
    sign_in(user)
13 14
  end

15 16
  describe 'filtering personal projects' do
    before do
E
Ezekiel Kigbo 已提交
17
      stub_feature_flags(project_list_filter_bar: false)
18
      project2.add_developer(user)
19 20 21 22 23

      visit dashboard_projects_path
    end

    it 'filters by projects "Owned by me"' do
24
      click_link 'Owned by me'
25 26 27 28 29 30

      expect(page).to have_css('.is-active', text: 'Owned by me')
      expect(page).to have_content('Victorialand')
      expect(page).not_to have_content('Treasure')
    end
  end
31 32 33

  describe 'filtering starred projects', :js do
    before do
E
Ezekiel Kigbo 已提交
34
      stub_feature_flags(project_list_filter_bar: false)
35 36 37 38 39 40 41 42
      user.toggle_star(project)

      visit dashboard_projects_path
    end

    it 'returns message when starred projects fitler returns no results' do
      fill_in 'project-filter-form-field', with: 'Beta\n'

43
      expect(page).to have_content('This user doesn\'t have any personal projects')
44 45 46
      expect(page).not_to have_content('You don\'t have starred projects yet')
    end
  end
E
Ezekiel Kigbo 已提交
47 48 49 50 51 52 53 54 55

  describe 'without search bar', :js do
    before do
      stub_feature_flags(project_list_filter_bar: false)

      project2.add_developer(user)
      visit dashboard_projects_path
    end

56
    it 'autocompletes searches upon typing', :js do
E
Ezekiel Kigbo 已提交
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
      expect(page).to have_content 'Victorialand'
      expect(page).to have_content 'Treasure'

      fill_in 'project-filter-form-field', with: 'Lord beerus\n'

      expect(page).not_to have_content 'Victorialand'
      expect(page).not_to have_content 'Treasure'
    end
  end

  describe 'with search bar', :js do
    before do
      stub_feature_flags(project_list_filter_bar: true)

      project2.add_developer(user)
      visit dashboard_projects_path
    end

    # TODO: move these helpers somewhere more useful
    def click_sort_direction
      page.find('.filtered-search-block #filtered-search-sorting-dropdown .reverse-sort-btn').click
    end

    def select_dropdown_option(selector, label)
      dropdown = page.find(selector)
      dropdown.click

      dropdown.find('.dropdown-menu a', text: label, match: :first).click
    end

    def expect_to_see_projects(sorted_projects)
      list = page.all('.projects-list .project-name').map(&:text)
      expect(list).to match(sorted_projects)
    end

    describe 'Search' do
93
      it 'executes when the search button is clicked' do
E
Ezekiel Kigbo 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
        expect(page).to have_content 'Victorialand'
        expect(page).to have_content 'Treasure'

        fill_in 'project-filter-form-field', with: 'Lord vegeta\n'
        find('.filtered-search .btn').click

        expect(page).not_to have_content 'Victorialand'
        expect(page).not_to have_content 'Treasure'
      end

      it 'will execute when i press enter' do
        expect(page).to have_content 'Victorialand'
        expect(page).to have_content 'Treasure'

        fill_in 'project-filter-form-field', with: 'Lord frieza\n'
        find('#project-filter-form-field').native.send_keys :enter

        expect(page).not_to have_content 'Victorialand'
        expect(page).not_to have_content 'Treasure'
      end
    end

    describe 'Filter' do
      before do
118 119
        private_project = create(:project, :private, name: 'Private project', namespace: user.namespace)
        internal_project = create(:project, :internal, name: 'Internal project', namespace: user.namespace)
E
Ezekiel Kigbo 已提交
120

121 122
        private_project.add_maintainer(user)
        internal_project.add_maintainer(user)
E
Ezekiel Kigbo 已提交
123 124
      end

125
      it 'filters private projects only' do
E
Ezekiel Kigbo 已提交
126
        select_dropdown_option '#filtered-search-visibility-dropdown', 'Private'
127

E
Ezekiel Kigbo 已提交
128
        expect(current_url).to match(/visibility_level=0/)
129

E
Ezekiel Kigbo 已提交
130
        list = page.all('.projects-list .project-name').map(&:text)
131

132
        expect(list).to contain_exactly("Private project", "Treasure", "Victorialand")
E
Ezekiel Kigbo 已提交
133 134
      end

135
      it 'filters internal projects only' do
E
Ezekiel Kigbo 已提交
136
        select_dropdown_option '#filtered-search-visibility-dropdown', 'Internal'
137

E
Ezekiel Kigbo 已提交
138
        expect(current_url).to match(/visibility_level=10/)
139

E
Ezekiel Kigbo 已提交
140
        list = page.all('.projects-list .project-name').map(&:text)
141

142
        expect(list).to contain_exactly('Internal project')
E
Ezekiel Kigbo 已提交
143 144
      end

145
      it 'filters any project' do
E
Ezekiel Kigbo 已提交
146 147
        select_dropdown_option '#filtered-search-visibility-dropdown', 'Any'
        list = page.all('.projects-list .project-name').map(&:text)
148

149
        expect(list).to contain_exactly("Internal project", "Private project", "Treasure", "Victorialand")
E
Ezekiel Kigbo 已提交
150 151 152 153
      end
    end

    describe 'Sorting' do
154
      let(:desc_sorted_project_names) { %w[Treasure Victorialand] }
E
Ezekiel Kigbo 已提交
155

156
      before do
E
Ezekiel Kigbo 已提交
157 158 159 160 161
        user.toggle_star(project)
        user.toggle_star(project2)
        user2.toggle_star(project2)
      end

162
      it 'has all sorting options', :js do
E
Ezekiel Kigbo 已提交
163
        sorting_dropdown = page.find('.filtered-search-block #filtered-search-sorting-dropdown')
164

E
Ezekiel Kigbo 已提交
165 166 167 168
        expect(sorting_dropdown).to have_css '.reverse-sort-btn'

        sorting_dropdown.click

169
        ['Last updated', 'Created date', 'Name', 'Stars'].each do |label|
E
Ezekiel Kigbo 已提交
170 171 172 173
          expect(sorting_dropdown).to have_content(label)
        end
      end

174
      it 'defaults to "Last updated"', :js do
E
Ezekiel Kigbo 已提交
175 176 177 178 179 180 181
        page.find('.filtered-search-block #filtered-search-sorting-dropdown').click
        active_sorting_option = page.first('.filtered-search-block #filtered-search-sorting-dropdown .is-active')

        expect(active_sorting_option).to have_content 'Last updated'
      end

      context 'Sorting by name' do
182
        it 'sorts the project list' do
E
Ezekiel Kigbo 已提交
183 184
          select_dropdown_option '#filtered-search-sorting-dropdown', 'Name'

185
          expect_to_see_projects(desc_sorted_project_names)
E
Ezekiel Kigbo 已提交
186

187
          click_sort_direction
E
Ezekiel Kigbo 已提交
188

189
          expect_to_see_projects(desc_sorted_project_names.reverse)
E
Ezekiel Kigbo 已提交
190 191 192 193
        end
      end

      context 'Sorting by Last updated' do
194
        it 'sorts the project list' do
E
Ezekiel Kigbo 已提交
195 196
          select_dropdown_option '#filtered-search-sorting-dropdown', 'Last updated'

197
          expect_to_see_projects(desc_sorted_project_names)
E
Ezekiel Kigbo 已提交
198

199 200
          click_sort_direction

201
          expect_to_see_projects(desc_sorted_project_names.reverse)
E
Ezekiel Kigbo 已提交
202 203 204 205
        end
      end

      context 'Sorting by Created date' do
206
        it 'sorts the project list' do
E
Ezekiel Kigbo 已提交
207 208
          select_dropdown_option '#filtered-search-sorting-dropdown', 'Created date'

209
          expect_to_see_projects(desc_sorted_project_names)
E
Ezekiel Kigbo 已提交
210

211
          click_sort_direction
E
Ezekiel Kigbo 已提交
212

213
          expect_to_see_projects(desc_sorted_project_names.reverse)
E
Ezekiel Kigbo 已提交
214 215 216 217
        end
      end

      context 'Sorting by Stars' do
218
        it 'sorts the project list' do
E
Ezekiel Kigbo 已提交
219 220
          select_dropdown_option '#filtered-search-sorting-dropdown', 'Stars'

221
          expect_to_see_projects(desc_sorted_project_names)
E
Ezekiel Kigbo 已提交
222

223
          click_sort_direction
E
Ezekiel Kigbo 已提交
224

225
          expect_to_see_projects(desc_sorted_project_names.reverse)
E
Ezekiel Kigbo 已提交
226 227 228 229
        end
      end
    end
  end
230
end