diff options
6 files changed, 309 insertions, 9 deletions
diff --git a/activerecord/lib/active_record/tasks/database_tasks.rb b/activerecord/lib/active_record/tasks/database_tasks.rb index 7174c63b38..e49af454b5 100644 --- a/activerecord/lib/active_record/tasks/database_tasks.rb +++ b/activerecord/lib/active_record/tasks/database_tasks.rb @@ -19,7 +19,7 @@ class ActiveRecord::Tasks::DatabaseTasks def self.create_current each_current_configuration { |configuration| create configuration } - ActiveRecord::Base.establish_connection Rails.env.to_sym + ActiveRecord::Base.establish_connection Rails.env end def self.drop(configuration) @@ -44,7 +44,7 @@ class ActiveRecord::Tasks::DatabaseTasks private def self.class_for_adapter(adapter) - key = TASKS_PATTERNS.keys.detect { |key| adapter[key] } + key = TASKS_PATTERNS.keys.detect { |pattern| adapter[pattern] } TASKS_PATTERNS[key] end @@ -52,7 +52,7 @@ class ActiveRecord::Tasks::DatabaseTasks environments = [Rails.env] environments << 'test' if Rails.env.development? - configurations = ActiveRecord::Base.configurations.values_at *environments + configurations = ActiveRecord::Base.configurations.values_at(*environments) configurations.compact.each do |configuration| yield configuration unless configuration['database'].blank? end diff --git a/activerecord/lib/active_record/tasks/mysql_database_tasks.rb b/activerecord/lib/active_record/tasks/mysql_database_tasks.rb index a1d36f0855..eb598629fa 100644 --- a/activerecord/lib/active_record/tasks/mysql_database_tasks.rb +++ b/activerecord/lib/active_record/tasks/mysql_database_tasks.rb @@ -39,7 +39,9 @@ class ActiveRecord::Tasks::MySQLDatabaseTasks private - attr_reader :configuration + def configuration + @configuration + end def configuration_without_database configuration.merge('database' => nil) @@ -56,7 +58,7 @@ class ActiveRecord::Tasks::MySQLDatabaseTasks case configuration['adapter'] when /jdbc/ require 'active_record/railties/jdbcmysql_error' - error_class = ArJdbcMySQL::Error + ArJdbcMySQL::Error when /mysql2/ Mysql2::Error else diff --git a/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb b/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb index c3c5b2f2f5..331825d3ec 100644 --- a/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb +++ b/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb @@ -28,7 +28,9 @@ class ActiveRecord::Tasks::PostgreSQLDatabaseTasks private - attr_reader :configuration + def configuration + @configuration + end def encoding configuration['encoding'] || DEFAULT_ENCODING diff --git a/activerecord/lib/active_record/tasks/sqlite_database_tasks.rb b/activerecord/lib/active_record/tasks/sqlite_database_tasks.rb index fff763421b..8f8021f47c 100644 --- a/activerecord/lib/active_record/tasks/sqlite_database_tasks.rb +++ b/activerecord/lib/active_record/tasks/sqlite_database_tasks.rb @@ -27,5 +27,7 @@ class ActiveRecord::Tasks::SQLiteDatabaseTasks private - attr_reader :configuration + def configuration + @configuration + end end diff --git a/activerecord/test/cases/database_tasks_test.rb b/activerecord/test/cases/database_tasks_test.rb new file mode 100644 index 0000000000..3cb82a8683 --- /dev/null +++ b/activerecord/test/cases/database_tasks_test.rb @@ -0,0 +1,296 @@ +require 'cases/helper' + +module ActiveRecord + class DatabaseTasksCreateTest < ActiveRecord::TestCase + def setup + @mysql_tasks, @postgresql_tasks, @sqlite_tasks = stub, stub, stub + + ActiveRecord::Tasks::MySQLDatabaseTasks.stubs(:new).returns @mysql_tasks + ActiveRecord::Tasks::PostgreSQLDatabaseTasks.stubs(:new). + returns @postgresql_tasks + ActiveRecord::Tasks::SQLiteDatabaseTasks.stubs(:new).returns @sqlite_tasks + end + + def test_mysql_create + @mysql_tasks.expects(:create) + + ActiveRecord::Tasks::DatabaseTasks.create 'adapter' => 'mysql' + end + + def test_mysql2_create + @mysql_tasks.expects(:create) + + ActiveRecord::Tasks::DatabaseTasks.create 'adapter' => 'mysql2' + end + + def test_postgresql_create + @postgresql_tasks.expects(:create) + + ActiveRecord::Tasks::DatabaseTasks.create 'adapter' => 'postgresql' + end + + def test_sqlite_create + @sqlite_tasks.expects(:create) + + ActiveRecord::Tasks::DatabaseTasks.create 'adapter' => 'sqlite3' + 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 + Rails.stubs(:env).returns ActiveSupport::StringInquirer.new('production') + + ActiveRecord::Tasks::DatabaseTasks.expects(:create). + with('database' => 'prod-db') + + ActiveRecord::Tasks::DatabaseTasks.create_current + end + + def test_creates_test_database_when_environment_is_database + Rails.stubs(:env).returns ActiveSupport::StringInquirer.new('development') + + ActiveRecord::Tasks::DatabaseTasks.expects(:create). + with('database' => 'dev-db') + ActiveRecord::Tasks::DatabaseTasks.expects(:create). + with('database' => 'test-db') + + ActiveRecord::Tasks::DatabaseTasks.create_current + end + + def test_establishes_connection_for_the_given_environment + Rails.stubs(:env).returns ActiveSupport::StringInquirer.new('development') + ActiveRecord::Tasks::DatabaseTasks.stubs(:create).returns true + + ActiveRecord::Base.expects(:establish_connection).with('development') + + ActiveRecord::Tasks::DatabaseTasks.create_current + end + end + + class DatabaseTasksDropTest < ActiveRecord::TestCase + def setup + @mysql_tasks, @postgresql_tasks, @sqlite_tasks = stub, stub, stub + + ActiveRecord::Tasks::MySQLDatabaseTasks.stubs(:new).returns @mysql_tasks + ActiveRecord::Tasks::PostgreSQLDatabaseTasks.stubs(:new). + returns @postgresql_tasks + ActiveRecord::Tasks::SQLiteDatabaseTasks.stubs(:new).returns @sqlite_tasks + end + + def test_mysql_create + @mysql_tasks.expects(:drop) + + ActiveRecord::Tasks::DatabaseTasks.drop 'adapter' => 'mysql' + end + + def test_mysql2_create + @mysql_tasks.expects(:drop) + + ActiveRecord::Tasks::DatabaseTasks.drop 'adapter' => 'mysql2' + end + + def test_postgresql_create + @postgresql_tasks.expects(:drop) + + ActiveRecord::Tasks::DatabaseTasks.drop 'adapter' => 'postgresql' + end + + def test_sqlite_create + @sqlite_tasks.expects(:drop) + + ActiveRecord::Tasks::DatabaseTasks.drop 'adapter' => 'sqlite3' + 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 + + def test_creates_configurations_with_local_ip + @configurations[:development].merge!('host' => '127.0.0.1') + + ActiveRecord::Tasks::DatabaseTasks.expects(:drop) + + ActiveRecord::Tasks::DatabaseTasks.drop_all + end + + def test_creates_configurations_with_local_host + @configurations[:development].merge!('host' => 'localhost') + + ActiveRecord::Tasks::DatabaseTasks.expects(:drop) + + ActiveRecord::Tasks::DatabaseTasks.drop_all + end + + def test_creates_configurations_with_blank_hosts + @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 + + def test_creates_current_environment_database + Rails.stubs(:env).returns ActiveSupport::StringInquirer.new('production') + + ActiveRecord::Tasks::DatabaseTasks.expects(:drop). + with('database' => 'prod-db') + + ActiveRecord::Tasks::DatabaseTasks.drop_current + end + + def test_creates_test_database_when_environment_is_database + Rails.stubs(:env).returns ActiveSupport::StringInquirer.new('development') + + ActiveRecord::Tasks::DatabaseTasks.expects(:drop). + with('database' => 'dev-db') + ActiveRecord::Tasks::DatabaseTasks.expects(:drop). + with('database' => 'test-db') + + ActiveRecord::Tasks::DatabaseTasks.drop_current + end + end + + class DatabaseTasksPurgeTest < ActiveRecord::TestCase + def setup + @mysql_tasks, @postgresql_tasks, @sqlite_tasks = stub, stub, stub + + ActiveRecord::Tasks::MySQLDatabaseTasks.stubs(:new).returns @mysql_tasks + ActiveRecord::Tasks::PostgreSQLDatabaseTasks.stubs(:new). + returns @postgresql_tasks + ActiveRecord::Tasks::SQLiteDatabaseTasks.stubs(:new).returns @sqlite_tasks + end + + def test_mysql_create + @mysql_tasks.expects(:purge) + + ActiveRecord::Tasks::DatabaseTasks.purge 'adapter' => 'mysql' + end + + def test_mysql2_create + @mysql_tasks.expects(:purge) + + ActiveRecord::Tasks::DatabaseTasks.purge 'adapter' => 'mysql2' + end + + def test_postgresql_create + @postgresql_tasks.expects(:purge) + + ActiveRecord::Tasks::DatabaseTasks.purge 'adapter' => 'postgresql' + end + + def test_sqlite_create + @sqlite_tasks.expects(:purge) + + ActiveRecord::Tasks::DatabaseTasks.purge 'adapter' => 'sqlite3' + end + end +end diff --git a/activerecord/test/cases/sqlite_rake_test.rb b/activerecord/test/cases/sqlite_rake_test.rb index c6f533d375..ad7146e2a9 100644 --- a/activerecord/test/cases/sqlite_rake_test.rb +++ b/activerecord/test/cases/sqlite_rake_test.rb @@ -1,8 +1,6 @@ require 'cases/helper' require 'pathname' -module Rails; end unless defined?(Rails) - module ActiveRecord class SqliteDBCreateTest < ActiveRecord::TestCase def setup |