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,52 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestConditionBase < Test::Unit::TestCase
4
+ def test_condition_type_name
5
+ assert_equal "equals", Searchlogic::Condition::Equals.condition_type_name
6
+ assert_equal "keywords", Searchlogic::Condition::Keywords.condition_type_name
7
+ assert_equal "greater_than_or_equal_to", Searchlogic::Condition::GreaterThanOrEqualTo.condition_type_name
8
+ end
9
+
10
+ def test_ignore_meaningless_value?
11
+ assert !Searchlogic::Condition::Equals.ignore_meaningless_value?
12
+ assert Searchlogic::Condition::Keywords.ignore_meaningless_value?
13
+ assert !Searchlogic::Condition::NotEqual.ignore_meaningless_value?
14
+ end
15
+
16
+ def test_value_type
17
+ assert_equal nil, Searchlogic::Condition::Equals.value_type
18
+ assert_equal nil, Searchlogic::Condition::Keywords.value_type
19
+ assert_equal :boolean, Searchlogic::Condition::Nil.value_type
20
+ assert_equal :boolean, Searchlogic::Condition::Blank.value_type
21
+ assert_equal nil, Searchlogic::Condition::GreaterThan.value_type
22
+ end
23
+
24
+ def test_initialize
25
+ condition = Searchlogic::Condition::Keywords.new(Account, :column => Account.columns_hash["name"])
26
+ assert_equal condition.klass, Account
27
+ assert_equal Account.columns_hash["name"], condition.column
28
+
29
+ condition = Searchlogic::Condition::GreaterThan.new(Account, :column => "id")
30
+ assert_equal Account.columns_hash["id"], condition.column
31
+
32
+ condition = Searchlogic::Condition::GreaterThan.new(Account, :column => "id", :column_type => :string, :column_sql_format => "some sql")
33
+ assert_equal Account.columns_hash["id"], condition.column
34
+ condition.value = "awesome"
35
+ assert_equal ["some sql > ?", "awesome"], condition.sanitize
36
+ end
37
+
38
+ def test_explicitly_set_value
39
+ condition = Searchlogic::Condition::Keywords.new(Account, :column => Account.columns_hash["name"])
40
+ assert !condition.explicitly_set_value?
41
+ condition.value = "test"
42
+ assert condition.explicitly_set_value?
43
+ end
44
+
45
+ def test_sanitize
46
+ # This is tested thoroughly in test_condition_types
47
+ end
48
+
49
+ def test_value
50
+ # This is tested thoroughly in test_condition_types
51
+ end
52
+ end
@@ -0,0 +1,143 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestConditionTypes < Test::Unit::TestCase
4
+ def test_sanitize
5
+ condition = Searchlogic::Condition::BeginsWith.new(Account, :column => Account.columns_hash["name"])
6
+ condition.value = "Binary"
7
+ assert_equal ["\"accounts\".\"name\" LIKE ?", "Binary%"], condition.sanitize
8
+
9
+ condition = Searchlogic::Condition::Blank.new(Account, :column => Account.columns_hash["id"])
10
+ condition.value = "true"
11
+ assert_equal "\"accounts\".\"id\" IS NULL or \"accounts\".\"id\" = '' or \"accounts\".\"id\" = false", condition.sanitize
12
+
13
+ condition = Searchlogic::Condition::Blank.new(Account, :column => Account.columns_hash["id"])
14
+ condition.value = "false"
15
+ assert_equal "\"accounts\".\"id\" IS NOT NULL and \"accounts\".\"id\" != '' and \"accounts\".\"id\" != false", condition.sanitize
16
+
17
+ condition = Searchlogic::Condition::Blank.new(Account, :column => Account.columns_hash["id"])
18
+ condition.value = true
19
+ assert_equal "\"accounts\".\"id\" IS NULL or \"accounts\".\"id\" = '' or \"accounts\".\"id\" = false", condition.sanitize
20
+
21
+ condition = Searchlogic::Condition::Blank.new(Account, :column => Account.columns_hash["id"])
22
+ condition.value = false
23
+ assert_equal "\"accounts\".\"id\" IS NOT NULL and \"accounts\".\"id\" != '' and \"accounts\".\"id\" != false", condition.sanitize
24
+
25
+ condition = Searchlogic::Condition::Blank.new(Account, :column => Account.columns_hash["id"])
26
+ condition.value = nil
27
+ assert_equal nil, condition.sanitize
28
+
29
+ condition = Searchlogic::Condition::Blank.new(Account, :column => Account.columns_hash["id"])
30
+ condition.value = ""
31
+ assert_equal nil, condition.sanitize
32
+
33
+ condition = Searchlogic::Condition::ChildOf.new(User)
34
+ condition.value = User.first.id
35
+ assert_equal ["\"users\".\"parent_id\" = ?", User.first.id], condition.sanitize
36
+
37
+ condition = Searchlogic::Condition::ChildOf.new(User)
38
+ condition.value = User.first
39
+ assert_equal ["\"users\".\"parent_id\" = ?", User.first.id], condition.sanitize
40
+
41
+ condition = Searchlogic::Condition::DescendantOf.new(User)
42
+ condition.value = User.find(1)
43
+ assert_equal ["\"users\".\"id\" = ? OR \"users\".\"id\" = ?", 2, 3], condition.sanitize
44
+
45
+ condition = Searchlogic::Condition::EndsWith.new(Account, :column => Account.columns_hash["name"])
46
+ condition.value = "Binary"
47
+ assert_equal ["\"accounts\".\"name\" LIKE ?", "%Binary"], condition.sanitize
48
+
49
+ condition = Searchlogic::Condition::Equals.new(Account, :column => Account.columns_hash["id"])
50
+ condition.value = 12
51
+ assert_equal ["\"accounts\".\"id\" = ?", 12], condition.sanitize
52
+
53
+ condition = Searchlogic::Condition::Equals.new(Account, :column => Account.columns_hash["id"])
54
+ condition.value = [1,2,3,4]
55
+ assert_equal ["\"accounts\".\"id\" IN (?)", [1, 2, 3, 4]], condition.sanitize
56
+
57
+ condition = Searchlogic::Condition::Equals.new(Account, :column => Account.columns_hash["id"])
58
+ condition.value = (1..10)
59
+ assert_equal ["\"accounts\".\"id\" BETWEEN ? AND ?", 1, 10], condition.sanitize
60
+
61
+ condition = Searchlogic::Condition::GreaterThan.new(Account, :column => Account.columns_hash["id"])
62
+ condition.value = 2
63
+ assert_equal ["\"accounts\".\"id\" > ?", 2], condition.sanitize
64
+
65
+ condition = Searchlogic::Condition::GreaterThanOrEqualTo.new(Account, :column => Account.columns_hash["id"])
66
+ condition.value = 2
67
+ assert_equal ["\"accounts\".\"id\" >= ?", 2], condition.sanitize
68
+
69
+ condition = Searchlogic::Condition::InclusiveDescendantOf.new(User)
70
+ condition.value = User.find(1)
71
+ assert_equal ["(\"users\".\"id\" = ?) OR (\"users\".\"id\" = ? OR \"users\".\"id\" = ?)", 1, 2, 3], condition.sanitize
72
+
73
+ condition = Searchlogic::Condition::Like.new(Account, :column => Account.columns_hash["name"])
74
+ condition.value = "Binary and blah"
75
+ assert_equal ["\"accounts\".\"name\" LIKE ?", "%Binary and blah%"], condition.sanitize
76
+
77
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
78
+ condition.value = true
79
+ assert_equal "\"accounts\".\"id\" IS NULL", condition.sanitize
80
+
81
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
82
+ condition.value = false
83
+ assert_equal "\"accounts\".\"id\" IS NOT NULL", condition.sanitize
84
+
85
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
86
+ condition.value = "true"
87
+ assert_equal "\"accounts\".\"id\" IS NULL", condition.sanitize
88
+
89
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
90
+ condition.value = "false"
91
+ assert_equal "\"accounts\".\"id\" IS NOT NULL", condition.sanitize
92
+
93
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
94
+ condition.value = nil
95
+ assert_equal nil, condition.sanitize
96
+
97
+ condition = Searchlogic::Condition::Nil.new(Account, :column => Account.columns_hash["id"])
98
+ condition.value = ""
99
+ assert_equal nil, condition.sanitize
100
+
101
+ condition = Searchlogic::Condition::NotEqual.new(Account, :column => Account.columns_hash["id"])
102
+ condition.value = 12
103
+ assert_equal ["\"accounts\".\"id\" != ?", 12], condition.sanitize
104
+
105
+ condition = Searchlogic::Condition::NotEqual.new(Account, :column => Account.columns_hash["id"])
106
+ condition.value = [1,2,3,4]
107
+ assert_equal ["\"accounts\".\"id\" NOT IN (?)", [1, 2, 3, 4]], condition.sanitize
108
+
109
+ condition = Searchlogic::Condition::NotEqual.new(Account, :column => Account.columns_hash["id"])
110
+ condition.value = (1..10)
111
+ assert_equal ["\"accounts\".\"id\" NOT BETWEEN ? AND ?", 1, 10], condition.sanitize
112
+
113
+ condition = Searchlogic::Condition::NotNil.new(Account, :column => Account.columns_hash["created_at"])
114
+ condition.value = "1"
115
+ assert_equal "\"accounts\".\"created_at\" IS NOT NULL", condition.sanitize
116
+ condition.value = "false"
117
+ assert_equal "\"accounts\".\"created_at\" IS NULL", condition.sanitize
118
+
119
+ condition = Searchlogic::Condition::Keywords.new(Account, :column => Account.columns_hash["name"])
120
+ condition.value = "freedom yeah, freedom YEAH right"
121
+ assert_equal ["\"accounts\".\"name\" LIKE ? AND \"accounts\".\"name\" LIKE ? AND \"accounts\".\"name\" LIKE ?", "%freedom%", "%yeah%", "%right%"], condition.sanitize
122
+
123
+ condition = Searchlogic::Condition::Keywords.new(Account, :column => Account.columns_hash["name"])
124
+ condition.value = "%^$*(^$)"
125
+ assert_equal nil, condition.sanitize
126
+
127
+ condition = Searchlogic::Condition::Keywords.new(Account, :column => Account.columns_hash["name"])
128
+ condition.value = "%^$*(^$) àáâãäåßéèêëìíîïñòóôõöùúûüýÿ"
129
+ assert_equal ["\"accounts\".\"name\" LIKE ?", "%àáâãäåßéèêëìíîïñòóôõöùúûüýÿ%"], condition.sanitize
130
+
131
+ condition = Searchlogic::Condition::LessThan.new(Account, :column => Account.columns_hash["id"])
132
+ condition.value = 2
133
+ assert_equal ["\"accounts\".\"id\" < ?", 2], condition.sanitize
134
+
135
+ condition = Searchlogic::Condition::LessThanOrEqualTo.new(Account, :column => Account.columns_hash["id"])
136
+ condition.value = 2
137
+ assert_equal ["\"accounts\".\"id\" <= ?", 2], condition.sanitize
138
+
139
+ condition = Searchlogic::Condition::SiblingOf.new(User)
140
+ condition.value = User.find(2)
141
+ assert_equal ["(\"users\".\"id\" != ?) AND (\"users\".\"parent_id\" = ?)", 2, 1], condition.sanitize
142
+ end
143
+ end
@@ -0,0 +1,242 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestConditionsBase < Test::Unit::TestCase
4
+ def test_register_conditions
5
+ Searchlogic::Conditions::Base.register_condition(Searchlogic::Condition::Keywords)
6
+ assert [Searchlogic::Condition::Keywords], Searchlogic::Conditions::Base.conditions
7
+
8
+ Searchlogic::Conditions::Base.register_condition(Searchlogic::Condition::Like)
9
+ assert [Searchlogic::Condition::Keywords, Searchlogic::Condition::Like], Searchlogic::Conditions::Base.conditions
10
+ end
11
+
12
+ def test_association_names
13
+ assert_equal ["dogs", "children", "user_groups", "orders", "account", "parent", "cats"], Searchlogic::Cache::UserConditions.association_names
14
+ assert_equal ["admin", "orders", "users"], Searchlogic::Cache::AccountConditions.association_names
15
+ end
16
+
17
+ def test_condition_names
18
+ # This is tested thoroughly through the tests
19
+ end
20
+
21
+ def test_needed
22
+ assert !Searchlogic::Conditions::Base.needed?(User, {})
23
+ assert !Searchlogic::Conditions::Base.needed?(User, {:first_name => "Ben"})
24
+ assert Searchlogic::Conditions::Base.needed?(User, {:first_name_contains => "Awesome"})
25
+ assert !Searchlogic::Conditions::Base.needed?(User, {"orders.id" => 2})
26
+ end
27
+
28
+ def test_initialize
29
+ conditions = Searchlogic::Cache::AccountConditions.new(:name_contains => "Binary")
30
+ assert_equal conditions.klass, Account
31
+ assert_equal conditions.name_contains, "Binary"
32
+ end
33
+
34
+ def test_any
35
+ conditions = Searchlogic::Cache::AccountConditions.new
36
+ assert !conditions.any?
37
+
38
+ conditions = Searchlogic::Cache::AccountConditions.new(:any => true)
39
+ assert conditions.any?
40
+ conditions.any = "false"
41
+ assert !conditions.any?
42
+
43
+ conditions = Searchlogic::Cache::AccountConditions.new
44
+ conditions.name_contains = "Binary"
45
+ assert_equal ["\"accounts\".\"name\" LIKE ?", "%Binary%"], conditions.sanitize
46
+ conditions.id = 1
47
+ assert_equal ["(\"accounts\".\"id\" = ?) AND (\"accounts\".\"name\" LIKE ?)", 1, "%Binary%"], conditions.sanitize
48
+ conditions.any = true
49
+ assert_equal ["(\"accounts\".\"id\" = ?) OR (\"accounts\".\"name\" LIKE ?)", 1, "%Binary%"], conditions.sanitize
50
+ conditions.any = false
51
+ assert_equal ["(\"accounts\".\"id\" = ?) AND (\"accounts\".\"name\" LIKE ?)", 1, "%Binary%"], conditions.sanitize
52
+ end
53
+
54
+ def test_auto_joins
55
+ conditions = Searchlogic::Cache::AccountConditions.new
56
+ assert_equal conditions.auto_joins, nil
57
+
58
+ conditions.name_like = "Binary"
59
+ assert_equal conditions.auto_joins, nil
60
+
61
+ conditions.users.first_name_like = "Ben"
62
+ assert_equal conditions.auto_joins, :users
63
+
64
+ conditions.users.orders.description_like = "apple"
65
+ assert_equal conditions.auto_joins, {:users => :orders}
66
+ end
67
+
68
+ def test_inspect
69
+ conditions = Searchlogic::Cache::AccountConditions.new
70
+ assert_nothing_raised { conditions.inspect }
71
+ end
72
+
73
+ def test_sanitize
74
+ conditions = Searchlogic::Cache::AccountConditions.new
75
+ conditions.name_contains = "Binary"
76
+ conditions.id_gt = 5
77
+ now = Time.now
78
+ conditions.created_after = now
79
+ assert_equal ["(\"accounts\".\"created_at\" > ?) AND (\"accounts\".\"id\" > ?) AND (\"accounts\".\"name\" LIKE ?)", now, 5, "%Binary%"], conditions.sanitize
80
+
81
+ # test out associations
82
+ conditions.users.first_name_like = "Ben"
83
+ conditions.users.id_gt = 10
84
+ conditions.users.orders.total_lt = 500
85
+ assert_equal ["(\"accounts\".\"created_at\" > ?) AND (\"accounts\".\"id\" > ?) AND (\"accounts\".\"name\" LIKE ?) AND ((\"users\".\"first_name\" LIKE ?) AND (\"users\".\"id\" > ?) AND (\"orders\".\"total\" < ?))", now, 5, "%Binary%", "%Ben%", 10, 500], conditions.sanitize
86
+
87
+ # test that raw sql is returned
88
+ conditions.conditions = "awesome"
89
+ assert_equal "awesome", conditions.sanitize
90
+ end
91
+
92
+ def test_conditions
93
+ conditions = Searchlogic::Cache::AccountConditions.new
94
+ now = Time.now
95
+ v = {:name_like => "Binary", :created_at_greater_than => now}
96
+ conditions.conditions = v
97
+ assert_equal v, conditions.conditions
98
+
99
+ sql = "id in (1,2,3,4)"
100
+ conditions.conditions = sql
101
+ assert_equal sql, conditions.conditions
102
+ assert_equal({}, conditions.send(:objects))
103
+
104
+ v2 = {:id_less_than => 5, :name_begins_with => "Beginning of string"}
105
+ conditions.conditions = v2
106
+ assert_equal v2, conditions.conditions
107
+
108
+ v = {:name_like => "Binary", :created_at_greater_than => now}
109
+ conditions.conditions = v
110
+ assert_equal v2.merge(v), conditions.conditions
111
+
112
+ sql2 = "id > 5 and name = 'Test'"
113
+ conditions.conditions = sql2
114
+ assert_equal sql2, conditions.conditions
115
+ assert_equal({}, conditions.send(:objects))
116
+
117
+ conditions.name_contains = "awesome"
118
+ assert_equal({:name_like => "awesome"}, conditions.conditions)
119
+
120
+ now = Time.now
121
+ conditions.conditions = {:id_gt => "", :id => "", :name => ["", "", ""], :created_at => ["", now], :name_starts_with => "Ben"}
122
+ assert_equal({:name_like => "awesome", :name_begins_with => "Ben", :created_at_equals => now}, conditions.conditions)
123
+ end
124
+
125
+ # Other general usage tests, need to clean these up
126
+
127
+ def test_setting_conditions
128
+ [Account, User, Order].each do |klass|
129
+ conditions = "Searchlogic::Cache::#{klass}Conditions".constantize.new
130
+ conditions.class.condition_names.each do |condition_name|
131
+ conditions.send("#{condition_name}=", 1)
132
+ assert_equal 1, conditions.send(condition_name)
133
+ end
134
+ end
135
+ end
136
+
137
+ def test_accessible_protected_conditions
138
+ Account.conditions_accessible << :name_contains
139
+ conditions = Searchlogic::Cache::AccountConditions.new
140
+ conditions.conditions = {:created_after => Time.now, :name_contains => "Binary"}
141
+ assert({:name_contains => "Binary"}, conditions.conditions)
142
+ Account.send(:write_inheritable_attribute, :conditions_accessible, nil)
143
+
144
+ Account.conditions_protected << :name_contains
145
+ conditions = Searchlogic::Cache::AccountConditions.new
146
+ now = Time.now
147
+ conditions.conditions = {:created_after => now, :name_contains => "Binary"}
148
+ assert({:created_after => now}, conditions.conditions)
149
+ Account.send(:write_inheritable_attribute, :conditions_protected, nil)
150
+ end
151
+
152
+ def test_assert_valid_values
153
+ conditions = Searchlogic::Cache::UserConditions.new
154
+ assert_raise(NoMethodError) { conditions.conditions = {:unknown => "blah"} }
155
+ assert_nothing_raised { conditions.conditions = {:first_name => "blah"} }
156
+ assert_nothing_raised { conditions.conditions = {:first_name_contains => "blah"} }
157
+ end
158
+
159
+ def test_setting_associations
160
+ conditions = Searchlogic::Cache::AccountConditions.new(:users => {:first_name_like => "Ben"})
161
+ assert_equal conditions.users.first_name_like, "Ben"
162
+
163
+ conditions.users.last_name_begins_with = "Ben"
164
+ assert_equal conditions.users.last_name_begins_with, "Ben"
165
+ end
166
+
167
+ def test_virtual_columns
168
+ conditions = Searchlogic::Cache::AccountConditions.new
169
+ conditions.hour_of_created_gt = 2
170
+ assert_equal ["strftime('%H', \"accounts\".\"created_at\") > ?", 2], conditions.sanitize
171
+ conditions.dow_of_created_at_most = 5
172
+ assert_equal ["(strftime('%w', \"accounts\".\"created_at\") <= ?) AND (strftime('%H', \"accounts\".\"created_at\") > ?)", 5, 2], conditions.sanitize
173
+ conditions.month_of_created_at_nil = true
174
+ assert_equal ["(strftime('%w', \"accounts\".\"created_at\") <= ?) AND (strftime('%H', \"accounts\".\"created_at\") > ?) AND (strftime('%m', \"accounts\".\"created_at\") IS NULL)", 5, 2], conditions.sanitize
175
+ conditions.min_of_hour_of_month_of_created_at_nil = true
176
+ assert_equal ["(strftime('%w', \"accounts\".\"created_at\") <= ?) AND (strftime('%H', \"accounts\".\"created_at\") > ?) AND (strftime('%m', strftime('%H', strftime('%M', \"accounts\".\"created_at\"))) IS NULL) AND (strftime('%m', \"accounts\".\"created_at\") IS NULL)", 5, 2], conditions.sanitize
177
+ end
178
+
179
+ def test_objects
180
+ conditions = Searchlogic::Cache::AccountConditions.new
181
+ assert_equal({}, conditions.send(:objects))
182
+
183
+ conditions.name_contains = "Binary"
184
+ assert_equal 1, conditions.send(:objects).size
185
+
186
+ conditions.users.first_name_contains = "Ben"
187
+ assert_equal 2, conditions.send(:objects).size
188
+ end
189
+
190
+ def test_reset
191
+ conditions = Searchlogic::Cache::AccountConditions.new
192
+
193
+ conditions.name_contains = "Binary"
194
+ assert_equal 1, conditions.send(:objects).size
195
+
196
+ conditions.reset_name_like!
197
+ conditions.reset_name_contains! # should set up aliases for reset
198
+ assert_equal({}, conditions.send(:objects))
199
+
200
+ conditions.users.first_name_like = "Ben"
201
+ assert_equal 1, conditions.send(:objects).size
202
+
203
+ conditions.reset_users!
204
+ assert_equal({}, conditions.send(:objects))
205
+
206
+ conditions.name_begins_with ="Binary"
207
+ conditions.users.orders.total_gt = 200
208
+ assert_equal 2, conditions.send(:objects).size
209
+
210
+ conditions.reset_name_begins_with!
211
+ assert_equal 1, conditions.send(:objects).size
212
+
213
+ conditions.reset_users!
214
+ assert_equal({}, conditions.send(:objects))
215
+ end
216
+
217
+ def test_method_conflicts
218
+ conditions = Searchlogic::Cache::AccountConditions.new
219
+ assert_equal nil, conditions.id
220
+ end
221
+
222
+ def test_sti
223
+ #s = User.new_search
224
+ #s.conditions.dogs.description_like = "awesome"
225
+ #s.conditions.cats.description_like = "awesome"
226
+ #s.select = "ass"
227
+ #s.all
228
+
229
+ joins = []
230
+ join_dependency = ::ActiveRecord::Associations::ClassMethods::JoinDependency.new(User, [:dogs, :cats], nil)
231
+ join_dependency.join_associations.each_with_index do |assoc, index|
232
+ #raise assoc.aliased_table_name.inspect if index == 1
233
+ joins << assoc.association_join
234
+ end
235
+ #raise joins.inspect
236
+
237
+ conditions = Searchlogic::Cache::UserConditions.new
238
+ conditions.dogs.description_like = "Harry"
239
+ r = User.reflect_on_association(:dogs)
240
+ #raise r.inspect
241
+ end
242
+ end
@@ -0,0 +1,16 @@
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