searchlogic 1.5.3

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.
Files changed (125) hide show
  1. data/CHANGELOG.rdoc +228 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Manifest +123 -0
  4. data/README.rdoc +383 -0
  5. data/Rakefile +15 -0
  6. data/TODO.rdoc +6 -0
  7. data/examples/README.rdoc +4 -0
  8. data/init.rb +1 -0
  9. data/lib/searchlogic.rb +89 -0
  10. data/lib/searchlogic/active_record/associations.rb +52 -0
  11. data/lib/searchlogic/active_record/base.rb +218 -0
  12. data/lib/searchlogic/active_record/connection_adapters/mysql_adapter.rb +172 -0
  13. data/lib/searchlogic/active_record/connection_adapters/postgresql_adapter.rb +168 -0
  14. data/lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb +75 -0
  15. data/lib/searchlogic/condition/base.rb +159 -0
  16. data/lib/searchlogic/condition/begins_with.rb +17 -0
  17. data/lib/searchlogic/condition/blank.rb +21 -0
  18. data/lib/searchlogic/condition/child_of.rb +11 -0
  19. data/lib/searchlogic/condition/descendant_of.rb +24 -0
  20. data/lib/searchlogic/condition/ends_with.rb +17 -0
  21. data/lib/searchlogic/condition/equals.rb +27 -0
  22. data/lib/searchlogic/condition/greater_than.rb +15 -0
  23. data/lib/searchlogic/condition/greater_than_or_equal_to.rb +15 -0
  24. data/lib/searchlogic/condition/inclusive_descendant_of.rb +11 -0
  25. data/lib/searchlogic/condition/keywords.rb +47 -0
  26. data/lib/searchlogic/condition/less_than.rb +15 -0
  27. data/lib/searchlogic/condition/less_than_or_equal_to.rb +15 -0
  28. data/lib/searchlogic/condition/like.rb +15 -0
  29. data/lib/searchlogic/condition/nil.rb +21 -0
  30. data/lib/searchlogic/condition/not_begin_with.rb +20 -0
  31. data/lib/searchlogic/condition/not_blank.rb +19 -0
  32. data/lib/searchlogic/condition/not_end_with.rb +20 -0
  33. data/lib/searchlogic/condition/not_equal.rb +26 -0
  34. data/lib/searchlogic/condition/not_have_keywords.rb +20 -0
  35. data/lib/searchlogic/condition/not_like.rb +20 -0
  36. data/lib/searchlogic/condition/not_nil.rb +19 -0
  37. data/lib/searchlogic/condition/sibling_of.rb +14 -0
  38. data/lib/searchlogic/condition/tree.rb +17 -0
  39. data/lib/searchlogic/conditions/base.rb +484 -0
  40. data/lib/searchlogic/conditions/protection.rb +36 -0
  41. data/lib/searchlogic/config.rb +31 -0
  42. data/lib/searchlogic/config/helpers.rb +289 -0
  43. data/lib/searchlogic/config/search.rb +53 -0
  44. data/lib/searchlogic/core_ext/hash.rb +75 -0
  45. data/lib/searchlogic/helpers/control_types/link.rb +310 -0
  46. data/lib/searchlogic/helpers/control_types/links.rb +241 -0
  47. data/lib/searchlogic/helpers/control_types/remote_link.rb +87 -0
  48. data/lib/searchlogic/helpers/control_types/remote_links.rb +72 -0
  49. data/lib/searchlogic/helpers/control_types/remote_select.rb +36 -0
  50. data/lib/searchlogic/helpers/control_types/select.rb +82 -0
  51. data/lib/searchlogic/helpers/form.rb +208 -0
  52. data/lib/searchlogic/helpers/utilities.rb +197 -0
  53. data/lib/searchlogic/modifiers/absolute.rb +15 -0
  54. data/lib/searchlogic/modifiers/acos.rb +11 -0
  55. data/lib/searchlogic/modifiers/asin.rb +11 -0
  56. data/lib/searchlogic/modifiers/atan.rb +11 -0
  57. data/lib/searchlogic/modifiers/base.rb +27 -0
  58. data/lib/searchlogic/modifiers/ceil.rb +15 -0
  59. data/lib/searchlogic/modifiers/char_length.rb +15 -0
  60. data/lib/searchlogic/modifiers/cos.rb +15 -0
  61. data/lib/searchlogic/modifiers/cot.rb +15 -0
  62. data/lib/searchlogic/modifiers/day_of_month.rb +15 -0
  63. data/lib/searchlogic/modifiers/day_of_week.rb +15 -0
  64. data/lib/searchlogic/modifiers/day_of_year.rb +15 -0
  65. data/lib/searchlogic/modifiers/degrees.rb +11 -0
  66. data/lib/searchlogic/modifiers/exp.rb +15 -0
  67. data/lib/searchlogic/modifiers/floor.rb +15 -0
  68. data/lib/searchlogic/modifiers/hex.rb +11 -0
  69. data/lib/searchlogic/modifiers/hour.rb +11 -0
  70. data/lib/searchlogic/modifiers/log.rb +15 -0
  71. data/lib/searchlogic/modifiers/log10.rb +11 -0
  72. data/lib/searchlogic/modifiers/log2.rb +11 -0
  73. data/lib/searchlogic/modifiers/lower.rb +15 -0
  74. data/lib/searchlogic/modifiers/ltrim.rb +15 -0
  75. data/lib/searchlogic/modifiers/md5.rb +11 -0
  76. data/lib/searchlogic/modifiers/microseconds.rb +11 -0
  77. data/lib/searchlogic/modifiers/milliseconds.rb +11 -0
  78. data/lib/searchlogic/modifiers/minute.rb +15 -0
  79. data/lib/searchlogic/modifiers/month.rb +15 -0
  80. data/lib/searchlogic/modifiers/octal.rb +15 -0
  81. data/lib/searchlogic/modifiers/radians.rb +11 -0
  82. data/lib/searchlogic/modifiers/round.rb +11 -0
  83. data/lib/searchlogic/modifiers/rtrim.rb +15 -0
  84. data/lib/searchlogic/modifiers/second.rb +15 -0
  85. data/lib/searchlogic/modifiers/sign.rb +11 -0
  86. data/lib/searchlogic/modifiers/sin.rb +11 -0
  87. data/lib/searchlogic/modifiers/square_root.rb +15 -0
  88. data/lib/searchlogic/modifiers/tan.rb +15 -0
  89. data/lib/searchlogic/modifiers/trim.rb +15 -0
  90. data/lib/searchlogic/modifiers/upper.rb +15 -0
  91. data/lib/searchlogic/modifiers/week.rb +11 -0
  92. data/lib/searchlogic/modifiers/year.rb +11 -0
  93. data/lib/searchlogic/search/base.rb +148 -0
  94. data/lib/searchlogic/search/conditions.rb +53 -0
  95. data/lib/searchlogic/search/ordering.rb +244 -0
  96. data/lib/searchlogic/search/pagination.rb +121 -0
  97. data/lib/searchlogic/search/protection.rb +89 -0
  98. data/lib/searchlogic/search/searching.rb +31 -0
  99. data/lib/searchlogic/shared/utilities.rb +50 -0
  100. data/lib/searchlogic/shared/virtual_classes.rb +39 -0
  101. data/lib/searchlogic/version.rb +79 -0
  102. data/searchlogic.gemspec +39 -0
  103. data/test/fixtures/accounts.yml +15 -0
  104. data/test/fixtures/cats.yml +3 -0
  105. data/test/fixtures/dogs.yml +3 -0
  106. data/test/fixtures/orders.yml +14 -0
  107. data/test/fixtures/user_groups.yml +13 -0
  108. data/test/fixtures/users.yml +36 -0
  109. data/test/test_active_record_associations.rb +81 -0
  110. data/test/test_active_record_base.rb +93 -0
  111. data/test/test_condition_base.rb +52 -0
  112. data/test/test_condition_types.rb +143 -0
  113. data/test/test_conditions_base.rb +242 -0
  114. data/test/test_conditions_protection.rb +16 -0
  115. data/test/test_config.rb +23 -0
  116. data/test/test_helper.rb +134 -0
  117. data/test/test_search_base.rb +227 -0
  118. data/test/test_search_conditions.rb +19 -0
  119. data/test/test_search_ordering.rb +165 -0
  120. data/test/test_search_pagination.rb +72 -0
  121. data/test/test_search_protection.rb +24 -0
  122. data/test_libs/acts_as_tree.rb +98 -0
  123. data/test_libs/ordered_hash.rb +9 -0
  124. data/test_libs/rexml_fix.rb +14 -0
  125. metadata +317 -0
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestConfig < Test::Unit::TestCase
4
+ def test_per_page
5
+ Searchlogic::Config.search.per_page = 1
6
+
7
+ assert Account.count > 1
8
+ assert Account.all.size > 1
9
+ assert User.all.size > 1
10
+ assert User.find(:all, :per_page => 1).size == 1
11
+ assert User.new_search.all.size == 1
12
+ assert User.new_search(:per_page => nil).all.size > 1
13
+
14
+ Searchlogic::Config.search.per_page = nil
15
+
16
+ assert Account.count > 1
17
+ assert Account.all.size > 1
18
+ assert User.all.size > 1
19
+ assert User.find(:all, :per_page => 1).size == 1
20
+ assert User.new_search.all.size > 1
21
+ assert User.new_search(:per_page => 1).all.size == 1
22
+ end
23
+ end
@@ -0,0 +1,134 @@
1
+ require "test/unit"
2
+ require "rubygems"
3
+ require "ruby-debug"
4
+ require "active_record"
5
+ require File.dirname(__FILE__) + '/../test_libs/acts_as_tree'
6
+ require File.dirname(__FILE__) + '/../test_libs/ordered_hash'
7
+ require File.dirname(__FILE__) + '/../test_libs/rexml_fix'
8
+ require File.dirname(__FILE__) + '/../lib/searchlogic'
9
+
10
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
11
+
12
+ class Account < ActiveRecord::Base
13
+ has_one :admin, :class_name => "User", :conditions => {:first_name => "Ben"}
14
+ has_many :users, :dependent => :destroy
15
+ has_many :orders, :through => :users
16
+
17
+ named_scope :scope1, :conditions => {:users => {:first_name_contains => "Ben"}}
18
+ end
19
+
20
+ class UserGroup < ActiveRecord::Base
21
+ has_and_belongs_to_many :users
22
+ end
23
+
24
+ class User < ActiveRecord::Base
25
+ acts_as_tree
26
+ belongs_to :account
27
+ has_many :orders, :dependent => :destroy
28
+ has_many :cats, :dependent => :destroy
29
+ has_many :dogs, :dependent => :destroy
30
+ has_and_belongs_to_many :user_groups
31
+ end
32
+
33
+ class Order < ActiveRecord::Base
34
+ belongs_to :user
35
+ end
36
+
37
+ # STI
38
+ class Animal < ActiveRecord::Base
39
+ end
40
+
41
+ class Dog < Animal
42
+ end
43
+
44
+ class Cat < Animal
45
+ end
46
+
47
+ class Test::Unit::TestCase
48
+ def setup_db
49
+ ActiveRecord::Schema.define(:version => 1) do
50
+ create_table :accounts do |t|
51
+ t.datetime :created_at
52
+ t.datetime :updated_at
53
+ t.string :name
54
+ t.boolean :active
55
+ end
56
+
57
+ create_table :user_groups do |t|
58
+ t.datetime :created_at
59
+ t.datetime :updated_at
60
+ t.string :name
61
+ end
62
+
63
+ create_table :user_groups_users, :id => false do |t|
64
+ t.integer :user_group_id
65
+ t.integer :user_id
66
+ end
67
+
68
+ create_table :users do |t|
69
+ t.datetime :created_at
70
+ t.datetime :updated_at
71
+ t.integer :account_id
72
+ t.integer :parent_id
73
+ t.string :first_name
74
+ t.string :last_name
75
+ t.boolean :active
76
+ t.text :bio
77
+ end
78
+
79
+ create_table :orders do |t|
80
+ t.datetime :created_at
81
+ t.datetime :updated_at
82
+ t.integer :user_id
83
+ t.float :total
84
+ t.text :description
85
+ t.binary :receipt
86
+ end
87
+
88
+ create_table :animals do |t|
89
+ t.datetime :created_at
90
+ t.datetime :updated_at
91
+ t.string :type
92
+ t.text :description
93
+ end
94
+ end
95
+ end
96
+
97
+ def load_fixtures
98
+ fixtures = [:accounts, :orders, :users, :user_groups, :dogs, :cats]
99
+ fixtures.each do |fixture|
100
+ records = YAML.load(File.read(File.dirname(__FILE__) + "/fixtures/#{fixture.to_s}.yml"))
101
+ records.each do |name, attributes|
102
+ record = fixture.to_s.singularize.classify.constantize.new
103
+ attributes.each { |k, v| record.send("#{k}=", v) }
104
+ record.save!
105
+ end
106
+ end
107
+
108
+ # Not sure why I have to do this, but sick of dealing with it
109
+ UserGroup.all.each do |user_group|
110
+ user_ids = user_group.user_ids.uniq!
111
+ user_group.users.clear
112
+ user_group.user_ids = user_ids
113
+ user_group.save!
114
+ end
115
+
116
+ # Create the cached virtual classes
117
+ fixtures.each { |fixture| fixture.to_s.classify.constantize.new_search }
118
+ end
119
+
120
+ def teardown_db
121
+ ActiveRecord::Base.connection.tables.each do |table|
122
+ ActiveRecord::Base.connection.drop_table(table)
123
+ end
124
+ end
125
+
126
+ def setup
127
+ setup_db
128
+ load_fixtures
129
+ end
130
+
131
+ def teardown
132
+ teardown_db
133
+ end
134
+ end
@@ -0,0 +1,227 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSearchBase < Test::Unit::TestCase
4
+ def test_needed
5
+ assert Searchlogic::Search::Base.needed?(Account, :page => 2, :conditions => {:name => "Ben"})
6
+ assert !Searchlogic::Search::Base.needed?(Account, :conditions => {:name => "Ben"})
7
+ assert Searchlogic::Search::Base.needed?(Account, :limit => 2, :conditions => {:name_contains => "Ben"})
8
+ assert !Searchlogic::Search::Base.needed?(Account, :limit => 2)
9
+ assert Searchlogic::Search::Base.needed?(Account, :per_page => 2)
10
+ end
11
+
12
+ def test_initialize
13
+ assert_nothing_raised { Account.new_search }
14
+ search = Account.new_search!(:conditions => {:name_like => "binary"}, :page => 2, :limit => 10, :readonly => true)
15
+ assert_equal Account, search.klass
16
+ assert_equal "binary", search.conditions.name_like
17
+ assert_equal 2, search.page
18
+ assert_equal 10, search.limit
19
+ assert_equal true, search.readonly
20
+ end
21
+
22
+ def test_acting_as_filter
23
+ search = Account.new_search
24
+ search.acting_as_filter = true
25
+ assert search.acting_as_filter?
26
+ search.acting_as_filter = false
27
+ assert !search.acting_as_filter?
28
+ end
29
+
30
+ def test_setting_first_level_options
31
+ search = Account.new_search!(:include => :users, :joins => :users, :offset => 5, :limit => 20, :order => "name ASC", :select => "name", :readonly => true, :group => "name", :from => "accounts", :lock => true)
32
+ assert_equal :users, search.include
33
+ assert_equal :users, search.joins
34
+ assert_equal 5, search.offset
35
+ assert_equal 20, search.limit
36
+ assert_equal "name ASC", search.order
37
+ assert_equal "name", search.select
38
+ assert_equal true, search.readonly
39
+ assert_equal "name", search.group
40
+ assert_equal "accounts", search.from
41
+ assert_equal true, search.lock
42
+
43
+ search = Account.new_search(:per_page => nil)
44
+
45
+ search.include = :users
46
+ assert_equal :users, search.include
47
+
48
+ # treat it like SQL, just like AR
49
+ search.joins = "users"
50
+ assert_equal "users", search.joins
51
+
52
+ search.page = 5
53
+ assert_equal 1, search.page
54
+ assert_equal nil, search.offset
55
+
56
+ search.limit = 20
57
+ assert_equal search.limit, 20
58
+ assert_equal search.per_page, 20
59
+ assert_equal search.page, 5
60
+ assert_equal search.offset, 80
61
+ search.limit = nil
62
+ assert_equal nil, search.limit
63
+ assert_equal nil, search.per_page
64
+ assert_equal 1, search.page
65
+ assert_equal nil, search.offset
66
+
67
+ search.offset = 50
68
+ assert_equal 50, search.offset
69
+ assert_equal 1, search.page
70
+ search.limit = 50
71
+ assert_equal 2, search.page
72
+ search.offset = nil
73
+ assert_equal nil, search.offset
74
+ assert_equal 1, search.page
75
+
76
+ search.per_page = 2
77
+ assert_equal 2, search.per_page
78
+ assert_equal 2, search.limit
79
+ search.offset = 50
80
+ assert_equal 26, search.page
81
+ assert_equal 50, search.offset
82
+
83
+ search.order = "name ASC"
84
+ assert_equal search.order, "name ASC"
85
+
86
+ search.select = "name"
87
+ assert_equal search.select, "name"
88
+
89
+ search.readonly = true
90
+ assert_equal search.readonly, true
91
+
92
+ search.group = "name"
93
+ assert_equal search.group, "name"
94
+
95
+ search.from = "accounts"
96
+ assert_equal search.from, "accounts"
97
+
98
+ search.lock = true
99
+ assert_equal search.lock, true
100
+ end
101
+
102
+ def test_joins
103
+ search = Account.new_search
104
+ assert_equal nil, search.joins
105
+ search.conditions.name_contains = "Binary"
106
+ assert_equal nil, search.joins
107
+ search.conditions.users.first_name_contains = "Ben"
108
+ assert_equal(:users, search.joins)
109
+ search.conditions.users.orders.id_gt = 2
110
+ assert_equal({:users => :orders}, search.joins)
111
+ search.conditions.users.reset_orders!
112
+ assert_equal(:users, search.joins)
113
+ search.conditions.users.orders.id_gt = 2
114
+ search.conditions.reset_users!
115
+ assert_equal nil, search.joins
116
+ end
117
+
118
+ def test_limit
119
+ search = Account.new_search
120
+ search.limit = 10
121
+ assert_equal 10, search.limit
122
+ search.page = 2
123
+ assert_equal 10, search.offset
124
+ search.limit = 25
125
+ assert_equal 25, search.offset
126
+ assert_equal 2, search.page
127
+ search.page = 5
128
+ assert_equal 5, search.page
129
+ assert_equal 25, search.limit
130
+ search.limit = 3
131
+ assert_equal 12, search.offset
132
+ end
133
+
134
+ def test_options
135
+ end
136
+
137
+ def test_sanitize
138
+ search = Account.new_search
139
+ search.per_page = 2
140
+ search.conditions.name_like = "Binary"
141
+ search.conditions.users.id_greater_than = 2
142
+ search.page = 3
143
+ search.readonly = true
144
+ assert_equal({:joins => :users, :offset => 4, :select => "DISTINCT \"accounts\".*", :readonly => true, :conditions => ["(\"accounts\".\"name\" LIKE ?) AND (\"users\".\"id\" > ?)", "%Binary%", 2], :limit => 2 }, search.sanitize)
145
+ end
146
+
147
+ def test_scope
148
+ search = Account.new_search!
149
+ search.conditions = "some sql"
150
+ conditions = search.conditions
151
+ assert_equal "some sql", search.conditions.conditions
152
+ search.conditions = nil
153
+ assert_equal nil, search.conditions.conditions
154
+ search.conditions = "some sql"
155
+ assert_equal "some sql", search.conditions.conditions
156
+ search.conditions = "some sql"
157
+ assert_equal "some sql", search.conditions.conditions
158
+ end
159
+
160
+ def test_searching
161
+ search = Account.new_search
162
+ search.conditions.name_like = "Binary"
163
+ assert_equal [Account.find(1), Account.find(3)], search.all
164
+ assert_equal [Account.find(1), Account.find(3)], search.find(:all)
165
+ assert_equal Account.find(1), search.first
166
+ assert_equal Account.find(1), search.find(:first)
167
+
168
+ search.per_page = 20
169
+ search.page = 2
170
+
171
+ assert_equal [], search.all
172
+ assert_equal [], search.find(:all)
173
+ assert_equal nil, search.first
174
+ assert_equal nil, search.find(:first)
175
+
176
+ search.per_page = 0
177
+ search.page = nil
178
+ search.conditions.users.first_name_contains = "Ben"
179
+ search.conditions.users.orders.description_keywords = "products, &*ap#ple $%^&*"
180
+ assert_equal [Account.find(1)], search.all
181
+ assert_equal [Account.find(1)], search.find(:all)
182
+ assert_equal Account.find(1), search.first
183
+ assert_equal Account.find(1), search.find(:first)
184
+
185
+ search = Account.new_search
186
+ search.select = "id, name"
187
+ assert_equal Account.all, search.all
188
+
189
+ search = Account.scope1.new_search!(:conditions => {:users => {:first_name_starts_with => "Ben"}})
190
+ assert_equal [Account.find(1)], search.all
191
+ search2 = search.dup
192
+ assert_equal [Account.find(1)], search2.all
193
+ end
194
+
195
+ def test_calculations
196
+ search = Account.new_search
197
+ search.conditions.name_like = "Binary"
198
+ assert_equal 2, search.average('id')
199
+ assert_equal 2, search.calculate(:avg, 'id')
200
+ assert_equal 3, search.calculate(:max, 'id')
201
+ assert_equal 2, search.count
202
+ assert_equal 3, search.maximum('id')
203
+ assert_equal 1, search.minimum('id')
204
+ assert_equal 4, search.sum('id')
205
+
206
+ search.readonly = true
207
+ assert_equal 4, search.sum('id')
208
+
209
+ search = Account.new_search(:conditions => {:users => {:orders => {:id_gt => 1}}})
210
+ assert_equal 1, search.count
211
+
212
+ search = Order.new_search(:conditions => {:user => {:account => {:id_gt => 1}}})
213
+ assert_equal 1, search.count
214
+
215
+ search = UserGroup.new_search(:conditions => {:users => {:orders => {:id_gt => 1}}})
216
+ assert_equal 1, search.count
217
+ end
218
+
219
+ def test_inspect
220
+ search = Account.new_search
221
+ assert_nothing_raised { search.inspect }
222
+ end
223
+
224
+ def test_sti
225
+
226
+ end
227
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSearchConditions < Test::Unit::TestCase
4
+ def test_conditions
5
+ search = Account.new_search
6
+ assert_kind_of Searchlogic::Conditions::Base, search.conditions
7
+ assert_equal search.conditions.klass, Account
8
+
9
+ search.conditions = {:name_like => "Binary"}
10
+ assert_kind_of Searchlogic::Conditions::Base, search.conditions
11
+
12
+ search = Account.new_search(:conditions => {:name_like => "Ben"})
13
+ assert_equal({:name_like => "Ben"}, search.conditions.conditions)
14
+ end
15
+
16
+ def test_sanitize
17
+ # This is tested in test_search_base
18
+ end
19
+ end
@@ -0,0 +1,165 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSearchOrdering < Test::Unit::TestCase
4
+ def test_order_to_order_by
5
+ search = Account.new_search
6
+ search.order = "name"
7
+ assert_equal "name", search.order_by
8
+ search.order = "users.first_name"
9
+ assert_equal({"users" => "first_name"}, search.order_by)
10
+ search.order = "\"users\".\"first_name\""
11
+ assert_equal({"users" => "first_name"}, search.order_by)
12
+ search.order = "\"users\".\"first_name\", name ASC"
13
+ assert_equal([{"users" => "first_name"}, "name"], search.order_by)
14
+ end
15
+
16
+ def test_order_by
17
+ search = Account.new_search
18
+ assert_equal nil, search.order
19
+ assert_equal nil, search.order_by
20
+
21
+ search.order_by = "first_name"
22
+ assert_equal "first_name", search.order_by
23
+ assert_equal "\"accounts\".\"first_name\"", search.order
24
+
25
+ search.order_by = "last_name"
26
+ assert_equal "last_name", search.order_by
27
+ assert_equal "\"accounts\".\"last_name\"", search.order
28
+
29
+ search.order_by = ["first_name", "last_name"]
30
+ assert_equal ["first_name", "last_name"], search.order_by
31
+ assert_equal "\"accounts\".\"first_name\", \"accounts\".\"last_name\"", search.order
32
+
33
+ search.order = "created_at DESC"
34
+ assert_equal "created_at", search.order_by
35
+ assert_equal "created_at DESC", search.order
36
+
37
+ search.order = "\"users\".updated_at ASC"
38
+ assert_equal({"users" => "updated_at"}, search.order_by)
39
+ assert_equal "\"users\".updated_at ASC", search.order
40
+
41
+ search.order = "`users`.first_name DESC"
42
+ assert_equal({"users" => "first_name"}, search.order_by)
43
+ assert_equal "`users`.first_name DESC", search.order
44
+
45
+ search.order = "`accounts`.name DESC"
46
+ assert_equal "name", search.order_by
47
+ assert_equal "`accounts`.name DESC", search.order
48
+
49
+ search.order = "accounts.name DESC"
50
+ assert_equal "name", search.order_by
51
+ assert_equal "accounts.name DESC", search.order
52
+
53
+ search.order = "`users`.first_name DESC, name DESC, `accounts`.id DESC"
54
+ assert_equal [{"users" => "first_name"}, "name", "id"], search.order_by
55
+ assert_equal "`users`.first_name DESC, name DESC, `accounts`.id DESC", search.order
56
+
57
+ search.order = "`users`.first_name DESC, `line_items`.id DESC, `accounts`.id DESC"
58
+ assert_equal [{"users" => "first_name"}, "id"], search.order_by
59
+ assert_equal "`users`.first_name DESC, `line_items`.id DESC, `accounts`.id DESC", search.order
60
+
61
+ search.order = "`line_items`.id DESC"
62
+ assert_equal nil, search.order_by
63
+ assert_equal "`line_items`.id DESC", search.order
64
+ end
65
+
66
+ def test_order_as
67
+ search = Account.new_search
68
+ assert_equal nil, search.order
69
+ assert_equal nil, search.order_as
70
+ assert search.asc?
71
+ assert !search.desc?
72
+
73
+ search.order_as = "DESC"
74
+ assert_equal nil, search.order_as
75
+ assert !search.desc?
76
+ assert_equal nil, search.order
77
+
78
+ search.order_by = "name"
79
+ assert_equal "\"accounts\".\"name\" DESC", search.order
80
+
81
+ search.order_as = "ASC"
82
+ assert_equal "\"accounts\".\"name\" ASC", search.order
83
+ assert search.asc?
84
+
85
+ search.order = "id ASC"
86
+ assert_equal "ASC", search.order_as
87
+ assert search.asc?
88
+ assert_equal "id ASC", search.order
89
+
90
+ search.order = "id DESC"
91
+ assert_equal "DESC", search.order_as
92
+ assert search.desc?
93
+ assert_equal "id DESC", search.order
94
+
95
+ search.order_by = "name"
96
+ assert_equal "DESC", search.order_as
97
+ assert search.desc?
98
+ assert_equal "\"accounts\".\"name\" DESC", search.order
99
+
100
+ assert_raise(ArgumentError) { search.order_as = "awesome" }
101
+ end
102
+
103
+ def test_order_by_auto_joins
104
+ search = Account.new_search
105
+ assert_equal nil, search.order_by_auto_joins
106
+ search.order_by = :name
107
+ assert_equal nil, search.order_by_auto_joins
108
+ search.order_by = {:users => :first_name}
109
+ assert_equal :users, search.order_by_auto_joins
110
+ search.order_by = [{:users => :first_name}, {:orders => :total}, {:users => {:user_groups => :name}}]
111
+ assert_equal [:users, :orders, {:users => :user_groups}], search.order_by_auto_joins
112
+ search.priority_order_by = {:users => :first_name}
113
+ assert_equal [:users, :orders, {:users => :user_groups}], search.order_by_auto_joins
114
+ search.priority_order_by = {:users => {:orders => :total}}
115
+ assert_equal({:users => :orders}, search.priority_order_by_auto_joins)
116
+ end
117
+
118
+ def test_priority_order_by
119
+ search = Account.new_search
120
+ assert_equal nil, search.priority_order
121
+ assert_equal nil, search.priority_order_by
122
+ assert_equal nil, search.priority_order_as
123
+
124
+ search.priority_order_by = :name
125
+ assert_equal "\"accounts\".\"name\"", search.priority_order
126
+ assert_equal "\"accounts\".\"name\"", search.sanitize[:order]
127
+ assert_equal nil, search.order
128
+ assert_equal :name, search.priority_order_by
129
+ assert_equal nil, search.priority_order_as
130
+
131
+ search.order_by = :id
132
+ assert_equal "\"accounts\".\"name\", \"accounts\".\"id\"", search.sanitize[:order]
133
+ search.order_as = "DESC"
134
+ assert_equal "\"accounts\".\"name\", \"accounts\".\"id\" DESC", search.sanitize[:order]
135
+ end
136
+
137
+ def test_priority_order_as
138
+ search = Account.new_search
139
+ assert_equal nil, search.priority_order_as
140
+ assert_equal nil, search.order_as
141
+ search.priority_order_as = "ASC"
142
+ assert_equal nil, search.priority_order_as
143
+ assert_equal nil, search.order_as
144
+ search.priority_order_by = :name
145
+ assert_equal "ASC", search.priority_order_as
146
+ assert_equal nil, search.order_as
147
+ search.priority_order_as = "DESC"
148
+ assert_equal "DESC", search.priority_order_as
149
+ assert_equal nil, search.order_as
150
+ assert_raise(ArgumentError) { search.priority_order_as = "awesome" }
151
+ search.priority_order = nil
152
+ assert_equal nil, search.priority_order_as
153
+ assert_equal nil, search.order_as
154
+ end
155
+
156
+ def test_sanitize
157
+ # tested in test_priority_order_by
158
+ end
159
+
160
+ def test_ordering_includes_blank
161
+ search = User.new_search!
162
+ search.order_by = {:account => :name}
163
+ assert_equal 4, search.count
164
+ end
165
+ end