2008-03-29 00:04:27 +00:00
|
|
|
require 'cases/helper'
|
2008-03-29 22:19:26 +00:00
|
|
|
require 'models/topic' # For booleans
|
|
|
|
require 'models/pirate' # For timestamps
|
|
|
|
|
|
|
|
class Pirate # Just reopening it, not defining it
|
|
|
|
attr_accessor :detected_changes_in_after_update # Boolean for if changes are detected
|
|
|
|
attr_accessor :changes_detected_in_after_update # Actual changes
|
|
|
|
|
|
|
|
after_update :check_changes
|
|
|
|
|
|
|
|
private
|
|
|
|
# after_save/update in sweepers, observers, and the model itself
|
|
|
|
# can end up checking dirty status and acting on the results
|
|
|
|
def check_changes
|
|
|
|
if self.changed?
|
|
|
|
self.detected_changes_in_after_update = true
|
|
|
|
self.changes_detected_in_after_update = self.changes
|
2008-03-29 00:04:27 +00:00
|
|
|
end
|
2008-03-29 22:19:26 +00:00
|
|
|
end
|
2008-03-29 00:04:27 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
class DirtyTest < Test::Unit::TestCase
|
|
|
|
def test_attribute_changes
|
|
|
|
# New record - no changes.
|
2008-03-29 22:19:26 +00:00
|
|
|
pirate = Pirate.new
|
|
|
|
assert !pirate.catchphrase_changed?
|
|
|
|
assert_nil pirate.catchphrase_change
|
2008-03-29 00:04:27 +00:00
|
|
|
|
2008-03-29 22:19:26 +00:00
|
|
|
# Change catchphrase.
|
|
|
|
pirate.catchphrase = 'arrr'
|
|
|
|
assert pirate.catchphrase_changed?
|
|
|
|
assert_nil pirate.catchphrase_was
|
|
|
|
assert_equal [nil, 'arrr'], pirate.catchphrase_change
|
2008-03-29 00:04:27 +00:00
|
|
|
|
|
|
|
# Saved - no changes.
|
2008-03-29 22:19:26 +00:00
|
|
|
pirate.save!
|
|
|
|
assert !pirate.catchphrase_changed?
|
|
|
|
assert_nil pirate.catchphrase_change
|
2008-03-29 00:04:27 +00:00
|
|
|
|
|
|
|
# Same value - no changes.
|
2008-03-29 22:19:26 +00:00
|
|
|
pirate.catchphrase = 'arrr'
|
|
|
|
assert !pirate.catchphrase_changed?
|
|
|
|
assert_nil pirate.catchphrase_change
|
2008-03-29 00:04:27 +00:00
|
|
|
end
|
|
|
|
|
2008-03-29 22:19:26 +00:00
|
|
|
# Rewritten from original tests to use AR
|
2008-03-29 00:04:27 +00:00
|
|
|
def test_object_should_be_changed_if_any_attribute_is_changed
|
2008-03-29 22:19:26 +00:00
|
|
|
pirate = Pirate.new
|
|
|
|
assert !pirate.changed?
|
|
|
|
assert_equal [], pirate.changed
|
|
|
|
assert_equal Hash.new, pirate.changes
|
|
|
|
|
|
|
|
pirate.catchphrase = 'arrr'
|
|
|
|
assert pirate.changed?
|
|
|
|
assert_nil pirate.catchphrase_was
|
|
|
|
assert_equal %w(catchphrase), pirate.changed
|
|
|
|
assert_equal({'catchphrase' => [nil, 'arrr']}, pirate.changes)
|
|
|
|
|
|
|
|
pirate.save
|
|
|
|
assert !pirate.changed?
|
|
|
|
assert_equal [], pirate.changed
|
|
|
|
assert_equal Hash.new, pirate.changes
|
|
|
|
end
|
2008-03-29 00:04:27 +00:00
|
|
|
|
2008-03-29 22:19:26 +00:00
|
|
|
def test_attribute_should_be_compared_with_type_cast
|
|
|
|
topic = Topic.new
|
|
|
|
assert topic.approved?
|
|
|
|
assert !topic.approved_changed?
|
|
|
|
|
|
|
|
# Coming from web form.
|
|
|
|
params = {:topic => {:approved => 1}}
|
|
|
|
# In the controller.
|
|
|
|
topic.attributes = params[:topic]
|
|
|
|
assert topic.approved?
|
|
|
|
assert !topic.approved_changed?
|
2008-03-29 00:04:27 +00:00
|
|
|
end
|
|
|
|
end
|