1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activerecord/test/cases/attributes_test.rb
Sean Griffin 4010a9ddc6 Don't modify the columns hash to set defaults from the attributes API
Nothing is directly using the columns for the default values anymore.
This step helps us get closer not not mutating the columns hash.
2014-10-31 16:06:14 -06:00

115 lines
3.7 KiB
Ruby

require 'cases/helper'
class OverloadedType < ActiveRecord::Base
attribute :overloaded_float, Type::Integer.new
attribute :overloaded_string_with_limit, Type::String.new(limit: 50)
attribute :non_existent_decimal, Type::Decimal.new
attribute :string_with_default, Type::String.new, default: 'the overloaded default'
end
class ChildOfOverloadedType < OverloadedType
end
class GrandchildOfOverloadedType < ChildOfOverloadedType
attribute :overloaded_float, Type::Float.new
end
class UnoverloadedType < ActiveRecord::Base
self.table_name = 'overloaded_types'
end
module ActiveRecord
class CustomPropertiesTest < ActiveRecord::TestCase
test "overloading types" do
data = OverloadedType.new
data.overloaded_float = "1.1"
data.unoverloaded_float = "1.1"
assert_equal 1, data.overloaded_float
assert_equal 1.1, data.unoverloaded_float
end
test "overloaded properties save" do
data = OverloadedType.new
data.overloaded_float = "2.2"
data.save!
data.reload
assert_equal 2, data.overloaded_float
assert_kind_of Fixnum, OverloadedType.last.overloaded_float
assert_equal 2.0, UnoverloadedType.last.overloaded_float
assert_kind_of Float, UnoverloadedType.last.overloaded_float
end
test "properties assigned in constructor" do
data = OverloadedType.new(overloaded_float: '3.3')
assert_equal 3, data.overloaded_float
end
test "overloaded properties with limit" do
assert_equal 50, OverloadedType.columns_hash['overloaded_string_with_limit'].limit
assert_equal 255, UnoverloadedType.columns_hash['overloaded_string_with_limit'].limit
end
test "nonexistent attribute" do
data = OverloadedType.new(non_existent_decimal: 1)
assert_equal BigDecimal.new(1), data.non_existent_decimal
assert_raise ActiveRecord::UnknownAttributeError do
UnoverloadedType.new(non_existent_decimal: 1)
end
end
test "changing defaults" do
data = OverloadedType.new
unoverloaded_data = UnoverloadedType.new
assert_equal 'the overloaded default', data.string_with_default
assert_equal 'the original default', unoverloaded_data.string_with_default
end
test "defaults are not touched on the columns" do
assert_equal 'the original default', OverloadedType.columns_hash['string_with_default'].default
end
test "children inherit custom properties" do
data = ChildOfOverloadedType.new(overloaded_float: '4.4')
assert_equal 4, data.overloaded_float
end
test "children can override parents" do
data = GrandchildOfOverloadedType.new(overloaded_float: '4.4')
assert_equal 4.4, data.overloaded_float
end
test "overloading properties does not change column order" do
column_names = OverloadedType.column_names
assert_equal %w(id overloaded_float unoverloaded_float overloaded_string_with_limit string_with_default non_existent_decimal), column_names
end
test "caches are cleared" do
klass = Class.new(OverloadedType)
assert_equal 6, klass.columns.length
assert_not klass.columns_hash.key?('wibble')
assert_equal 6, klass.column_types.length
assert_equal 6, klass.column_defaults.length
assert_not klass.column_names.include?('wibble')
assert_equal 5, klass.content_columns.length
klass.attribute :wibble, Type::Value.new
assert_equal 7, klass.columns.length
assert klass.columns_hash.key?('wibble')
assert_equal 7, klass.column_types.length
assert_equal 7, klass.column_defaults.length
assert klass.column_names.include?('wibble')
assert_equal 6, klass.content_columns.length
end
end
end