module Sanitize::Rails
# Test instrumentation
#
module TestHelpers
class << self
# Instruments the given base class with the +assert_sanitizes+
# helper, and memoizes the given options, accessible from the
# helper itself via the +valid+ and +invalid+ methods.
#
# Those methods contains two HTML strings, one assumed to be
# "invalid" and the other, well, "valid".
#
# In your ActiveSupport::Testcase:
#
# Sanitize::Rails::TestHelpers.setup(self,
# :invalid => 'some string',
# :valid => 'some string'
# )
#
def setup(base, options = {})
base.instance_eval { include TestHelpers }
@@options = options
end
def valid; @@options[:valid] rescue nil end
def invalid; @@options[:invalid] rescue nil end
end
# Verifies that the given `klass` sanitizes the given `fields`, by
# checking both the presence of the sanitize callback and that it
# works as expected, by setting the +invalid+ string first, invoking
# the callback and then checking that the string has been changed
# into the +valid+ one.
#
# If you pass an Hash as the last argument, it can contain `:valid`,
# `:invalid` and `:object` keys. The first two ones override the
# configured defaults, while the third executes assertions on the
# specified object. If no :object is given, a new object is instantiated
# by the given `klass` with no arguments.
#
# If neither `:valid`/`:invalid` strings are configured nor are passed
# via the options, the two default strings in the method source are
# used.
#
def assert_sanitizes(klass, *fields)
options = fields.extract_options!
sanitizer = Engine.method_for(fields)
# Verify the callback works
invalid = options[:invalid] || TestHelpers.invalid || 'ntani
'
valid = options[:valid] || TestHelpers.valid || 'ntani
'
object = options[:object] || klass.new
fields.each {|field| object.send("#{field}=", invalid) }
object.send sanitizer
fields.each {|field| assert_equal(valid, object.send(field)) }
end
end
end