database_tasks_test.rb 14.3 KB
Newer Older
1 2
require "cases/helper"
require "active_record/tasks/database_tasks"
3 4

module ActiveRecord
K
kennyj 已提交
5
  module DatabaseTasksSetupper
6 7 8
    def setup
      @mysql_tasks, @postgresql_tasks, @sqlite_tasks = stub, stub, stub
      ActiveRecord::Tasks::MySQLDatabaseTasks.stubs(:new).returns @mysql_tasks
K
kennyj 已提交
9
      ActiveRecord::Tasks::PostgreSQLDatabaseTasks.stubs(:new).returns @postgresql_tasks
10
      ActiveRecord::Tasks::SQLiteDatabaseTasks.stubs(:new).returns @sqlite_tasks
11 12 13 14 15 16 17

      $stdout, @original_stdout = StringIO.new, $stdout
      $stderr, @original_stderr = StringIO.new, $stderr
    end

    def teardown
      $stdout, $stderr = @original_stdout, @original_stderr
18
    end
K
kennyj 已提交
19 20
  end

K
kennyj 已提交
21
  ADAPTERS_TASKS = {
22 23 24
    mysql2:     :mysql_tasks,
    postgresql: :postgresql_tasks,
    sqlite3:    :sqlite_tasks
K
kennyj 已提交
25
  }
26

27 28 29 30 31
  class DatabaseTasksUtilsTask< ActiveRecord::TestCase
    def test_raises_an_error_when_called_with_protected_environment
      ActiveRecord::Migrator.stubs(:current_version).returns(1)

      protected_environments = ActiveRecord::Base.protected_environments.dup
32
      current_env            = ActiveRecord::Migrator.current_environment
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
      assert !protected_environments.include?(current_env)
      # Assert no error
      ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!

      ActiveRecord::Base.protected_environments << current_env
      assert_raise(ActiveRecord::ProtectedEnvironmentError) do
        ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
      end
    ensure
      ActiveRecord::Base.protected_environments = protected_environments
    end

    def test_raises_an_error_if_no_migrations_have_been_made
      ActiveRecord::InternalMetadata.stubs(:table_exists?).returns(false)
      ActiveRecord::Migrator.stubs(:current_version).returns(1)

      assert_raise(ActiveRecord::NoEnvironmentInSchemaError) do
        ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
      end
    end
  end

55 56 57 58 59 60 61 62 63 64 65 66
  class DatabaseTasksRegisterTask < ActiveRecord::TestCase
    def test_register_task
      klazz = Class.new do
        def initialize(*arguments); end
        def structure_dump(filename); end
      end
      instance = klazz.new

      klazz.stubs(:new).returns instance
      instance.expects(:structure_dump).with("awesome-file.sql")

      ActiveRecord::Tasks::DatabaseTasks.register_task(/foo/, klazz)
67
      ActiveRecord::Tasks::DatabaseTasks.structure_dump({"adapter" => :foo}, "awesome-file.sql")
68
    end
69 70 71

    def test_unregistered_task
      assert_raise(ActiveRecord::Tasks::DatabaseNotSupported) do
72
        ActiveRecord::Tasks::DatabaseTasks.structure_dump({"adapter" => :bar}, "awesome-file.sql")
73 74
      end
    end
75
  end
76

K
kennyj 已提交
77 78
  class DatabaseTasksCreateTest < ActiveRecord::TestCase
    include DatabaseTasksSetupper
79

K
kennyj 已提交
80 81 82
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_create") do
        eval("@#{v}").expects(:create)
83
        ActiveRecord::Tasks::DatabaseTasks.create "adapter" => k
K
kennyj 已提交
84
      end
85 86 87 88 89
    end
  end

  class DatabaseTasksCreateAllTest < ActiveRecord::TestCase
    def setup
90
      @configurations = {"development" => {"database" => "my-db"}}
91 92 93 94 95

      ActiveRecord::Base.stubs(:configurations).returns(@configurations)
    end

    def test_ignores_configurations_without_databases
96
      @configurations["development"].merge!("database" => nil)
97 98 99 100 101 102 103

      ActiveRecord::Tasks::DatabaseTasks.expects(:create).never

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_ignores_remote_databases
104
      @configurations["development"].merge!("host" => "my.server.tld")
105 106 107 108 109 110 111 112
      $stderr.stubs(:puts).returns(nil)

      ActiveRecord::Tasks::DatabaseTasks.expects(:create).never

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_warning_for_remote_databases
113
      @configurations["development"].merge!("host" => "my.server.tld")
