Changeset 9139
- Timestamp:
- 03/29/08 22:19:26 (5 months ago)
- Files:
-
- trunk/activerecord/lib/active_record/dirty.rb (modified) (1 diff)
- trunk/activerecord/test/cases/dirty_test.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/activerecord/lib/active_record/dirty.rb
r9127 r9139 92 92 93 93 # Remember the original value if it's different. 94 changed_attributes[attr] = old unless old == value 94 typecasted = if column = column_for_attribute(attr) 95 column.type_cast(value) 96 else 97 value 98 end 99 changed_attributes[attr] = old unless old == typecasted 95 100 end 96 101 trunk/activerecord/test/cases/dirty_test.rb
r9127 r9139 1 1 require 'cases/helper' 2 require 'models/topic' # For booleans 3 require 'models/pirate' # For timestamps 2 4 3 # Stub out an AR-alike. 4 class DirtyTestSubject 5 def self.table_name; 'people' end 6 def self.primary_key; 'id' end 7 def self.attribute_method_suffix(*suffixes) suffixes end 5 class Pirate # Just reopening it, not defining it 6 attr_accessor :detected_changes_in_after_update # Boolean for if changes are detected 7 attr_accessor :changes_detected_in_after_update # Actual changes 8 8 9 def initialize(attrs = {}) @attributes = attrs end9 after_update :check_changes 10 10 11 def save 12 changed_attributes.clear 11 private 12 # after_save/update in sweepers, observers, and the model itself 13 # can end up checking dirty status and acting on the results 14 def check_changes 15 if self.changed? 16 self.detected_changes_in_after_update = true 17 self.changes_detected_in_after_update = self.changes 18 end 13 19 end 14 15 alias_method :save!, :save16 17 def name; read_attribute('name') end18 def name=(value); write_attribute('name', value) end19 def name_was; attribute_was('name') end20 def name_change; attribute_change('name') end21 def name_changed?; attribute_changed?('name') end22 23 private24 def define_read_methods; nil end25 26 def read_attribute(attr)27 @attributes[attr]28 end29 30 def write_attribute(attr, value)31 @attributes[attr] = value32 end33 20 end 34 35 # Include the module after the class is all set up.36 DirtyTestSubject.module_eval { include ActiveRecord::Dirty }37 38 21 39 22 class DirtyTest < Test::Unit::TestCase 40 23 def test_attribute_changes 41 24 # New record - no changes. 42 p erson = DirtyTestSubject.new43 assert !p erson.name_changed?44 assert_nil p erson.name_change25 pirate = Pirate.new 26 assert !pirate.catchphrase_changed? 27 assert_nil pirate.catchphrase_change 45 28 46 # Change name.47 p erson.name = 'a'48 assert p erson.name_changed?49 assert_nil p erson.name_was50 assert_equal [nil, 'a '], person.name_change29 # Change catchphrase. 30 pirate.catchphrase = 'arrr' 31 assert pirate.catchphrase_changed? 32 assert_nil pirate.catchphrase_was 33 assert_equal [nil, 'arrr'], pirate.catchphrase_change 51 34 52 35 # Saved - no changes. 53 p erson.save!54 assert !p erson.name_changed?55 assert_nil p erson.name_change36 pirate.save! 37 assert !pirate.catchphrase_changed? 38 assert_nil pirate.catchphrase_change 56 39 57 40 # Same value - no changes. 58 p erson.name = 'a'59 assert !p erson.name_changed?60 assert_nil p erson.name_change41 pirate.catchphrase = 'arrr' 42 assert !pirate.catchphrase_changed? 43 assert_nil pirate.catchphrase_change 61 44 end 62 45 46 # Rewritten from original tests to use AR 63 47 def test_object_should_be_changed_if_any_attribute_is_changed 64 p erson = DirtyTestSubject.new65 assert !p erson.changed?66 assert_equal [], p erson.changed67 assert_equal Hash.new, p erson.changes48 pirate = Pirate.new 49 assert !pirate.changed? 50 assert_equal [], pirate.changed 51 assert_equal Hash.new, pirate.changes 68 52 69 p erson.name = 'a'70 assert p erson.changed?71 assert_nil p erson.name_was72 assert_equal %w( name), person.changed73 assert_equal({' name' => [nil, 'a']}, person.changes)53 pirate.catchphrase = 'arrr' 54 assert pirate.changed? 55 assert_nil pirate.catchphrase_was 56 assert_equal %w(catchphrase), pirate.changed 57 assert_equal({'catchphrase' => [nil, 'arrr']}, pirate.changes) 74 58 75 person.save 76 assert !person.changed? 77 assert_equal [], person.changed 78 assert_equal({}, person.changes) 59 pirate.save 60 assert !pirate.changed? 61 assert_equal [], pirate.changed 62 assert_equal Hash.new, pirate.changes 63 end 64 65 def test_attribute_should_be_compared_with_type_cast 66 topic = Topic.new 67 assert topic.approved? 68 assert !topic.approved_changed? 69 70 # Coming from web form. 71 params = {:topic => {:approved => 1}} 72 # In the controller. 73 topic.attributes = params[:topic] 74 assert topic.approved? 75 assert !topic.approved_changed? 79 76 end 80 77 end