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
@@ -1,16 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- class TestConditionsProtection < Test::Unit::TestCase
4
- def test_protection
5
- assert_raise(ArgumentError) { Account.new_search(:conditions => "(DELETE FROM users)") }
6
- assert_nothing_raised { Account.new_search!(:conditions => "(DELETE FROM users)") }
7
-
8
- account = Account.first
9
-
10
- assert_raise(ArgumentError) { account.users.new_search(:conditions => "(DELETE FROM users)") }
11
- assert_nothing_raised { account.users.new_search!(:conditions => "(DELETE FROM users)") }
12
-
13
- search = Account.new_search
14
- assert_raise(ArgumentError) { search.conditions = "(DELETE FROM users)" }
15
- end
16
- end
@@ -1,227 +0,0 @@
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
@@ -1,19 +0,0 @@
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
@@ -1,165 +0,0 @@
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
@@ -1,72 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- class TestSearchPagination < Test::Unit::TestCase
4
- def test_limit
5
- search = Account.new_search
6
- search.limit = 10
7
- assert_equal 10, search.limit
8
- search.page = 2
9
- assert_equal 10, search.offset
10
- search.limit = 25
11
- assert_equal 25, search.offset
12
- assert_equal 2, search.page
13
- search.page = 5
14
- assert_equal 5, search.page
15
- assert_equal 25, search.limit
16
- search.limit = 3
17
- assert_equal 12, search.offset
18
- end
19
-
20
- def test_page
21
- search = Account.new_search(:per_page => nil)
22
- search.page = 2
23
- assert_equal 1, search.page
24
- search.per_page = 20
25
- assert_equal 2, search.page
26
- search.limit = 0
27
- assert_equal 1, search.page
28
- search.per_page = 20
29
- assert_equal 2, search.page
30
- search.limit = nil
31
- assert_equal 1, search.page
32
- end
33
-
34
- def test_per_page
35
- search = Account.new_search
36
- search.per_page = 10
37
- assert_equal 10, search.per_page
38
- search.per_page = ""
39
- assert_equal nil, search.per_page
40
- search.per_page = 40
41
- assert_equal 40, search.per_page
42
- search.per_page = nil
43
- assert_equal nil, search.per_page
44
- search.per_page = 60
45
- assert_equal 60, search.per_page
46
- search.per_page = false
47
- assert_equal nil, search.per_page
48
- end
49
-
50
- def test_next_page
51
-
52
- end
53
-
54
- def test_prev_page
55
-
56
- end
57
-
58
- def test_page_count
59
- search = Account.new_search
60
- assert_equal 1, search.page_count
61
- search.per_page = 1
62
- assert_equal 3, search.page_count
63
- search.per_page = 100
64
- assert_equal 1, search.page_count
65
-
66
- Searchlogic::Config.search.per_page = 1
67
- search = Account.new_search
68
- assert_equal 3, search.page_count
69
- search.conditions.users.first_name_contains
70
- assert_equal 3, search.page_count
71
- end
72
- end