114

115
      $stderr.expects(:puts).with("This task only modifies local databases. my-db is on a remote host.")
116 117 118 119 120

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_creates_configurations_with_local_ip
121
      @configurations["development"].merge!("host" => "127.0.0.1")
122 123 124 125 126 127 128

      ActiveRecord::Tasks::DatabaseTasks.expects(:create)

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_creates_configurations_with_local_host
129
      @configurations["development"].merge!("host" => "localhost")
130 131 132 133 134 135 136

      ActiveRecord::Tasks::DatabaseTasks.expects(:create)

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_creates_configurations_with_blank_hosts
137
      @configurations["development"].merge!("host" => nil)
138 139 140 141 142 143 144 145 146 147

      ActiveRecord::Tasks::DatabaseTasks.expects(:create)

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end
  end

  class DatabaseTasksCreateCurrentTest < ActiveRecord::TestCase
    def setup
      @configurations = {
148 149 150
        "development" => {"database" => "dev-db"},
        "test"        => {"database" => "test-db"},
        "production"  => {"database" => "prod-db"}
151 152 153 154 155 156 157 158
      }

      ActiveRecord::Base.stubs(:configurations).returns(@configurations)
      ActiveRecord::Base.stubs(:establish_connection).returns(true)
    end

    def test_creates_current_environment_database
      ActiveRecord::Tasks::DatabaseTasks.expects(:create).
159
        with("database" => "prod-db")
160

161
      ActiveRecord::Tasks::DatabaseTasks.create_current(
162
        ActiveSupport::StringInquirer.new("production")
163
      )
164 165
    end

166
    def test_creates_test_and_development_databases_when_env_was_not_specified
167
      ActiveRecord::Tasks::DatabaseTasks.expects(:create).
168
        with("database" => "dev-db")
169
      ActiveRecord::Tasks::DatabaseTasks.expects(:create).
170
        with("database" => "test-db")
171 172

      ActiveRecord::Tasks::DatabaseTasks.create_current(
173
        ActiveSupport::StringInquirer.new("development")
174 175 176
      )
    end

177
    def test_creates_test_and_development_databases_when_rails_env_is_development
178 179
      old_env = ENV["RAILS_ENV"]
      ENV["RAILS_ENV"] = "development"
180
      ActiveRecord::Tasks::DatabaseTasks.expects(:create).
181
        with("database" => "dev-db")
182
      ActiveRecord::Tasks::DatabaseTasks.expects(:create).
183
        with("database" => "test-db")
184

185
      ActiveRecord::Tasks::DatabaseTasks.create_current(
186
        ActiveSupport::StringInquirer.new("development")
187
      )
188
    ensure
189
      ENV["RAILS_ENV"] = old_env
190 191 192 193 194
    end

    def test_establishes_connection_for_the_given_environment
      ActiveRecord::Tasks::DatabaseTasks.stubs(:create).returns true

S
schneems 已提交
195
      ActiveRecord::Base.expects(:establish_connection).with(:development)
196

197
      ActiveRecord::Tasks::DatabaseTasks.create_current(
198
        ActiveSupport::StringInquirer.new("development")
199
      )
200 201 202 203
    end
  end

  class DatabaseTasksDropTest < ActiveRecord::TestCase
K
kennyj 已提交
204
    include DatabaseTasksSetupper
205

K
kennyj 已提交
206 207 208
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_drop") do
        eval("@#{v}").expects(:drop)
209
        ActiveRecord::Tasks::DatabaseTasks.drop "adapter" => k
K
kennyj 已提交
210
      end
211 212 213 214 215
    end
  end

  class DatabaseTasksDropAllTest < ActiveRecord::TestCase
    def setup
216
      @configurations = {development: {"database" => "my-db"}}
217 218 219 220 221

      ActiveRecord::Base.stubs(:configurations).returns(@configurations)
    end

    def test_ignores_configurations_without_databases
222
      @configurations[:development].merge!("database" => nil)
223 224 225 226 227 228 229

      ActiveRecord::Tasks::DatabaseTasks.expects(:drop).never

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

    def test_ignores_remote_databases
230
      @configurations[:development].merge!("host" => "my.server.tld")
231 232 233 234 235 236 237 238
      $stderr.stubs(:puts).returns(nil)

      ActiveRecord::Tasks::DatabaseTasks.expects(:drop).never

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

    def test_warning_for_remote_databases
239
      @configurations[:development].merge!("host" => "my.server.tld")
