aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test
diff options
context:
space:
mode:
authorRob Gilson <thatotherdude@gmail.com>2014-02-27 13:34:21 -0500
committerYves Senn <yves.senn@gmail.com>2014-04-16 14:32:02 +0200
commitfe4b0eee05f59831e1468ed50f55fbad0ce11e1d (patch)
tree41794c701daa3067d11ad7faa77bff7b75bebfc1 /activerecord/test
parentd46771b6fe19302a8808e230bd2fee98d07b87c4 (diff)
downloadrails-fe4b0eee05f59831e1468ed50f55fbad0ce11e1d.tar.gz
rails-fe4b0eee05f59831e1468ed50f55fbad0ce11e1d.tar.bz2
rails-fe4b0eee05f59831e1468ed50f55fbad0ce11e1d.zip
SQL Like escaping helper method. [Rob Gilson & Yves Senn]
Closes #14222. This is a follow up to #6104 This does not have the backwards compatibility issues brought up in implementation to break.
Diffstat (limited to 'activerecord/test')
-rw-r--r--activerecord/test/cases/sanitize_test.rb26
1 files changed, 26 insertions, 0 deletions
diff --git a/activerecord/test/cases/sanitize_test.rb b/activerecord/test/cases/sanitize_test.rb
index 954eab8022..18182efc46 100644
--- a/activerecord/test/cases/sanitize_test.rb
+++ b/activerecord/test/cases/sanitize_test.rb
@@ -51,4 +51,30 @@ class SanitizeTest < ActiveRecord::TestCase
select_author_sql = Post.send(:sanitize_sql_array, [''])
assert_equal('', select_author_sql)
end
+
+ def test_sanitize_sql_like
+ assert_equal '100\%', Binary.send(:sanitize_sql_like, '100%')
+ assert_equal 'snake\_cased\_string', Binary.send(:sanitize_sql_like, 'snake_cased_string')
+ assert_equal 'C:\\\\Programs\\\\MsPaint', Binary.send(:sanitize_sql_like, 'C:\\Programs\\MsPaint')
+ assert_equal 'normal string 42', Binary.send(:sanitize_sql_like, 'normal string 42')
+ end
+
+ def test_sanitize_sql_like_with_custom_escape_character
+ assert_equal '100!%', Binary.send(:sanitize_sql_like, '100%', '!')
+ assert_equal 'snake!_cased!_string', Binary.send(:sanitize_sql_like, 'snake_cased_string', '!')
+ assert_equal 'C:!\\Programs!\\MsPaint', Binary.send(:sanitize_sql_like, 'C:\\Programs\\MsPaint', '!')
+ assert_equal 'normal string 42', Binary.send(:sanitize_sql_like, 'normal string 42', '!')
+ end
+
+ def test_sanitize_sql_like_example_use_case
+ searchable_post = Class.new(Post) do
+ def self.search(term)
+ where("title LIKE ?", sanitize_sql_like(term))
+ end
+ end
+
+ assert_sql /LIKE '20\\% \\_reduction\\_'/ do
+ searchable_post.search("20% _reduction_").to_a
+ end
+ end
end