sorted 1.1.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
-
3
- if defined? ActiveRecord
4
- describe Sorted::Orms::ActiveRecord do
5
- ActiveRecord::Base.send(:include, Sorted::Orms::ActiveRecord)
6
-
7
- class SortedActiveRecordTest < ActiveRecord::Base
8
- establish_connection adapter: 'sqlite3', database: ':memory:'
9
-
10
- connection.create_table table_name, force: true do |t|
11
- t.string :name
12
- end
13
-
14
- scope :page, -> { limit(50) }
15
- end
16
-
17
- it 'should integrate with ActiveRecord::Base' do
18
- SortedActiveRecordTest.should respond_to(:sorted)
19
- SortedActiveRecordTest.should respond_to(:resorted)
20
- end
21
-
22
- it 'should play nice with other scopes' do
23
- sql = "SELECT \"sorted_active_record_tests\".* FROM \"sorted_active_record_tests\" WHERE \"sorted_active_record_tests\".\"name\" = 'bob' ORDER BY \"name\" ASC LIMIT 50"
24
- SortedActiveRecordTest.where(name: 'bob').page.sorted(nil, 'name ASC').to_sql.should == sql
25
- SortedActiveRecordTest.page.sorted(nil, 'name ASC').where(name: 'bob').to_sql.should == sql
26
- end
27
-
28
- it 'should override the provided order' do
29
- sql = "SELECT \"sorted_active_record_tests\".* FROM \"sorted_active_record_tests\" WHERE \"sorted_active_record_tests\".\"name\" = 'bob' ORDER BY \"name\" ASC LIMIT 50"
30
- SortedActiveRecordTest.page.where(name: 'bob').order(:id).sorted(nil, 'name DESC').resorted(nil, 'name ASC').to_sql.should == sql
31
- end
32
- end
33
- end
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
-
3
- if defined? Mongoid
4
- describe Sorted::Orms::Mongoid do
5
- ::Mongoid::Criteria.send :include, Sorted::Orms::Mongoid
6
- ::Mongoid::Document.send :include, Sorted::Orms::Mongoid
7
-
8
- class SortedMongoidTest
9
- include ::Mongoid::Document
10
-
11
- field :name, type: String
12
-
13
- def self.page
14
- limit(50)
15
- end
16
- end
17
-
18
- it 'should integrate with Mongoid::Document' do
19
- SortedMongoidTest.should respond_to(:sorted)
20
- end
21
-
22
- it 'should integrate with Mongoid::Criteria' do
23
- SortedMongoidTest.page.should respond_to(:sorted)
24
- end
25
-
26
- it 'should play nice with other scopes' do
27
- query_options = { limit: 50, sort: { 'name' => 1 } }
28
- SortedMongoidTest.page.sorted(nil, 'name ASC').options.should == query_options
29
- SortedMongoidTest.page.sorted(nil, 'name ASC').options.should == query_options
30
- end
31
- end
32
- end
@@ -1,117 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sorted::Parser, 'params parsing' do
4
- it 'should not raise if pased nil arguments' do
5
- -> { Sorted::Parser.new(nil, nil).toggle }.should_not raise_error
6
- end
7
-
8
- it 'should return a nice array from the order sql' do
9
- sort = nil
10
- order = 'email ASC, phone ASC, name DESC'
11
- result = [['email', 'asc'], ['phone', 'asc'], ['name', 'desc']]
12
-
13
- sorter = Sorted::Parser.new(sort, order)
14
- sorter.orders.should eq result
15
- end
16
-
17
- it 'should return a nice array from the sort params' do
18
- sort = 'email_desc!name_desc'
19
- order = nil
20
- result = [['email', 'desc'], ['name', 'desc']]
21
-
22
- sorter = Sorted::Parser.new(sort, order)
23
- sorter.sorts.should eq result
24
- end
25
-
26
- it 'should combine sort and order params with sort params being of higer importance' do
27
- sort = 'email_desc!name_desc'
28
- order = 'email ASC, phone ASC, name DESC'
29
- result = [['email', 'desc'], ['name', 'desc'], ['phone', 'asc']]
30
-
31
- sorter = Sorted::Parser.new(sort, order)
32
- sorter.to_a.should eq result
33
- end
34
-
35
- it 'should allow numbers, underscores and full stops in sort params' do
36
- sort = 'assessmentsTable.name_desc!users_300.name_5_desc'
37
- order = nil
38
- result = [['assessmentsTable.name', 'desc'], ['users_300.name_5', 'desc']]
39
-
40
- sorter = Sorted::Parser.new(sort, order)
41
- sorter.sorts.should eq result
42
- end
43
-
44
- it 'should allow numbers, underscores and full stops in order params' do
45
- sort = nil
46
- order = 'assessmentsTable.name ASC, users_300.name_5 ASC'
47
- result = [['assessmentsTable.name', 'asc'], ['users_300.name_5', 'asc']]
48
-
49
- sorter = Sorted::Parser.new(sort, order)
50
- sorter.orders.should eq result
51
- end
52
-
53
- it 'should default to asc if sort params order is ommited' do
54
- sort = nil
55
- order = :email
56
- result = [['email', 'asc']]
57
-
58
- sorter = Sorted::Parser.new(sort, order)
59
- sorter.orders.should eq result
60
- end
61
- end
62
-
63
- describe Sorted::Parser, 'return types' do
64
- module FakeConnection
65
- def self.quote_column_name(column_name)
66
- "`#{column_name}`"
67
- end
68
- end
69
-
70
- let(:quoter) {
71
- ->(frag) { FakeConnection.quote_column_name(frag) }
72
- }
73
-
74
- it 'should properly escape sql column names' do
75
- order = 'users.name DESC'
76
- result = '`users`.`name` DESC'
77
-
78
- sorter = Sorted::Parser.new(nil, order)
79
- sorter.to_sql(quoter).should eq result
80
- end
81
-
82
- it 'should return an sql sort string' do
83
- sort = 'email_desc!name_desc'
84
- order = 'email ASC, phone ASC, name DESC'
85
- result = '`email` DESC, `name` DESC, `phone` ASC'
86
-
87
- sorter = Sorted::Parser.new(sort, order)
88
- sorter.to_sql(quoter).should eq result
89
- end
90
-
91
- it 'should return an hash' do
92
- sort = 'email_desc!name_desc'
93
- order = 'email ASC, phone ASC, name DESC'
94
- result = { 'email' => 'desc', 'name' => 'desc', 'phone' => 'asc' }
95
-
96
- sorter = Sorted::Parser.new(sort, order)
97
- sorter.to_hash.should eq result
98
- end
99
-
100
- it 'should return an the encoded sort string' do
101
- sort = 'email_desc!name_desc'
102
- order = 'email ASC, phone ASC, name DESC'
103
- result = 'email_desc!name_desc!phone_asc'
104
-
105
- sorter = Sorted::Parser.new(sort, order)
106
- sorter.to_s.should eq result
107
- end
108
-
109
- it 'sql injection using order by clause should not work' do
110
- sort = '(case+when+((ASCII(SUBSTR((select+table_name+from+all_tables+where+rownum%3d1),1))>%3D128))+then+id+else+something+end)'
111
- order = 'email ASC, phone ASC, name DESC'
112
- result = '`email` ASC, `phone` ASC, `name` DESC'
113
-
114
- sorter = Sorted::Parser.new(sort, order)
115
- sorter.to_sql(quoter).should eq result
116
- end
117
- end
@@ -1,75 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sorted::Toggler do
4
- it 'should bring phone to first order importance but not toggle ascendance' do
5
- orders = [['email', 'asc'], ['phone', 'asc']]
6
- sorts = [['phone', 'asc']]
7
- result = [['phone', 'asc'], ['email', 'asc']]
8
-
9
- toggler = Sorted::Toggler.new(sorts, orders)
10
- toggler.to_a.should eq result
11
- end
12
-
13
- it 'should toggle ascendance of email' do
14
- orders = [['email', 'desc']]
15
- sorts = [['email', 'asc']]
16
- result = [['email', 'desc']]
17
-
18
- toggler = Sorted::Toggler.new(sorts, orders)
19
- toggler.to_a.should eq result
20
- end
21
-
22
- it 'should return both order params un-toggled with no sort param' do
23
- orders = [['email', 'asc'], ['phone', 'asc']]
24
- sorts = []
25
- result = [['email', 'asc'], ['phone', 'asc']]
26
-
27
- toggler = Sorted::Toggler.new(sorts, orders)
28
- toggler.to_a.should eq result
29
- end
30
-
31
- it 'should toggle the email ascendance' do
32
- orders = [['email', 'asc']]
33
- sorts = [['email', 'asc'], ['phone', 'asc']]
34
- result = [['email', 'desc'], ['phone', 'asc']]
35
-
36
- toggler = Sorted::Toggler.new(sorts, orders)
37
- toggler.to_a.should eq result
38
- end
39
-
40
- it 'should toggle the email ascendance' do
41
- orders = [['email', 'desc']]
42
- sorts = [['email', 'asc'], ['phone', 'asc']]
43
- result = [['email', 'desc'], ['phone', 'asc']]
44
-
45
- toggler = Sorted::Toggler.new(sorts, orders)
46
- toggler.to_a.should eq result
47
- end
48
-
49
- it 'should toggle two 1..n sort values' do
50
- orders = [['email', 'asc'], ['phone', 'asc']]
51
- sorts = [['email', 'asc'], ['phone', 'asc']]
52
- result = [['email', 'desc'], ['phone', 'desc']]
53
-
54
- toggler = Sorted::Toggler.new(sorts, orders)
55
- toggler.to_a.should eq result
56
- end
57
-
58
- it 'should toggle based on sorts and not orders' do
59
- orders = [['email', 'desc'], ['phone', 'desc']]
60
- sorts = [['email', 'asc'], ['phone', 'asc']]
61
- result = [['email', 'desc'], ['phone', 'desc']]
62
-
63
- toggler = Sorted::Toggler.new(sorts, orders)
64
- toggler.to_a.should eq result
65
- end
66
-
67
- it 'should toggle based on sorts and not orders' do
68
- orders = [['email', 'asc']]
69
- sorts = [['name', 'asc']]
70
- result = [['email', 'asc'], ['name', 'asc']]
71
-
72
- toggler = Sorted::Toggler.new(sorts, orders)
73
- toggler.to_a.should eq result
74
- end
75
- end
@@ -1,63 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sorted::ViewHelpers::ActionView do
4
- it 'should integrate with ActiveRecord::Base' do
5
- ActionView::Base.send(:include, Sorted::ViewHelpers::ActionView)
6
- ActionView::Base.new.should respond_to(:link_to_sorted)
7
- end
8
- end
9
-
10
- describe Sorted::ViewHelpers::ActionView::SortedViewHelper do
11
- it 'should return the default sort order and preserve the existing params' do
12
- order = :email
13
- params = { page: 10 }
14
- result = { page: 10, sort: 'email_asc' }
15
-
16
- sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
17
- sorter.params.should eq result
18
- end
19
-
20
- it 'should only return the sorted css class if email has not yet been sorted' do
21
- order = :email
22
- params = {}
23
- result = 'sorted'
24
-
25
- sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
26
- sorter.css.should eq result
27
- end
28
-
29
- it 'should only return the sorted css class if email has not yet been sorted' do
30
- order = :email
31
- params = { sort: 'email_asc' }
32
- result = 'sorted asc'
33
-
34
- sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
35
- sorter.css.should eq result
36
- end
37
-
38
- it 'should return the default order when params are empty' do
39
- order = :email
40
- result = { sort: 'email_asc' }
41
-
42
- sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, {}
43
- sorter.params.should eq result
44
- end
45
-
46
- it 'should correctly toggle multiple params' do
47
- order = 'email DESC, name DESC'
48
- params = { sort: 'email_asc!name_asc' }
49
- result = { sort: 'email_desc!name_desc' }
50
-
51
- sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
52
- sorter.params.should eq result
53
- end
54
-
55
- it 'should have sort order over existing params' do
56
- order = :email
57
- params = { sort: 'name_asc' }
58
- result = { sort: 'email_asc!name_asc' }
59
-
60
- sorter = Sorted::ViewHelpers::ActionView::SortedViewHelper.new order, params
61
- sorter.params.should eq result
62
- end
63
- end