searchlogic 1.5.3

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