require File.dirname(__FILE__) + '/abstract_unit' require File.dirname(__FILE__) + '/fixtures/person' class ActsAsChangedTest < Test::Unit::TestCase fixtures :people def test_changed_attributes_initial_value assert_equal [], Person.new.changed_attributes assert_equal [], people(:jonathan).changed_attributes end def test_new_record_not_changed assert !Person.new.changed? end def test_loaded_record_not_changed assert !Person.find(:first).changed? end def test_change_attribute people(:jonathan).name = 'Jonathan' assert !people(:jonathan).changed? people(:jonathan).name = 'Commander Keen' assert people(:jonathan).changed? end def test_method_missing p = people(:jonathan) assert !p.name_changed? p.name = 'Jonathan' assert !p.name_changed? assert_equal 'Jonathan', p.name p.name = 'Changed' assert p.name_changed? assert_equal 'Changed', p.name end def test_reload_should_clear_changed_attributes p = people(:jonathan) assert p.update_attributes(:name => 'Changed') assert p.changed? p.reload assert !p.changed? end def test_attributes_immutable p = people(:jonathan) assert_raises(TypeError) { p.name << ", Mr" } assert_raises(TypeError) { p.name.gsub!(p.name[0..2], '') } end def test_changed_attributes p = people(:jonathan) assert_equal [], p.changed_attributes # Handed back a copy of the instance variable p.changed_attributes << 'should be added to duplicate' assert_equal [], p.changed_attributes # Attributes should only appear once in changed_attributes p.name = 'Captain Comic' assert_equal ['name'], p.changed_attributes p.name = 'Captain Comic 2' assert_equal ['name'], p.changed_attributes end def test_reset_attributes p = people(:jonathan) p.name = "Agent orange" p.lucky_number = 666 assert p.name_changed? assert p.lucky_number_changed? assert p.changed? assert_equal ['name', 'lucky_number'], p.changed_attributes p.reset_attributes assert_equal [], p.changed_attributes assert !p.name_changed? assert !p.lucky_number_changed? assert !p.changed? end def test_save_with_no_changes assert people(:jonathan).save end end