sorted 1.1.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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