sorting_helper_spec.rb 6.47 KB
Newer Older
1 2 3 4 5 6
# frozen_string_literal: true
require 'spec_helper'

describe SortingHelper do
  include ApplicationHelper
  include IconsHelper
7
  include ExploreHelper
8

9 10 11 12
  def set_sorting_url(option)
    allow(self).to receive(:request).and_return(double(path: 'http://test.com', query_parameters: { label_name: option }))
  end

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  describe '#issuable_sort_option_title' do
    it 'returns correct title for issuable_sort_option_overrides key' do
      expect(issuable_sort_option_title('created_asc')).to eq('Created date')
    end

    it 'returns correct title for a valid sort value' do
      expect(issuable_sort_option_title('priority')).to eq('Priority')
    end

    it 'returns nil for invalid sort value' do
      expect(issuable_sort_option_title('invalid_key')).to eq(nil)
    end
  end

  describe '#issuable_sort_direction_button' do
    before do
29
      set_sorting_url 'test_label'
30 31 32 33
    end

    it 'keeps label filter param' do
      expect(issuable_sort_direction_button('created_date')).to include('label_name=test_label')
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    end

    it 'returns icon with sort-highest when sort is created_date' do
      expect(issuable_sort_direction_button('created_date')).to include('sort-highest')
    end

    it 'returns icon with sort-lowest when sort is asc' do
      expect(issuable_sort_direction_button('created_asc')).to include('sort-lowest')
    end

    it 'returns icon with sort-lowest when sorting by milestone' do
      expect(issuable_sort_direction_button('milestone')).to include('sort-lowest')
    end

    it 'returns icon with sort-lowest when sorting by due_date' do
      expect(issuable_sort_direction_button('due_date')).to include('sort-lowest')
    end
  end
52 53 54 55 56

  def stub_controller_path(value)
    allow(helper.controller).to receive(:controller_path).and_return(value)
  end

57
  def project_common_options
58 59 60 61 62 63 64 65
    {
      sort_value_latest_activity  => sort_title_latest_activity,
      sort_value_recently_created => sort_title_created_date,
      sort_value_name             => sort_title_name,
      sort_value_stars_desc       => sort_title_stars
    }
  end

66
  describe 'with `admin/projects` controller' do
67
    before do
68
      stub_controller_path 'admin/projects'
69 70 71 72
    end

    describe '#projects_sort_options_hash' do
      it 'returns a hash of available sorting options' do
73
        admin_options = project_common_options.merge({
74 75 76 77 78 79
          sort_value_oldest_activity  => sort_title_oldest_activity,
          sort_value_oldest_created   => sort_title_oldest_created,
          sort_value_recently_created => sort_title_recently_created,
          sort_value_stars_desc       => sort_title_most_stars,
          sort_value_largest_repo     => sort_title_largest_repo
        })
Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
80 81

        expect(projects_sort_options_hash).to eq(admin_options)
82 83 84 85
      end
    end
  end

86
  describe 'with `projects` controller' do
87
    before do
88
      stub_controller_path 'projects'
89 90 91 92
    end

    describe '#projects_sort_options_hash' do
      it 'returns a hash of available sorting options' do
Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
93
        expect(projects_sort_options_hash).to include(project_common_options)
94 95 96
      end
    end

97
    describe '#projects_reverse_sort_options_hash' do
Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
      context 'returns a reversed hash of available sorting options' do
        using RSpec::Parameterized::TableSyntax

        where(:sort_key, :reverse_sort_title) do
          sort_value_latest_activity  | sort_value_oldest_activity
          sort_value_recently_created | sort_value_oldest_created
          sort_value_name             | sort_value_name_desc
          sort_value_stars_desc       | sort_value_stars_asc
          sort_value_oldest_activity  | sort_value_latest_activity
          sort_value_oldest_created   | sort_value_recently_created
          sort_value_name_desc        | sort_value_name
          sort_value_stars_asc        | sort_value_stars_desc
        end

        with_them do
          it do
            reverse_hash = projects_reverse_sort_options_hash

            expect(reverse_hash).to include(sort_key)
            expect(reverse_hash[sort_key]).to eq(reverse_sort_title)
          end
119 120 121 122
        end
      end
    end

123
    describe '#project_sort_direction_button' do
Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
124 125 126
      context 'returns the correct icon for each sort option' do
        using RSpec::Parameterized::TableSyntax

127 128 129
        sort_lowest_icon = 'sort-lowest'
        sort_highest_icon = 'sort-highest'

Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
130 131 132 133 134 135 136 137 138 139 140 141 142 143
        where(:selected_sort, :icon) do
          sort_value_latest_activity  | sort_highest_icon
          sort_value_recently_created | sort_highest_icon
          sort_value_name_desc        | sort_highest_icon
          sort_value_stars_desc       | sort_highest_icon
          sort_value_oldest_activity  | sort_lowest_icon
          sort_value_oldest_created   | sort_lowest_icon
          sort_value_name             | sort_lowest_icon
          sort_value_stars_asc        | sort_lowest_icon
        end

        with_them do
          it do
            set_sorting_url selected_sort
144

Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
145 146
            expect(project_sort_direction_button(selected_sort)).to include(icon)
          end
147 148
        end
      end
149

150 151
      it 'returns the correct link to reverse the current sort option' do
        sort_options_links = projects_reverse_sort_options_hash
152

153 154
        sort_options_links.each do |selected_sort, reverse_sort|
          set_sorting_url selected_sort
155

156 157 158
          expect(project_sort_direction_button(selected_sort)).to include(reverse_sort)
        end
      end
159 160
    end

161 162
    describe '#projects_sort_option_titles' do
      it 'returns a hash of titles for the sorting options' do
Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
163
        options = project_common_options.merge({
164 165 166 167
          sort_value_oldest_activity  => sort_title_latest_activity,
          sort_value_oldest_created   => sort_title_created_date,
          sort_value_name_desc        => sort_title_name,
          sort_value_stars_asc        => sort_title_stars
Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
168
        })
169

Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
170
        expect(projects_sort_option_titles).to eq(options)
171
      end
172 173
    end

174 175 176 177 178 179 180 181 182 183 184 185 186 187
    describe 'with project_list_filter_bar off' do
      before do
        stub_feature_flags(project_list_filter_bar: false)
      end

      describe '#projects_sort_options_hash' do
        it 'returns a hash of available sorting options' do
          options = project_common_options.merge({
            sort_value_oldest_activity  => sort_title_oldest_activity,
            sort_value_oldest_created   => sort_title_oldest_created,
            sort_value_recently_created => sort_title_recently_created,
            sort_value_stars_desc       => sort_title_most_stars
          })

Ezekiel Kigbo's avatar
Ezekiel Kigbo committed
188
          expect(projects_sort_options_hash).to eq(options)
189 190
        end
      end
191 192
    end
  end
193
end