aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/ar_schema_test.rb
blob: 3f5858714a2bab7c1182cdee228bdcc6a41d4a7a (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
require "cases/helper"

if ActiveRecord::Base.connection.supports_migrations?

  class ActiveRecordSchemaTest < ActiveRecord::TestCase
    self.use_transactional_fixtures = false

    def setup
      @connection = ActiveRecord::Base.connection
      ActiveRecord::SchemaMigration.drop_table
    end

    teardown do
      @connection.drop_table :fruits rescue nil
      @connection.drop_table :nep_fruits rescue nil
      @connection.drop_table :nep_schema_migrations rescue nil
      @connection.drop_table :has_timestamps rescue nil
      ActiveRecord::SchemaMigration.delete_all rescue nil
    end

    def test_has_no_primary_key
      old_primary_key_prefix_type = ActiveRecord::Base.primary_key_prefix_type
      ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
      assert_nil ActiveRecord::SchemaMigration.primary_key

      ActiveRecord::SchemaMigration.create_table
      assert_difference "ActiveRecord::SchemaMigration.count", 1 do
        ActiveRecord::SchemaMigration.create version: 12
      end
    ensure
      ActiveRecord::SchemaMigration.drop_table
      ActiveRecord::Base.primary_key_prefix_type = old_primary_key_prefix_type
    end

    def test_schema_define
      ActiveRecord::Schema.define(:version => 7) do
        create_table :fruits do |t|
          t.column :color, :string
          t.column :fruit_size, :string  # NOTE: "size" is reserved in Oracle
          t.column :texture, :string
          t.column :flavor, :string
        end
      end

      assert_nothing_raised { @connection.select_all "SELECT * FROM fruits" }
      assert_nothing_raised { @connection.select_all "SELECT * FROM schema_migrations" }
      assert_equal 7, ActiveRecord::Migrator::current_version
    end

    def test_schema_define_w_table_name_prefix
      table_name = ActiveRecord::SchemaMigration.table_name
      old_table_name_prefix = ActiveRecord::Base.table_name_prefix
      ActiveRecord::Base.table_name_prefix  = "nep_"
      ActiveRecord::SchemaMigration.table_name = "nep_#{table_name}"
      ActiveRecord::Schema.define(:version => 7) do
        create_table :fruits do |t|
          t.column :color, :string
          t.column :fruit_size, :string  # NOTE: "size" is reserved in Oracle
          t.column :texture, :string
          t.column :flavor, :string
        end
      end
      assert_equal 7, ActiveRecord::Migrator::current_version
    ensure
      ActiveRecord::Base.table_name_prefix  = old_table_name_prefix
      ActiveRecord::SchemaMigration.table_name = table_name
    end

    def test_schema_raises_an_error_for_invalid_column_type
      assert_raise NoMethodError do
        ActiveRecord::Schema.define(:version => 8) do
          create_table :vegetables do |t|
            t.unknown :color
          end
        end
      end
    end

    def test_schema_subclass
      Class.new(ActiveRecord::Schema).define(:version => 9) do
        create_table :fruits
      end
      assert_nothing_raised { @connection.select_all "SELECT * FROM fruits" }
    end

    def test_normalize_version
      assert_equal "118", ActiveRecord::SchemaMigration.normalize_migration_number("0000118")
      assert_equal "002", ActiveRecord::SchemaMigration.normalize_migration_number("2")
      assert_equal "017", ActiveRecord::SchemaMigration.normalize_migration_number("0017")
      assert_equal "20131219224947", ActiveRecord::SchemaMigration.normalize_migration_number("20131219224947")
    end

    def test_timestamps_without_null_is_deprecated_on_create_table
      assert_deprecated do
        ActiveRecord::Schema.define do
          create_table :has_timestamps do |t|
            t.timestamps
          end
        end
      end
    end

    def test_timestamps_without_null_is_deprecated_on_change_table
      assert_deprecated do
        ActiveRecord::Schema.define do
          create_table :has_timestamps

          change_table :has_timestamps do |t|
            t.timestamps
          end
        end
      end
    end

    def test_no_deprecation_warning_from_timestamps_on_create_table
      assert_not_deprecated do
        ActiveRecord::Schema.define do
          create_table :has_timestamps do |t|
            t.timestamps null: true
          end

          drop_table :has_timestamps

          create_table :has_timestamps do |t|
            t.timestamps null: false
          end
        end
      end
    end

    def test_no_deprecation_warning_from_timestamps_on_change_table
      assert_not_deprecated do
        ActiveRecord::Schema.define do
          create_table :has_timestamps
          change_table :has_timestamps do |t|
            t.timestamps null: true
          end

          drop_table :has_timestamps

          create_table :has_timestamps
          change_table :has_timestamps do |t|
            t.timestamps null: false, default: Time.now
          end
        end
      end
    end
  end
end