require 'cases/helper'
require 'minitest/mock'
module ActiveRecord
class AttributeTest < ActiveRecord::TestCase
setup do
@type = MiniTest::Mock.new
end
teardown do
assert @type.verify
end
test "from_database + read type casts from database" do
@type.expect(:type_cast_from_database, 'type cast from database', ['a value'])
attribute = Attribute.from_database('a value', @type)
type_cast_value = attribute.value
assert_equal 'type cast from database', type_cast_value
end
test "from_user + read type casts from user" do
@type.expect(:type_cast_from_user, 'type cast from user', ['a value'])
attribute = Attribute.from_user('a value', @type)
type_cast_value = attribute.value
assert_equal 'type cast from user', type_cast_value
end
test "reading memoizes the value" do
@type.expect(:type_cast_from_database, 'from the database', ['whatever'])
attribute = Attribute.from_database('whatever', @type)
type_cast_value = attribute.value
second_read = attribute.value
assert_equal 'from the database', type_cast_value
assert_same type_cast_value, second_read
end
test "reading memoizes falsy values" do
@type.expect(:type_cast_from_database, false, ['whatever'])
attribute = Attribute.from_database('whatever', @type)
attribute.value
attribute.value
end
test "read_before_typecast returns the given value" do
attribute = Attribute.from_database('raw value', @type)
raw_value = attribute.value_before_type_cast
assert_equal 'raw value', raw_value
end
test "from_database + read_for_database type casts to and from database" do
@type.expect(:type_cast_from_database, 'read from database', ['whatever'])
@type.expect(:type_cast_for_database, 'ready for database', ['read from database'])
attribute = Attribute.from_database('whatever', @type)
type_cast_for_database = attribute.value_for_database
assert_equal 'ready for database', type_cast_for_database
end
test "from_user + read_for_database type casts from the user to the database" do
@type.expect(:type_cast_from_user, 'read from user', ['whatever'])
@type.expect(:type_cast_for_database, 'ready for database', ['read from user'])
attribute = Attribute.from_user('whatever', @type)
type_cast_for_database = attribute.value_for_database
assert_equal 'ready for database', type_cast_for_database
end
test "duping dups the value" do
@type.expect(:type_cast_from_database, 'type cast', ['a value'])
attribute = Attribute.from_database('a value', @type)
value_from_orig = attribute.value
value_from_clone = attribute.dup.value
value_from_orig << ' foo'
assert_equal 'type cast foo', value_from_orig
assert_equal 'type cast', value_from_clone
end
test "duping does not dup the value if it is not dupable" do
@type.expect(:type_cast_from_database, false, ['a value'])
attribute = Attribute.from_database('a value', @type)
assert_same attribute.value, attribute.dup.value
end
test "duping does not eagerly type cast if we have not yet type cast" do
attribute = Attribute.from_database('a value', @type)
attribute.dup
end
end
end