Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 20th, 2012  |  syntax: None  |  size: 1.85 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. require "rubygems"
  2. require "acts_as_fu"
  3. require "test/unit"
  4. include ActsAsFu
  5.  
  6. class ActiveRecord::Base
  7.   def self.after_set(attribute, callback)
  8.     after_save callback, :if => "#{attribute}_set?"
  9.  
  10.     class_eval <<-END
  11.       def #{attribute}_set?
  12.         @#{attribute}_set
  13.       end
  14.  
  15.       def #{attribute}=(val)
  16.         @#{attribute}_set = #{attribute}.blank? && val.present?
  17.         super(val)
  18.       end
  19.     END
  20.   end
  21. end
  22.  
  23. class AfterSetTest < Test::Unit::TestCase
  24.   def setup
  25.     $CALLS = 0
  26.  
  27.     build_model :users do
  28.       string :name
  29.       string :status, :default => "OK"
  30.  
  31.       after_set :name, :some_callback
  32.  
  33.       validates_presence_of :status
  34.  
  35.       def some_callback
  36.         $CALLS += 1
  37.       end
  38.     end
  39.   end
  40.  
  41.   def test_it_triggers_callback_when_set
  42.     user = User.new
  43.     user.save!
  44.     assert_equal 0, $CALLS
  45.  
  46.     user.name = "Pat"
  47.     assert_equal 0, $CALLS # Does not get set until record saved
  48.  
  49.     user.save!
  50.     assert_equal 1, $CALLS
  51.   end
  52.  
  53.   def test_does_not_trigger_when_already_set
  54.     user = User.new(:name => "Pat")
  55.     user.save!
  56.  
  57.     $CALLS = 0 # Reset this to make sure we don't call it again
  58.  
  59.     user.name = "Neil"
  60.     user.save!
  61.  
  62.     assert_equal 0, $CALLS
  63.   end
  64.  
  65.   def test_does_not_trigger_when_set_to_nil
  66.     user = User.new
  67.     user.save!
  68.  
  69.     user.name = nil
  70.     user.save!
  71.  
  72.     assert_equal 0, $CALLS
  73.   end
  74.  
  75.   def test_does_not_trigger_when_record_invalid
  76.     user = User.new(:status => nil)
  77.     user.name = "Pat"
  78.     assert ! user.valid?
  79.     assert ! user.save
  80.     assert_equal 0, $CALLS
  81.   end
  82.  
  83.   def test_works_with_two_callbacks
  84.     User.class_eval do
  85.       after_set :name, :another_callback
  86.  
  87.       def another_callback
  88.         $CALLS += 1
  89.       end
  90.     end
  91.  
  92.     user = User.create
  93.     assert_equal 0, $CALLS
  94.  
  95.     user.name = "Pat"
  96.     assert_equal 0, $CALLS # Does not get set until record saved
  97.  
  98.     user.save!
  99.     assert_equal 2, $CALLS
  100.   end
  101. end