require 'test/unit' require File.expand_path(File.dirname(__FILE__) + "/test_helper") require File.expand_path(File.dirname(__FILE__) + "/leprechaun") class CachedValuesTest < Test::Unit::TestCase def setup @mc_nairn = Leprechaun.find(:first) @mc_nairn.favorite_color_in_rot_13.clear @mc_nairn.favorite_color_turned_uppercase.clear @mc_nairn.id_of_first_leprechaun_with_same_favorite_color.clear @mc_nairn.favorite_color_in_rot_13_without_cache.clear @mc_nairn.favorite_color_turned_uppercase_with_explicit_cache.clear @mc_nairn.favorite_color = 'blue' @mc_nairn.save! end def teardown setup end def test_proc_should_properly_calculate_value assert_equal 'blue', @mc_nairn.favorite_color assert_equal 'oyhr', @mc_nairn.favorite_color.tr("A-Za-z", "N-ZA-Mn-za-m") assert_equal 'oyhr', @mc_nairn.favorite_color_in_rot_13 end def test_string_should_properly_calculate_value assert_equal 'blue', @mc_nairn.favorite_color assert_equal 'BLUE', @mc_nairn.favorite_color_turned_uppercase @mc_nairn.update_attribute(:favorite_color, 'gold') assert_equal 'BLUE', @mc_nairn.favorite_color_turned_uppercase assert_equal 'GOLD', @mc_nairn.favorite_color_turned_uppercase.reload end def test_symbol_should_calculate_value_from_method_call assert_equal '127 gold coins', @mc_nairn.number_of_gold_coins assert_equal '127 gold coins', @mc_nairn.calculate_gold @mc_nairn.class.class_eval { def calculate_gold; '255 gold coins'; end } assert_equal '255 gold coins', @mc_nairn.calculate_gold assert_equal '127 gold coins', @mc_nairn.number_of_gold_coins assert_equal '255 gold coins', @mc_nairn.number_of_gold_coins.reload end def test_sql_should_properly_calculate_value assert_equal 3, @mc_nairn.id_of_first_leprechaun_with_same_favorite_color Leprechaun.find_by_name("O' Houhlihan").update_attribute(:favorite_color, 'blue') assert_equal 3, @mc_nairn.id_of_first_leprechaun_with_same_favorite_color assert_equal 2, @mc_nairn.id_of_first_leprechaun_with_same_favorite_color.reload end def test_should_cache_value assert_equal 'blue', @mc_nairn.favorite_color assert_equal 'oyhr', @mc_nairn.favorite_color_in_rot_13 @mc_nairn.update_attribute(:favorite_color, 'red') assert_equal 'erq', @mc_nairn.favorite_color.tr("A-Za-z", "N-ZA-Mn-za-m") assert_equal 'oyhr', @mc_nairn.favorite_color_in_rot_13 end def test_cache_should_be_invalidated_on_clear assert_equal 'blue', @mc_nairn.favorite_color assert_equal 'oyhr', @mc_nairn.favorite_color_in_rot_13 @mc_nairn.favorite_color_in_rot_13.clear assert_nil @mc_nairn.send(:read_attribute, :favorite_color_in_rot_13) end def test_value_should_be_updated_after_its_cleared assert_equal 'blue', @mc_nairn.favorite_color assert_equal 'oyhr', @mc_nairn.favorite_color_in_rot_13 @mc_nairn.update_attribute(:favorite_color, 'red') assert_equal 'oyhr', @mc_nairn.favorite_color_in_rot_13 @mc_nairn.favorite_color_in_rot_13.clear assert_equal 'erq', @mc_nairn.favorite_color_in_rot_13 end def test_should_not_cache_explicitly_noncaching_values assert_equal 'blue', @mc_nairn.favorite_color assert_equal 'oyhr', @mc_nairn.favorite_color_in_rot_13_without_cache assert_nil @mc_nairn.send(:read_attribute, :favorite_color_in_rot_13_without_cache) @mc_nairn.update_attribute(:favorite_color, 'red') assert_equal 'erq', @mc_nairn.favorite_color.tr("A-Za-z", "N-ZA-Mn-za-m") assert_equal 'erq', @mc_nairn.favorite_color_in_rot_13_without_cache.reload assert_nil @mc_nairn.send(:read_attribute, :favorite_color_in_rot_13_without_cache) end def test_should_respect_explicit_cache_column assert_equal 'BLUE', @mc_nairn.favorite_color_turned_uppercase_with_explicit_cache assert_equal 'BLUE', @mc_nairn.send(:read_attribute, :some_other_cache_field) @mc_nairn.update_attribute(:favorite_color, 'red') assert_equal 'BLUE', @mc_nairn.send(:read_attribute, :some_other_cache_field) assert_equal 'RED', @mc_nairn.favorite_color_turned_uppercase_with_explicit_cache.reload end def test_reload_callback_should_fire value = @mc_nairn.reload_callback.to_s assert_equal value.to_i, @mc_nairn.reload_callback @mc_nairn.save! assert_not_equal value.to_i, @mc_nairn.reload_callback.reload value = @mc_nairn.reload_callback.to_s assert_equal value.to_i, @mc_nairn.reload_callback @mc_nairn.valid? assert_not_equal value.to_i, @mc_nairn.reload_callback end def test_clear_callback_should_fire assert @mc_nairn.clear_callback assert @mc_nairn.instance_variable_get("@clear_callback") @mc_nairn.valid? assert_nil @mc_nairn.instance_variable_get("@clear_callback") end def test_sql_should_cast_to_integer assert @mc_nairn.integer_cast.is_a?(Fixnum) end def test_sql_should_cast_to_string assert @mc_nairn.string_cast.is_a?(String) end def test_sql_should_cast_to_float assert @mc_nairn.float_cast.is_a?(Float) end end