issuable_collections_spec.rb 4.27 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
require 'spec_helper'

describe IssuableCollections do
  let(:user) { create(:user) }

  let(:controller) do
    klass = Class.new do
      def self.helper_method(name); end

      include IssuableCollections
11 12 13 14

      def finder_type
        IssuesFinder
      end
15 16 17 18
    end

    controller = klass.new

19
    allow(controller).to receive(:params).and_return(ActionController::Parameters.new(params))
20
    allow(controller).to receive(:current_user).and_return(user)
21 22 23 24

    controller
  end

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
  describe '#set_sort_order_from_user_preference' do
    describe 'when sort param given' do
      let(:params) { { sort: 'updated_desc' } }

      context 'when issuable_sorting_field is defined' do
        before do
          controller.class.define_method(:issuable_sorting_field) { :issues_sort}
        end

        it 'sets user_preference with the right value' do
          controller.send(:set_sort_order_from_user_preference)

          expect(user.user_preference.reload.issues_sort).to eq('updated_desc')
        end
      end

      context 'when no issuable_sorting_field is defined on the controller' do
        it 'does not touch user_preference' do
          allow(user).to receive(:user_preference)

          controller.send(:set_sort_order_from_user_preference)

          expect(user).not_to have_received(:user_preference)
        end
      end
    end

    context 'when a user sorting preference exists' do
      let(:params) { {} }

      before do
        controller.class.define_method(:issuable_sorting_field) { :issues_sort }
      end

      it 'returns the set preference' do
        user.user_preference.update(issues_sort: 'updated_asc')

        sort_preference = controller.send(:set_sort_order_from_user_preference)

        expect(sort_preference).to eq('updated_asc')
      end
    end
  end

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
  describe '#set_set_order_from_cookie' do
    describe 'when sort param given' do
      let(:cookies) { {} }
      let(:params) { { sort: 'downvotes_asc' } }

      it 'sets the cookie with the right values and flags' do
        allow(controller).to receive(:cookies).and_return(cookies)

        controller.send(:set_sort_order_from_cookie)

        expect(cookies['issue_sort']).to eq({ value: 'popularity', secure: false, httponly: false })
      end
    end

    describe 'when cookie exists' do
      let(:cookies) { { 'issue_sort' => 'id_asc' } }
      let(:params) { {} }

      it 'sets the cookie with the right values and flags' do
        allow(controller).to receive(:cookies).and_return(cookies)

        controller.send(:set_sort_order_from_cookie)

        expect(cookies['issue_sort']).to eq({ value: 'created_asc', secure: false, httponly: false })
      end
    end
  end

97
  describe '#page_count_for_relation' do
98 99
    let(:params) { { state: 'opened' } }

100 101 102 103 104 105 106
    it 'returns the number of pages' do
      relation = double(:relation, limit_value: 20)
      pages = controller.send(:page_count_for_relation, relation, 28)

      expect(pages).to eq(2)
    end
  end
107

108
  describe '#finder_options' do
109 110 111 112 113 114
    let(:params) do
      {
        assignee_id: '1',
        assignee_username: 'user1',
        author_id: '2',
        author_username: 'user2',
115 116
        authorized_only: 'yes',
        confidential: true,
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
        due_date: '2017-01-01',
        group_id: '3',
        iids: '4',
        label_name: 'foo',
        milestone_title: 'bar',
        my_reaction_emoji: 'thumbsup',
        non_archived: 'true',
        project_id: '5',
        scope: 'all',
        search: 'baz',
        sort: 'priority',
        state: 'opened',
        invalid_param: 'invalid_param'
      }
    end

133
    it 'only allows whitelisted params' do
134
      allow(controller).to receive(:cookies).and_return({})
135
      allow(controller).to receive(:current_user).and_return(nil)
136

137
      finder_options = controller.send(:finder_options)
138

139
      expect(finder_options).to eq(ActionController::Parameters.new({
140 141 142 143
        'assignee_id' => '1',
        'assignee_username' => 'user1',
        'author_id' => '2',
        'author_username' => 'user2',
144
        'confidential' => true,
145 146 147
        'label_name' => 'foo',
        'milestone_title' => 'bar',
        'my_reaction_emoji' => 'thumbsup',
148
        'due_date' => '2017-01-01',
149 150 151 152
        'scope' => 'all',
        'search' => 'baz',
        'sort' => 'priority',
        'state' => 'opened'
153
      }).permit!)
154 155
    end
  end
156
end