aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/connection_adapters/type/type_map_test.rb
blob: 4b4d9f6b0f71e323b2e21e327498c0fae7f82661 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
require "cases/helper"

module ActiveRecord
  module ConnectionAdapters
    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_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
end