240

241
      $stderr.expects(:puts).with("This task only modifies local databases. my-db is on a remote host.")
242 243 244 245

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

246
    def test_drops_configurations_with_local_ip
247
      @configurations[:development].merge!("host" => "127.0.0.1")
248 249 250 251 252 253

      ActiveRecord::Tasks::DatabaseTasks.expects(:drop)

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

254
    def test_drops_configurations_with_local_host
255
      @configurations[:development].merge!("host" => "localhost")
256 257 258 259 260 261

      ActiveRecord::Tasks::DatabaseTasks.expects(:drop)

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

262
    def test_drops_configurations_with_blank_hosts
263
      @configurations[:development].merge!("host" => nil)
264 265 266 267 268 269 270 271 272 273

      ActiveRecord::Tasks::DatabaseTasks.expects(:drop)

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end
  end

  class DatabaseTasksDropCurrentTest < ActiveRecord::TestCase
    def setup
      @configurations = {
274 275 276
        "development" => {"database" => "dev-db"},
        "test"        => {"database" => "test-db"},
        "production"  => {"database" => "prod-db"}
277 278 279 280 281
      }

      ActiveRecord::Base.stubs(:configurations).returns(@configurations)
    end

282
    def test_drops_current_environment_database
283
      ActiveRecord::Tasks::DatabaseTasks.expects(:drop).
284
        with("database" => "prod-db")
285

286
      ActiveRecord::Tasks::DatabaseTasks.drop_current(
287
        ActiveSupport::StringInquirer.new("production")
288
      )
289 290
    end

291
    def test_drops_test_and_development_databases_when_env_was_not_specified
292
      ActiveRecord::Tasks::DatabaseTasks.expects(:drop).
293
        with("database" => "dev-db")
294
      ActiveRecord::Tasks::DatabaseTasks.expects(:drop).
295
        with("database" => "test-db")
296 297

      ActiveRecord::Tasks::DatabaseTasks.drop_current(
298
        ActiveSupport::StringInquirer.new("development")
299 300 301
      )
    end

302
    def test_drops_testand_development_databases_when_rails_env_is_development
303 304
      old_env = ENV["RAILS_ENV"]
      ENV["RAILS_ENV"] = "development"
305
      ActiveRecord::Tasks::DatabaseTasks.expects(:drop).
306
        with("database" => "dev-db")
307
      ActiveRecord::Tasks::DatabaseTasks.expects(:drop).
308
        with("database" => "test-db")
309

310
      ActiveRecord::Tasks::DatabaseTasks.drop_current(
311
        ActiveSupport::StringInquirer.new("development")
312
      )
313
    ensure
314
      ENV["RAILS_ENV"] = old_env
315 316 317
    end
  end

318
  class DatabaseTasksMigrateTest < ActiveRecord::TestCase
319 320
    self.use_transactional_tests = false

321
    def setup
322
      ActiveRecord::Tasks::DatabaseTasks.migrations_paths = "custom/path"
323 324 325 326 327 328
    end

    def teardown
      ActiveRecord::Tasks::DatabaseTasks.migrations_paths = nil
    end

329
    def test_migrate_receives_correct_env_vars
330
      verbose, version = ENV["VERBOSE"], ENV["VERSION"]
331

332 333
      ENV["VERBOSE"] = "false"
      ENV["VERSION"] = "4"
334

335
      ActiveRecord::Migrator.expects(:migrate).with("custom/path", 4)
336 337
      ActiveRecord::Tasks::DatabaseTasks.migrate
    ensure
338
      ENV["VERBOSE"], ENV["VERSION"] = verbose, version
339
    end
340 341 342 343 344

    def test_migrate_clears_schema_cache_afterward
      ActiveRecord::Base.expects(:clear_cache!)
      ActiveRecord::Tasks::DatabaseTasks.migrate
    end
345
  end
K
kennyj 已提交
346

347
  class DatabaseTasksPurgeTest < ActiveRecord::TestCase
K
kennyj 已提交
348
    include DatabaseTasksSetupper
349

K
kennyj 已提交
350 351 352
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_purge") do
        eval("@#{v}").expects(:purge)
353
        ActiveRecord::Tasks::DatabaseTasks.purge "adapter" => k
K
kennyj 已提交
354
      end
355 356
    end
  end
S
Simon Jefford 已提交
357

