require "cases/helper"
module ActiveRecord
module Type
class TypeMapTest < ActiveRecord::TestCase
def test_default_type
mapping = TypeMap.new
assert_kind_of Value, mapping.lookup(:undefined)
end
def test_registering_types
boolean = Boolean.new
mapping = TypeMap.new
mapping.register_type(/boolean/i, boolean)
assert_equal mapping.lookup('boolean'), boolean
end
def test_overriding_registered_types
time = Time.new
timestamp = DateTime.new
mapping = TypeMap.new
mapping.register_type(/time/i, time)
mapping.register_type(/time/i, timestamp)
assert_equal mapping.lookup('time'), timestamp
end
def test_fuzzy_lookup
string = String.new
mapping = TypeMap.new
mapping.register_type(/varchar/i, string)
assert_equal mapping.lookup('varchar(20)'), string
end
def test_aliasing_types
string = String.new
mapping = TypeMap.new
mapping.register_type(/string/i, string)
mapping.alias_type(/varchar/i, 'string')
assert_equal mapping.lookup('varchar'), string
end
def test_changing_type_changes_aliases
time = Time.new
timestamp = DateTime.new
mapping = TypeMap.new
mapping.register_type(/timestamp/i, time)
mapping.alias_type(/datetime/i, 'timestamp')
mapping.register_type(/timestamp/i, timestamp)
assert_equal mapping.lookup('datetime'), timestamp
end
def test_aliases_keep_metadata
mapping = TypeMap.new
mapping.register_type(/decimal/i) { |sql_type| sql_type }
mapping.alias_type(/number/i, 'decimal')
assert_equal mapping.lookup('number(20)'), 'decimal(20)'
assert_equal mapping.lookup('number'), 'decimal'
end
def test_register_proc
string = String.new
binary = Binary.new
mapping = TypeMap.new
mapping.register_type(/varchar/i) do |type|
if type.include?('(')
string
else
binary
end
end
assert_equal mapping.lookup('varchar(20)'), string
assert_equal mapping.lookup('varchar'), binary
end
def test_additional_lookup_args
mapping = TypeMap.new
mapping.register_type(/varchar/i) do |type, limit|
if limit > 255
'text'
else
'string'
end
end
mapping.alias_type(/string/i, 'varchar')
assert_equal mapping.lookup('varchar', 200), 'string'
assert_equal mapping.lookup('varchar', 400), 'text'
assert_equal mapping.lookup('string', 400), 'text'
end
def test_requires_value_or_block
mapping = TypeMap.new
assert_raises(ArgumentError) do
mapping.register_type(/only key/i)
end
end
def test_lookup_non_strings
mapping = HashLookupTypeMap.new
mapping.register_type(1, 'string')
mapping.register_type(2, 'int')
mapping.alias_type(3, 1)
assert_equal mapping.lookup(1), 'string'
assert_equal mapping.lookup(2), 'int'
assert_equal mapping.lookup(3), 'string'
assert_kind_of Type::Value, mapping.lookup(4)
end
end
end
end