aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/test/cases/attribute_methods_test.rb
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2011-09-12 22:12:12 +0100
committerJon Leighton <j@jonathanleighton.com>2011-09-13 00:01:58 +0100
commitac687ed651773fccecbc22cd6d8b07d5439ceb76 (patch)
treeeba4a000c8053dbe32f648d6042a494a2d16095f /activemodel/test/cases/attribute_methods_test.rb
parentcf115d2f8ef48764e095aa453f729b60705088f1 (diff)
downloadrails-ac687ed651773fccecbc22cd6d8b07d5439ceb76.tar.gz
rails-ac687ed651773fccecbc22cd6d8b07d5439ceb76.tar.bz2
rails-ac687ed651773fccecbc22cd6d8b07d5439ceb76.zip
Let Ruby deal with method visibility.
Check respond_to_without_attributes? in method_missing. If there is any method that responds (even private), let super handle it and raise NoMethodError if necessary.
Diffstat (limited to 'activemodel/test/cases/attribute_methods_test.rb')
-rw-r--r--activemodel/test/cases/attribute_methods_test.rb36
1 files changed, 36 insertions, 0 deletions
diff --git a/activemodel/test/cases/attribute_methods_test.rb b/activemodel/test/cases/attribute_methods_test.rb
index 61ff5fca7a..198e4c3c06 100644
--- a/activemodel/test/cases/attribute_methods_test.rb
+++ b/activemodel/test/cases/attribute_methods_test.rb
@@ -32,6 +32,16 @@ private
end
alias attribute_test attribute
+
+ def private_method
+ "<3 <3"
+ end
+
+protected
+
+ def protected_method
+ "O_o O_o"
+ end
end
class ModelWithAttributesWithSpaces
@@ -151,4 +161,30 @@ class AttributeMethodsTest < ActiveModel::TestCase
assert_equal 'value of foo', klass.new.foo
end
+
+ test 'should not interfere with method_missing if the attr has a private/protected method' do
+ m = ModelWithAttributes2.new
+ m.attributes = { 'private_method' => '<3', 'protected_method' => 'O_o' }
+
+ # dispatches to the *method*, not the attribute
+ assert_equal '<3 <3', m.send(:private_method)
+ assert_equal 'O_o O_o', m.send(:protected_method)
+
+ # sees that a method is already defined, so doesn't intervene
+ assert_raises(NoMethodError) { m.private_method }
+ assert_raises(NoMethodError) { m.protected_method }
+ end
+
+ test 'should not interfere with respond_to? if the attribute has a private/protected method' do
+ m = ModelWithAttributes2.new
+ m.attributes = { 'private_method' => '<3', 'protected_method' => 'O_o' }
+
+ assert !m.respond_to?(:private_method)
+ assert m.respond_to?(:private_method, true)
+
+ # This is messed up, but it's how Ruby works at the moment. Apparently it will be changed
+ # in the future.
+ assert m.respond_to?(:protected_method)
+ assert m.respond_to?(:protected_method, true)
+ end
end