searchlogic 1.5.3 → 1.5.4

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 (69) hide show
  1. data/CHANGELOG.rdoc +6 -0
  2. data/Manifest +37 -18
  3. data/README.rdoc +13 -17
  4. data/TODO.rdoc +1 -3
  5. data/lib/searchlogic.rb +6 -6
  6. data/lib/searchlogic/active_record/connection_adapters/sqlite_adapter.rb +9 -9
  7. data/lib/searchlogic/conditions/base.rb +20 -6
  8. data/lib/searchlogic/search/base.rb +0 -5
  9. data/lib/searchlogic/search/searching.rb +3 -1
  10. data/lib/searchlogic/version.rb +1 -1
  11. data/searchlogic.gemspec +4 -4
  12. data/test/active_record_tests/associations_test.rb +95 -0
  13. data/test/active_record_tests/base_test.rb +108 -0
  14. data/test/condition_tests/base_test.rb +54 -0
  15. data/test/condition_tests/begins_with_test.rb +11 -0
  16. data/test/condition_tests/blank_test.rb +31 -0
  17. data/test/condition_tests/child_of_test.rb +17 -0
  18. data/test/condition_tests/descendant_of_test.rb +16 -0
  19. data/test/condition_tests/ends_with_test.rb +11 -0
  20. data/test/condition_tests/equals_test.rb +19 -0
  21. data/test/condition_tests/greater_than_or_equal_to_test.rb +11 -0
  22. data/test/condition_tests/greater_than_test.rb +11 -0
  23. data/test/condition_tests/inclusive_descendant_of_test.rb +16 -0
  24. data/test/condition_tests/keyswords_test.rb +19 -0
  25. data/test/condition_tests/less_than_or_equal_to_test.rb +11 -0
  26. data/test/condition_tests/less_than_test.rb +11 -0
  27. data/test/condition_tests/like_test.rb +11 -0
  28. data/test/condition_tests/nil_test.rb +31 -0
  29. data/test/condition_tests/not_begin_with_test.rb +8 -0
  30. data/test/condition_tests/not_blank_test.rb +8 -0
  31. data/test/condition_tests/not_end_with_test.rb +8 -0
  32. data/test/condition_tests/not_equal_test.rb +19 -0
  33. data/test/condition_tests/not_have_keywords_test.rb +8 -0
  34. data/test/condition_tests/not_like_test.rb +8 -0
  35. data/test/condition_tests/not_nil_test.rb +13 -0
  36. data/test/condition_tests/sibling_of_test.rb +15 -0
  37. data/test/conditions_tests/base_test.rb +221 -0
  38. data/test/conditions_tests/protection_test.rb +18 -0
  39. data/test/{test_config.rb → config_test.rb} +1 -1
  40. data/test/fixtures/accounts.yml +0 -3
  41. data/test/fixtures/animals.yml +7 -0
  42. data/test/fixtures/orders.yml +2 -4
  43. data/test/fixtures/user_groups.yml +3 -9
  44. data/test/fixtures/users.yml +6 -12
  45. data/{test_libs → test/libs}/acts_as_tree.rb +0 -0
  46. data/{test_libs → test/libs}/rexml_fix.rb +0 -0
  47. data/test/modifier_tests/day_of_month_test.rb +16 -0
  48. data/test/search_tests/base_test.rb +237 -0
  49. data/test/search_tests/conditions_test.rb +21 -0
  50. data/test/search_tests/ordering_test.rb +167 -0
  51. data/test/search_tests/pagination_test.rb +74 -0
  52. data/test/search_tests/protection_test.rb +26 -0
  53. data/test/test_helper.rb +79 -83
  54. metadata +73 -32
  55. data/examples/README.rdoc +0 -4
  56. data/test/fixtures/cats.yml +0 -3
  57. data/test/fixtures/dogs.yml +0 -3
  58. data/test/test_active_record_associations.rb +0 -81
  59. data/test/test_active_record_base.rb +0 -93
  60. data/test/test_condition_base.rb +0 -52
  61. data/test/test_condition_types.rb +0 -143
  62. data/test/test_conditions_base.rb +0 -242
  63. data/test/test_conditions_protection.rb +0 -16
  64. data/test/test_search_base.rb +0 -227
  65. data/test/test_search_conditions.rb +0 -19
  66. data/test/test_search_ordering.rb +0 -165
  67. data/test/test_search_pagination.rb +0 -72
  68. data/test/test_search_protection.rb +0 -24
  69. data/test_libs/ordered_hash.rb +0 -9
