database_tasks_test.rb 14.3 KB
Newer Older
1
require 'cases/helper'
A
Aaron Patterson 已提交
2
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 67 68
  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)
      ActiveRecord::Tasks::DatabaseTasks.structure_dump({'adapter' => :foo}, "awesome-file.sql")
    end
69 70 71 72 73 74

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

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

K
kennyj 已提交
80 81 82 83 84
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_create") do
        eval("@#{v}").expects(:create)
        ActiveRecord::Tasks::DatabaseTasks.create 'adapter' => k
      end
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 150 151 152 153 154 155 156 157 158 159 160
    end
  end

  class DatabaseTasksCreateAllTest < ActiveRecord::TestCase
    def setup
      @configurations = {'development' => {'database' => 'my-db'}}

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

    def test_ignores_configurations_without_databases
      @configurations['development'].merge!('database' => nil)

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

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_ignores_remote_databases
      @configurations['development'].merge!('host' => 'my.server.tld')
      $stderr.stubs(:puts).returns(nil)

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

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

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

      $stderr.expects(:puts).with('This task only modifies local databases. my-db is on a remote host.')

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_creates_configurations_with_local_ip
      @configurations['development'].merge!('host' => '127.0.0.1')

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

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_creates_configurations_with_local_host
      @configurations['development'].merge!('host' => 'localhost')

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

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end

    def test_creates_configurations_with_blank_hosts
      @configurations['development'].merge!('host' => nil)

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

      ActiveRecord::Tasks::DatabaseTasks.create_all
    end
  end

  class DatabaseTasksCreateCurrentTest < ActiveRecord::TestCase
    def setup
      @configurations = {
        'development' => {'database' => 'dev-db'},
        'test'        => {'database' => 'test-db'},
        'production'  => {'database' => 'prod-db'}
      }

      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).
        with('database' => 'prod-db')

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

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

      ActiveRecord::Tasks::DatabaseTasks.create_current(
        ActiveSupport::StringInquirer.new('development')
      )
    end

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

185 186 187
      ActiveRecord::Tasks::DatabaseTasks.create_current(
        ActiveSupport::StringInquirer.new('development')
      )
188 189
    ensure
      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 198 199
      ActiveRecord::Tasks::DatabaseTasks.create_current(
        ActiveSupport::StringInquirer.new('development')
      )
200 201 202 203
    end
  end

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

K
kennyj 已提交
206 207 208 209 210
    ADAPTERS_TASKS.each do |k, v|
      define_method("test_#{k}_drop") do
        eval("@#{v}").expects(:drop)
        ActiveRecord::Tasks::DatabaseTasks.drop 'adapter' => k
      end
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
    end
  end

  class DatabaseTasksDropAllTest < ActiveRecord::TestCase
    def setup
      @configurations = {:development => {'database' => 'my-db'}}

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

    def test_ignores_configurations_without_databases
      @configurations[:development].merge!('database' => nil)

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

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

    def test_ignores_remote_databases
      @configurations[:development].merge!('host' => 'my.server.tld')
      $stderr.stubs(:puts).returns(nil)

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

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

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

      $stderr.expects(:puts).with('This task only modifies local databases. my-db is on a remote host.')

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

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

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

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

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

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

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end

262
    def test_drops_configurations_with_blank_hosts
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
      @configurations[:development].merge!('host' => nil)

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

      ActiveRecord::Tasks::DatabaseTasks.drop_all
    end
  end

  class DatabaseTasksDropCurrentTest < ActiveRecord::TestCase
    def setup
      @configurations = {
        'development' => {'database' => 'dev-db'},
        'test'        => {'database' => 'test-db'},
        'production'  => {'database' => 'prod-db'}
      }

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

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

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

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

      ActiveRecord::Tasks::DatabaseTasks.drop_current(
        ActiveSupport::StringInquirer.new('development')
      )
    end

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

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

318
  class DatabaseTasksMigrateTest < ActiveRecord::TestCase
319 320 321 322 323 324 325 326
    def setup
      ActiveRecord::Tasks::DatabaseTasks.migrations_paths = 'custom/path'
    end

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

327 328 329 330 331 332
    def test_migrate_receives_correct_env_vars
      verbose, version = ENV['VERBOSE'], ENV['VERSION']

      ENV['VERBOSE'] = 'false'
      ENV['VERSION'] = '4'

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

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

345
  class DatabaseTasksPurgeTest < ActiveRecord::TestCase
K
kennyj 已提交
346
    include DatabaseTasksSetupper
347

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

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

      ActiveRecord::Tasks::DatabaseTasks.expects(:purge).
        with('database' => 'prod-db')
367
      ActiveRecord::Base.expects(:establish_connection).with(:production)
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384

      ActiveRecord::Tasks::DatabaseTasks.purge_current('production')
    end
  end

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

      ActiveRecord::Tasks::DatabaseTasks.expects(:purge).
        with('database' => 'my-db')

      ActiveRecord::Tasks::DatabaseTasks.purge_all
    end
  end

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

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

396 397
  class DatabaseTasksCollationTest < ActiveRecord::TestCase
    include DatabaseTasksSetupper
398

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

K
kennyj 已提交
407
  class DatabaseTasksStructureDumpTest < ActiveRecord::TestCase
K
kennyj 已提交
408
    include DatabaseTasksSetupper
K
kennyj 已提交
409

K
kennyj 已提交
410 411 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")
        ActiveRecord::Tasks::DatabaseTasks.structure_dump({'adapter' => k}, "awesome-file.sql")
      end
K
kennyj 已提交
415 416
    end
  end
K
kennyj 已提交
417 418

  class DatabaseTasksStructureLoadTest < ActiveRecord::TestCase
K
kennyj 已提交
419
    include DatabaseTasksSetupper
K
kennyj 已提交
420

K
kennyj 已提交
421 422 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")
        ActiveRecord::Tasks::DatabaseTasks.structure_load({'adapter' => k}, "awesome-file.sql")
      end
K
kennyj 已提交
426 427
    end
  end
428 429 430 431 432 433 434

  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
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450

  class DatabaseTasksCheckSchemaFileDefaultsTest < ActiveRecord::TestCase
    def test_check_schema_file_defaults
      ActiveRecord::Tasks::DatabaseTasks.stubs(:db_dir).returns('/tmp')
      assert_equal '/tmp/schema.rb', ActiveRecord::Tasks::DatabaseTasks.schema_file
    end
  end

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