searchlogic 1.5.3 → 1.5.4

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