358 359 360
  class DatabaseTasksPurgeCurrentTest < ActiveRecord::TestCase
    def test_purges_current_environment_database
      configurations = {
361 362 363
        "development" => {"database" => "dev-db"},
        "test"        => {"database" => "test-db"},
        "production"  => {"database" => "prod-db"}
364 365 366 367
      }
      ActiveRecord::Base.stubs(:configurations).returns(configurations)

      ActiveRecord::Tasks::DatabaseTasks.expects(:purge).
368
        with("database" => "prod-db")
369
      ActiveRecord::Base.expects(:establish_connection).with(:production)
370

371
      ActiveRecord::Tasks::DatabaseTasks.purge_current("production")
372 373 374 375 376
    end
  end

  class DatabaseTasksPurgeAllTest < ActiveRecord::TestCase
    def test_purge_all_local_configurations
377
      configurations = {development: {"database" => "my-db"}}
378 379 380
      ActiveRecord::Base.stubs(:configurations).returns(configurations)

      ActiveRecord::Tasks::DatabaseTasks.expects(:purge).
381
        with("database" => "my-db")
382 383 384 385 386

      ActiveRecord::Tasks::DatabaseTasks.purge_all
    end
  end

S
Simon Jefford 已提交
387
  class DatabaseTasksCharsetTest < ActiveRecord::TestCase
K
kennyj 已提交
388
    include DatabaseTasksSetupper
389

K
kennyj 已提交
390 391 392
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_charset") do
        eval("@#{v}").expects(:charset)
393
        ActiveRecord::Tasks::DatabaseTasks.charset "adapter" => k
K
kennyj 已提交
394
      end
S
Simon Jefford 已提交
395 396
    end
  end
K
kennyj 已提交
397

398 399
  class DatabaseTasksCollationTest < ActiveRecord::TestCase
    include DatabaseTasksSetupper
400

401 402 403
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_collation") do
        eval("@#{v}").expects(:collation)
404
        ActiveRecord::Tasks::DatabaseTasks.collation "adapter" => k
405 406 407 408
      end
    end
  end

K
kennyj 已提交
409
  class DatabaseTasksStructureDumpTest < ActiveRecord::TestCase
K
kennyj 已提交
410
    include DatabaseTasksSetupper
K
kennyj 已提交
411

K
kennyj 已提交
412 413 414
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_structure_dump") do
        eval("@#{v}").expects(:structure_dump).with("awesome-file.sql")
415
        ActiveRecord::Tasks::DatabaseTasks.structure_dump({"adapter" => k}, "awesome-file.sql")
K
kennyj 已提交
416
      end
K
kennyj 已提交
417 418
    end
  end
K
kennyj 已提交
419 420

  class DatabaseTasksStructureLoadTest < ActiveRecord::TestCase
K
kennyj 已提交
421
    include DatabaseTasksSetupper
K
kennyj 已提交
422

K
kennyj 已提交
423 424 425
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_structure_load") do
        eval("@#{v}").expects(:structure_load).with("awesome-file.sql")
426
        ActiveRecord::Tasks::DatabaseTasks.structure_load({"adapter" => k}, "awesome-file.sql")
K
kennyj 已提交
427
      end
K
kennyj 已提交
428 429
    end
  end
430 431 432 433 434 435 436

  class DatabaseTasksCheckSchemaFileTest < ActiveRecord::TestCase
    def test_check_schema_file
      Kernel.expects(:abort).with(regexp_matches(/awesome-file.sql/))
      ActiveRecord::Tasks::DatabaseTasks.check_schema_file("awesome-file.sql")
    end
  end
437 438 439

  class DatabaseTasksCheckSchemaFileDefaultsTest < ActiveRecord::TestCase
    def test_check_schema_file_defaults
440 441
      ActiveRecord::Tasks::DatabaseTasks.stubs(:db_dir).returns("/tmp")
      assert_equal "/tmp/schema.rb", ActiveRecord::Tasks::DatabaseTasks.schema_file
442 443 444 445
    end
  end

  class DatabaseTasksCheckSchemaFileSpecifiedFormatsTest < ActiveRecord::TestCase
446
    {ruby: "schema.rb", sql: "structure.sql"}.each_pair do |fmt, filename|
447
      define_method("test_check_schema_file_for_#{fmt}_format") do
448
        ActiveRecord::Tasks::DatabaseTasks.stubs(:db_dir).returns("/tmp")
449 450 451 452
        assert_equal "/tmp/#{filename}", ActiveRecord::Tasks::DatabaseTasks.schema_file(fmt)
      end
    end
  end
453
end