require 'abstract_unit' require 'active_support/core_ext/class/delegating_attributes' module DelegatingFixtures class Parent end class Child < Parent ActiveSupport::Deprecation.silence do superclass_delegating_accessor :some_attribute end end class Mokopuna < Child end class PercysMom ActiveSupport::Deprecation.silence do superclass_delegating_accessor :superpower end end class Percy < PercysMom end end class DelegatingAttributesTest < ActiveSupport::TestCase include DelegatingFixtures attr_reader :single_class def setup @single_class = Class.new(Object) end def test_simple_accessor_declaration ActiveSupport::Deprecation.silence do single_class.superclass_delegating_accessor :both end # Class should have accessor and mutator # the instance should have an accessor only assert_respond_to single_class, :both assert_respond_to single_class, :both= assert single_class.public_instance_methods.map(&:to_s).include?("both") assert !single_class.public_instance_methods.map(&:to_s).include?("both=") end def test_simple_accessor_declaration_with_instance_reader_false _instance_methods = single_class.public_instance_methods ActiveSupport::Deprecation.silence do single_class.superclass_delegating_accessor :no_instance_reader, :instance_reader => false end assert_respond_to single_class, :no_instance_reader assert_respond_to single_class, :no_instance_reader= assert !_instance_methods.include?(:no_instance_reader) assert !_instance_methods.include?(:no_instance_reader?) assert !_instance_methods.include?(:_no_instance_reader) end def test_working_with_simple_attributes ActiveSupport::Deprecation.silence do single_class.superclass_delegating_accessor :both end single_class.both = "HMMM" assert_equal "HMMM", single_class.both assert_equal true, single_class.both? assert_equal "HMMM", single_class.new.both assert_equal true, single_class.new.both? single_class.both = false assert_equal false, single_class.both? end def test_child_class_delegates_to_parent_but_can_be_overridden parent = Class.new ActiveSupport::Deprecation.silence do parent.superclass_delegating_accessor :both end child = Class.new(parent) parent.both = "1" assert_equal "1", child.both child.both = "2" assert_equal "1", parent.both assert_equal "2", child.both parent.both = "3" assert_equal "3", parent.both assert_equal "2", child.both end def test_delegation_stops_at_the_right_level assert_nil Percy.superpower assert_nil PercysMom.superpower PercysMom.superpower = :heatvision assert_equal :heatvision, Percy.superpower end def test_delegation_stops_for_nil Mokopuna.some_attribute = nil Child.some_attribute="1" assert_equal "1", Child.some_attribute assert_nil Mokopuna.some_attribute ensure Child.some_attribute=nil end def test_deprecation_warning assert_deprecated(/superclass_delegating_accessor is deprecated/) do single_class.superclass_delegating_accessor :test_attribute end end end