@@ -0,0 +1,237 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SearchTests
4
+ class BaseTest < ActiveSupport::TestCase
5
+ def test_needed
6
+ assert Searchlogic::Search::Base.needed?(Account, :page => 2, :conditions => {:name => "Ben"})
7
+ assert !Searchlogic::Search::Base.needed?(Account, :conditions => {:name => "Ben"})
8
+ assert Searchlogic::Search::Base.needed?(Account, :limit => 2, :conditions => {:name_contains => "Ben"})
9
+ assert !Searchlogic::Search::Base.needed?(Account, :limit => 2)
10
+ assert Searchlogic::Search::Base.needed?(Account, :per_page => 2)
11
+ end
12
+
13
+ def test_initialize
14
+ assert_nothing_raised { Account.new_search }
15
+ search = Account.new_search!(:conditions => {:name_like => "binary"}, :page => 2, :limit => 10, :readonly => true)
16
+ assert_equal Account, search.klass
17
+ assert_equal "binary", search.conditions.name_like
18
+ assert_equal 2, search.page
19
+ assert_equal 10, search.limit
20
+ assert_equal true, search.readonly
21
+ end
22
+
23
+ def test_acting_as_filter
24
+ search = Account.new_search
25
+ search.acting_as_filter = true
26
+ assert search.acting_as_filter?
27
+ search.acting_as_filter = false
28
+ assert !search.acting_as_filter?
29
+ end
30
+
31
+ def test_setting_first_level_options
32
+ 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)
33
+ assert_equal :users, search.include
34
+ assert_equal :users, search.joins
35
+ assert_equal 5, search.offset
36
+ assert_equal 20, search.limit
37
+ assert_equal "name ASC", search.order
38
+ assert_equal "name", search.select
39
+ assert_equal true, search.readonly
40
+ assert_equal "name", search.group
41
+ assert_equal "accounts", search.from
42
+ assert_equal true, search.lock
43
+
44
+ search = Account.new_search(:per_page => nil)
45
+
46
+ search.include = :users
47
+ assert_equal :users, search.include
48
+
49
+ # treat it like SQL, just like AR
50
+ search.joins = "users"
51
+ assert_equal "users", search.joins
52
+
53
+ search.page = 5
54
+ assert_equal 1, search.page
55
+ assert_nil search.offset
56
+
57
+ search.limit = 20
58
+ assert_equal search.limit, 20
59
+ assert_equal search.per_page, 20
60
+ assert_equal search.page, 5
61
+ assert_equal search.offset, 80
62
+ search.limit = nil
63
+ assert_nil search.limit
64
+ assert_nil search.per_page
65
+ assert_equal 1, search.page
66
+ assert_nil search.offset
67
+
68
+ search.offset = 50
69
+ assert_equal 50, search.offset
70
+ assert_equal 1, search.page
71
+ search.limit = 50
72
+ assert_equal 2, search.page
73
+ search.offset = nil
74
+ assert_nil search.offset
75
+ assert_equal 1, search.page
76
+
77
+ search.per_page = 2
78
+ assert_equal 2, search.per_page
79
+ assert_equal 2, search.limit
80
+ search.offset = 50
81
+ assert_equal 26, search.page
82
+ assert_equal 50, search.offset
83
+
84
+ search.order = "name ASC"
85
+ assert_equal search.order, "name ASC"
86
+
87
+ search.select = "name"
88
+ assert_equal search.select, "name"
89
+
90
+ search.readonly = true
91
+ assert_equal search.readonly, true
92
+
93
+ search.group = "name"
94
+ assert_equal search.group, "name"
95
+
96
+ search.from = "accounts"
97
+ assert_equal search.from, "accounts"
98
+
99
+ search.lock = true
100
+ assert_equal search.lock, true
101
+ end
102
+
103
+ def test_joins
104
+ search = Account.new_search
105
+ assert_nil search.joins
106
+ search.conditions.name_contains = "Binary"
107
+ assert_nil search.joins
108
+ search.conditions.users.first_name_contains = "Ben"
109
+ assert_equal(:users, search.joins)
110
+ search.conditions.users.orders.id_gt = 2
111
+ assert_equal({:users => :orders}, search.joins)
112
+ search.conditions.users.reset_orders!
113
+ assert_equal(:users, search.joins)
114
+ search.conditions.users.orders.id_gt = 2
115
+ search.conditions.reset_users!
116
+ assert_nil search.joins
117
+ end
118
+
119
+ def test_limit
120
+ search = Account.new_search
121
+ search.limit = 10
122
+ assert_equal 10, search.limit
123
+ search.page = 2
124
+ assert_equal 10, search.offset
125
+ search.limit = 25
126
+ assert_equal 25, search.offset
127
+ assert_equal 2, search.page
128
+ search.page = 5
129
+ assert_equal 5, search.page
130
+ assert_equal 25, search.limit
131
+ search.limit = 3
132
+ assert_equal 12, search.offset
133
+ end
134
+
135
+ def test_options
136
+ end
137
+
138
+ def test_sanitize
139
+ search = Account.new_search
140
+ search.per_page = 2
141
+ search.conditions.name_like = "Binary"
142
+ search.conditions.users.id_greater_than = 2
143
+ search.page = 3
144
+ search.readonly = true
145
+ assert_equal_find_options({:joins => :users, :offset => 4, :readonly => true, :conditions => ["(\"accounts\".\"name\" LIKE ?) AND (\"users\".\"id\" > ?)", "%Binary%", 2], :limit => 2 }, search.sanitize)
146
+ end
147
+
148
+ def test_scope
149
+ search = Account.new_search!
150
+ search.conditions = "some sql"
151
+ conditions = search.conditions
152
+ assert_equal "some sql", search.conditions.conditions
153
+ search.conditions = nil
154
+ assert_nil search.conditions.conditions
155
+ search.conditions = "some sql"
156
+ assert_equal "some sql", search.conditions.conditions
157
+ search.conditions = "some sql"
158
+ assert_equal "some sql", search.conditions.conditions
159
+ end
160
+
161
+ def test_searching
162
+ binary_logic = accounts(:binary_logic)
163
+ neco = accounts(:neco)
164
+ binary_fun = accounts(:binary_fun)
165
+
166
+ search = Account.new_search
167
+ search.conditions.name_like = "Binary"
168
+ assert_equal [binary_logic, binary_fun], search.all
169
+ assert_equal [binary_logic, binary_fun], search.find(:all)
170
+ assert_equal binary_logic, search.first
171
+ assert_equal binary_logic, search.find(:first)
172
+
173
+ search.per_page = 20
174
+ search.page = 2
175
+
176
+ assert_equal [], search.all
177
+ assert_equal [], search.find(:all)
178
+ assert_nil search.first
179
+ assert_nil search.find(:first)
180
+
181
+ search.per_page = 0
182
+ search.page = nil
183
+ search.conditions.users.first_name_contains = "Ben"
184
+ search.conditions.users.orders.description_keywords = "products, &*ap#ple $%^&*"
185
+ assert_equal [binary_logic], search.all
186
+ assert_equal [binary_logic], search.find(:all)
187
+ assert_equal binary_logic, search.first
188
+ assert_equal binary_logic, search.find(:first)
189
+
190
+ search = Account.new_search
191
+ search.select = "id, name"
192
+ assert_equal Account.all, search.all
193
+
194
+ search = Account.scope1.new_search!(:conditions => {:users => {:first_name_starts_with => "Ben"}})
195
+ assert_equal [binary_logic], search.all
196
+ search2 = search.dup
197
+ assert_equal [binary_logic], search2.all
198
+ end
199
+
200
+ def test_calculations
201
+ binary_logic = accounts(:binary_logic)
202
+ binary_fun = accounts(:binary_fun)
203
+ bens_order = orders(:bens_order)
204
+
205
+ search = Account.new_search
206
+ search.conditions.name_like = "Binary"
207
+ assert_equal (binary_logic.id + binary_fun.id) / 2.0, search.average('id')
208
+ assert_equal (binary_logic.id + binary_fun.id) / 2.0, search.calculate(:avg, 'id')
209
+ assert_equal binary_fun.id, search.calculate(:max, 'id')
210
+ assert_equal 2, search.count
211
+ assert_equal binary_fun.id, search.maximum('id')
212
+ assert_equal binary_logic.id, search.minimum('id')
213
+ assert_equal binary_logic.id + binary_fun.id, search.sum('id')
214
+
215
+ search.readonly = true
216
+ assert_equal binary_logic.id + binary_fun.id, search.sum('id')
217
+
218
+ search = Account.new_search(:conditions => {:users => {:orders => {:id_gt => bens_order.id}}})
219
+ assert_equal 1, search.count
220
+
221
+ search = Order.new_search(:conditions => {:user => {:account => {:id_gt => binary_logic.id}}})
222
+ assert_equal 1, search.count
223
+
224
+ search = UserGroup.new_search(:conditions => {:users => {:orders => {:id_gt => bens_order.id}}})
225
+ assert_equal 1, search.count
226
+ end
227
+
228
+ def test_inspect
229
+ search = Account.new_search
230
+ assert_nothing_raised { search.inspect }
231
+ end
232
+
233
+ def test_sti
234
+
235
+ end
236
+ end
237
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SearchTests
4
+ class TestSearchConditions < ActiveSupport::TestCase
5
+ def test_conditions
6
+ search = Account.new_search
7
+ assert_kind_of Searchlogic::Conditions::Base, search.conditions
8
+ assert_equal search.conditions.klass, Account
9
+
10
+ search.conditions = {:name_like => "Binary"}
11
+ assert_kind_of Searchlogic::Conditions::Base, search.conditions
12
+
13
+ search = Account.new_search(:conditions => {:name_like => "Ben"})
14
+ assert_equal({:name_like => "Ben"}, search.conditions.conditions)
15
+ end
16
+
17
+ def test_sanitize
18
+ # This is tested in test_search_base
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,167 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SearchTests
4
+ class OrderingTest < ActiveSupport::TestCase
5
+ def test_order_to_order_by
6
+ search = Account.new_search
7
+ search.order = "name"
8
+ assert_equal "name", search.order_by
9
+ search.order = "users.first_name"
10
+ assert_equal({"users" => "first_name"}, search.order_by)
11
+ search.order = "\"users\".\"first_name\""
12
+ assert_equal({"users" => "first_name"}, search.order_by)
13
+ search.order = "\"users\".\"first_name\", name ASC"
14
+ assert_equal([{"users" => "first_name"}, "name"], search.order_by)
15
+ end
16
+
17
+ def test_order_by
18
+ search = Account.new_search
19
+ assert_nil search.order
20
+ assert_nil search.order_by
21
+
22
+ search.order_by = "first_name"
23
+ assert_equal "first_name", search.order_by
24
+ assert_equal "\"accounts\".\"first_name\"", search.order
25
+
26
+ search.order_by = "last_name"
27
+ assert_equal "last_name", search.order_by
28
+ assert_equal "\"accounts\".\"last_name\"", search.order
29
+
30
+ search.order_by = ["first_name", "last_name"]
31
+ assert_equal ["first_name", "last_name"], search.order_by
32
+ assert_equal "\"accounts\".\"first_name\", \"accounts\".\"last_name\"", search.order
33
+
34
+ search.order = "created_at DESC"
35
+ assert_equal "created_at", search.order_by
36
+ assert_equal "created_at DESC", search.order
37
+
38
+ search.order = "\"users\".updated_at ASC"
39
+ assert_equal({"users" => "updated_at"}, search.order_by)
40
+ assert_equal "\"users\".updated_at ASC", search.order
41
+
42
+ search.order = "`users`.first_name DESC"
43
+ assert_equal({"users" => "first_name"}, search.order_by)
44
+ assert_equal "`users`.first_name DESC", search.order
45
+
46
+ search.order = "`accounts`.name DESC"
47
+ assert_equal "name", search.order_by
48
+ assert_equal "`accounts`.name DESC", search.order
49
+
50
+ search.order = "accounts.name DESC"
51
+ assert_equal "name", search.order_by
52
+ assert_equal "accounts.name DESC", search.order
53
+
54
+ search.order = "`users`.first_name DESC, name DESC, `accounts`.id DESC"
55
+ assert_equal [{"users" => "first_name"}, "name", "id"], search.order_by
56
+ assert_equal "`users`.first_name DESC, name DESC, `accounts`.id DESC", search.order
57
+
58
+ search.order = "`users`.first_name DESC, `line_items`.id DESC, `accounts`.id DESC"
59
+ assert_equal [{"users" => "first_name"}, "id"], search.order_by
60
+ assert_equal "`users`.first_name DESC, `line_items`.id DESC, `accounts`.id DESC", search.order
61
+
62
+ search.order = "`line_items`.id DESC"
63
+ assert_nil search.order_by
64
+ assert_equal "`line_items`.id DESC", search.order
65
+ end
66
+
67
+ def test_order_as
68
+ search = Account.new_search
69
+ assert_nil search.order
70
+ assert_nil search.order_as
71
+ assert search.asc?
72
+ assert !search.desc?
73
+
74
+ search.order_as = "DESC"
75
+ assert_nil search.order_as
76
+ assert !search.desc?
77
+ assert_nil search.order
78
+
79
+ search.order_by = "name"
80
+ assert_equal "\"accounts\".\"name\" DESC", search.order
81
+
82
+ search.order_as = "ASC"
83
+ assert_equal "\"accounts\".\"name\" ASC", search.order
84
+ assert search.asc?
85
+
86
+ search.order = "id ASC"
87
+ assert_equal "ASC", search.order_as
88
+ assert search.asc?
89
+ assert_equal "id ASC", search.order
90
+
91
+ search.order = "id DESC"
92
+ assert_equal "DESC", search.order_as
93
+ assert search.desc?
94
+ assert_equal "id DESC", search.order
95
+
96
+ search.order_by = "name"
97
+ assert_equal "DESC", search.order_as
98
+ assert search.desc?
99
+ assert_equal "\"accounts\".\"name\" DESC", search.order
100
+
101
+ assert_raise(ArgumentError) { search.order_as = "awesome" }
102
+ end
103
+
104
+ def test_order_by_auto_joins
105
+ search = Account.new_search
106
+ assert_nil search.order_by_auto_joins
107
+ search.order_by = :name
108
+ assert_nil search.order_by_auto_joins
109
+ search.order_by = {:users => :first_name}
110
+ assert_equal :users, search.order_by_auto_joins
111
+ search.order_by = [{:users => :first_name}, {:orders => :total}, {:users => {:user_groups => :name}}]
112
+ assert_equal [:users, :orders, {:users => :user_groups}], search.order_by_auto_joins
113
+ search.priority_order_by = {:users => :first_name}
114
+ assert_equal [:users, :orders, {:users => :user_groups}], search.order_by_auto_joins
115
+ search.priority_order_by = {:users => {:orders => :total}}
116
+ assert_equal({:users => :orders}, search.priority_order_by_auto_joins)
117
+ end
118
+
119
+ def test_priority_order_by
120
+ search = Account.new_search
121
+ assert_nil search.priority_order
122
+ assert_nil search.priority_order_by
123
+ assert_nil search.priority_order_as
124
+
125
+ search.priority_order_by = :name
126
+ assert_equal "\"accounts\".\"name\"", search.priority_order
127
+ assert_equal "\"accounts\".\"name\"", search.sanitize[:order]
128
+ assert_nil search.order
129
+ assert_equal :name, search.priority_order_by
130
+ assert_nil search.priority_order_as
131
+
132
+ search.order_by = :id
133
+ assert_equal "\"accounts\".\"name\", \"accounts\".\"id\"", search.sanitize[:order]
134
+ search.order_as = "DESC"
135
+ assert_equal "\"accounts\".\"name\", \"accounts\".\"id\" DESC", search.sanitize[:order]
136
+ end
137
+
138
+ def test_priority_order_as
139
+ search = Account.new_search
140
+ assert_nil search.priority_order_as
141
+ assert_nil search.order_as
142
+ search.priority_order_as = "ASC"
143
+ assert_nil search.priority_order_as
144
+ assert_nil search.order_as
145
+ search.priority_order_by = :name
146
+ assert_equal "ASC", search.priority_order_as
147
+ assert_nil search.order_as
148
+ search.priority_order_as = "DESC"
149
+ assert_equal "DESC", search.priority_order_as
150
+ assert_nil search.order_as
151
+ assert_raise(ArgumentError) { search.priority_order_as = "awesome" }
152
+ search.priority_order = nil
153
+ assert_nil search.priority_order_as
154
+ assert_nil search.order_as
155
+ end
156
+
157
+ def test_sanitize
158
+ # tested in test_priority_order_by
159
+ end
160
+
161
+ def test_ordering_includes_blank
162
+ search = User.new_search!
163
+ search.order_by = {:account => :name}
164
+ assert_equal 4, search.count
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,74 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module SearchTests
4
+ class PaginationTest < ActiveSupport::TestCase
5
+ def test_limit
6
+ search = Account.new_search
7
+ search.limit = 10
8
+ assert_equal 10, search.limit
9
+ search.page = 2
10
+ assert_equal 10, search.offset
11
+ search.limit = 25
12
+ assert_equal 25, search.offset
13
+ assert_equal 2, search.page
14
+ search.page = 5
15
+ assert_equal 5, search.page
16
+ assert_equal 25, search.limit
17
+ search.limit = 3
18
+ assert_equal 12, search.offset
19
+ end
20
+
21
+ def test_page
22
+ search = Account.new_search(:per_page => nil)
23
+ search.page = 2
24
+ assert_equal 1, search.page
25
+ search.per_page = 20
26
+ assert_equal 2, search.page
27
+ search.limit = 0
28
+ assert_equal 1, search.page
29
+ search.per_page = 20
30
+ assert_equal 2, search.page
31
+ search.limit = nil
32
+ assert_equal 1, search.page
33
+ end
34
+
35
+ def test_per_page
36
+ search = Account.new_search
37
+ search.per_page = 10
38
+ assert_equal 10, search.per_page
39
+ search.per_page = ""
40
+ assert_nil search.per_page
41
+ search.per_page = 40
42
+ assert_equal 40, search.per_page
43
+ search.per_page = nil
44
+ assert_nil search.per_page
45
+ search.per_page = 60
46
+ assert_equal 60, search.per_page
47
+ search.per_page = false
48
+ assert_nil search.per_page
49
+ end
50
+
51
+ def test_next_page
52
+
53
+ end
54
+
55
+ def test_prev_page
56
+
57
+ end
58
+
59
+ def test_page_count
60
+ search = Account.new_search
61
+ assert_equal 1, search.page_count
62
+ search.per_page = 1
63
+ assert_equal 3, search.page_count
64
+ search.per_page = 100
65
+ assert_equal 1, search.page_count
66
+
67
+ Searchlogic::Config.search.per_page = 1
68
+ search = Account.new_search
69
+ assert_equal 3, search.page_count
70
+ search.conditions.users.first_name_contains
71
+ assert_equal 3, search.page_count
72
+ end
73
+ end
74
+ end