aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md6
-rw-r--r--activerecord/lib/active_record/autosave_association.rb10
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb9
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb1
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_adapter.rb4
-rw-r--r--activerecord/lib/active_record/counter_cache.rb3
-rw-r--r--activerecord/lib/active_record/database_configurations.rb31
-rw-r--r--activerecord/lib/active_record/database_configurations/database_config.rb4
-rw-r--r--activerecord/lib/active_record/database_configurations/hash_config.rb7
-rw-r--r--activerecord/lib/active_record/database_configurations/url_config.rb7
-rw-r--r--activerecord/lib/active_record/locking/optimistic.rb2
-rw-r--r--activerecord/lib/active_record/railties/databases.rake18
-rw-r--r--activerecord/lib/active_record/tasks/database_tasks.rb10
-rw-r--r--activerecord/lib/active_record/test_databases.rb4
-rw-r--r--activerecord/test/cases/adapter_test.rb28
-rw-r--r--activerecord/test/cases/autosave_association_test.rb15
-rw-r--r--activerecord/test/cases/base_test.rb8
-rw-r--r--activerecord/test/cases/tasks/database_tasks_test.rb213
-rw-r--r--activerecord/test/cases/tasks/legacy_database_tasks_test.rb591
-rw-r--r--activerecord/test/models/company.rb8
-rw-r--r--activerecord/test/models/contract.rb4
-rw-r--r--activerecord/test/schema/mysql2_specific_schema.rb7
-rw-r--r--activerecord/test/schema/sqlite_specific_schema.rb11
23 files changed, 282 insertions, 719 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index a7c2680015..63555de8e6 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,9 @@
+* Deprecate `column_name_length`, `table_name_length`, `columns_per_table`,
+ `indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
+ and `joins_per_query` methods in `DatabaseLimits`.
+
+ *Ryuta Kamizono*
+
* ActiveRecord::Base.configurations now returns an object.
ActiveRecord::Base.configurations used to return a hash, but this
diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb
index a405f05e0b..783a8366ce 100644
--- a/activerecord/lib/active_record/autosave_association.rb
+++ b/activerecord/lib/active_record/autosave_association.rb
@@ -392,7 +392,7 @@ module ActiveRecord
records -= records_to_destroy
end
- records.each_with_index do |record, index|
+ records.each do |record|
next if record.destroyed?
saved = true
@@ -401,11 +401,11 @@ module ActiveRecord
if autosave
saved = association.insert_record(record, false)
elsif !reflection.nested?
+ association_saved = association.insert_record(record)
+
if reflection.validate?
- valid = association_valid?(reflection, record, index)
- saved = valid ? association.insert_record(record, false) : false
- else
- association.insert_record(record)
+ errors.add(reflection.name) unless association_saved
+ saved = association_saved
end
end
elsif autosave
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb b/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb
index 7a9e7add24..ad148efcfe 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/database_limits.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require "active_support/deprecation"
+
module ActiveRecord
module ConnectionAdapters # :nodoc:
module DatabaseLimits
@@ -12,11 +14,13 @@ module ActiveRecord
def column_name_length
64
end
+ deprecate :column_name_length
# Returns the maximum length of a table name.
def table_name_length
64
end
+ deprecate :table_name_length
# Returns the maximum allowed length for an index name. This
# limit is enforced by \Rails and is less than or equal to
@@ -36,16 +40,19 @@ module ActiveRecord
def columns_per_table
1024
end
+ deprecate :columns_per_table
# Returns the maximum number of indexes per table.
def indexes_per_table
16
end
+ deprecate :indexes_per_table
# Returns the maximum number of columns in a multicolumn index.
def columns_per_multicolumn_index
16
end
+ deprecate :columns_per_multicolumn_index
# Returns the maximum number of elements in an IN (x,y,z) clause.
# +nil+ means no limit.
@@ -57,11 +64,13 @@ module ActiveRecord
def sql_query_length
1048575
end
+ deprecate :sql_query_length
# Returns maximum number of joins in a single query.
def joins_per_query
256
end
+ deprecate :joins_per_query
end
end
end
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
index 84ea7a0c33..4a6e915b66 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
@@ -602,6 +602,7 @@ module ActiveRecord
# The +type+ and +options+ parameters will be ignored if present. It can be helpful
# to provide these in a migration's +change+ method so it can be reverted.
# In that case, +type+ and +options+ will be used by #add_column.
+ # Indexes on the column are automatically removed.
def remove_column(table_name, column_name, type = nil, options = {})
execute "ALTER TABLE #{quote_table_name(table_name)} #{remove_column_for_alter(table_name, column_name, type, options)}"
end
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
index 8999d3232a..a62651daff 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
@@ -127,6 +127,10 @@ module ActiveRecord
)
end
+ def replica?
+ @config[:replica] || false
+ end
+
def migrations_paths # :nodoc:
@config[:migrations_paths] || Migrator.migrations_paths
end
diff --git a/activerecord/lib/active_record/counter_cache.rb b/activerecord/lib/active_record/counter_cache.rb
index c7f0077a76..aad30b40ea 100644
--- a/activerecord/lib/active_record/counter_cache.rb
+++ b/activerecord/lib/active_record/counter_cache.rb
@@ -159,8 +159,7 @@ module ActiveRecord
end
private
-
- def _create_record(*)
+ def _create_record(attribute_names = self.attribute_names)
id = super
each_counter_cached_associations do |association|
diff --git a/activerecord/lib/active_record/database_configurations.rb b/activerecord/lib/active_record/database_configurations.rb
index 14b7cb040f..a94f46d07f 100644
--- a/activerecord/lib/active_record/database_configurations.rb
+++ b/activerecord/lib/active_record/database_configurations.rb
@@ -16,17 +16,34 @@ module ActiveRecord
end
# Collects the configs for the environment and optionally the specification
- # name passed in.
+ # name passed in. To include replica configurations pass `include_replicas: true`.
#
# If a spec name is provided a single DatabaseConfiguration object will be
# returned, otherwise an array of DatabaseConfiguration objects will be
- # returned that corresponds with the environment requested.
- def configs_for(env = nil, spec = nil, &blk)
- configs = env_with_configs(env)
+ # returned that corresponds with the environment and type requested.
+ #
+ # Options:
+ #
+ # <tt>env_name:</tt> The environment name. Defaults to nil which will collect
+ # configs for all environments.
+ # <tt>spec_name:</tt> The specification name (ie primary, animals, etc.). Defaults
+ # to +nil+.
+ # <tt>include_replicas:</tt> Determines whether to include replicas in the
+ # the returned list. Most of the time we're only iterating over the write
+ # connection (i.e. migrations don't need to run for the write and read connection).
+ # Defaults to +false+.
+ def configs_for(env_name: nil, spec_name: nil, include_replicas: false)
+ configs = env_with_configs(env_name)
+
+ unless include_replicas
+ configs = configs.select do |db_config|
+ !db_config.replica?
+ end
+ end
- if spec
+ if spec_name
configs.find do |db_config|
- db_config.spec_name == spec
+ db_config.spec_name == spec_name
end
else
configs
@@ -157,7 +174,7 @@ module ActiveRecord
when :each, :first
configurations.send(method, *args, &blk)
when :fetch
- configs_for(args.first)
+ configs_for(env_name: args.first)
when :values
configurations.map(&:config)
else
diff --git a/activerecord/lib/active_record/database_configurations/database_config.rb b/activerecord/lib/active_record/database_configurations/database_config.rb
index 4a58115cd5..6250827b34 100644
--- a/activerecord/lib/active_record/database_configurations/database_config.rb
+++ b/activerecord/lib/active_record/database_configurations/database_config.rb
@@ -13,6 +13,10 @@ module ActiveRecord
@spec_name = spec_name
end
+ def replica?
+ raise NotImplementedError
+ end
+
def url_config?
false
end
diff --git a/activerecord/lib/active_record/database_configurations/hash_config.rb b/activerecord/lib/active_record/database_configurations/hash_config.rb
index 2ee218c730..18ed7c0466 100644
--- a/activerecord/lib/active_record/database_configurations/hash_config.rb
+++ b/activerecord/lib/active_record/database_configurations/hash_config.rb
@@ -31,6 +31,13 @@ module ActiveRecord
super(env_name, spec_name)
@config = config
end
+
+ # Determines whether a database configuration is for a replica / readonly
+ # connection. If the `replica` key is present in the config, `replica?` will
+ # return +true+.
+ def replica?
+ config["replica"]
+ end
end
end
end
diff --git a/activerecord/lib/active_record/database_configurations/url_config.rb b/activerecord/lib/active_record/database_configurations/url_config.rb
index c3d9798c37..f526c59d56 100644
--- a/activerecord/lib/active_record/database_configurations/url_config.rb
+++ b/activerecord/lib/active_record/database_configurations/url_config.rb
@@ -41,6 +41,13 @@ module ActiveRecord
true
end
+ # Determines whether a database configuration is for a replica / readonly
+ # connection. If the `replica` key is present in the config, `replica?` will
+ # return +true+.
+ def replica?
+ config["replica"]
+ end
+
private
def build_config(original_config, url)
if /^jdbc:/.match?(url)
diff --git a/activerecord/lib/active_record/locking/optimistic.rb b/activerecord/lib/active_record/locking/optimistic.rb
index 1030b2368b..4a3a31fc95 100644
--- a/activerecord/lib/active_record/locking/optimistic.rb
+++ b/activerecord/lib/active_record/locking/optimistic.rb
@@ -61,7 +61,7 @@ module ActiveRecord
end
private
- def _create_record(attribute_names = self.attribute_names, *)
+ def _create_record(attribute_names = self.attribute_names)
if locking_enabled?
# We always want to persist the locking version, even if we don't detect
# a change from the default, since the database might have no default
diff --git a/activerecord/lib/active_record/railties/databases.rake b/activerecord/lib/active_record/railties/databases.rake
index 15b0459422..be5ef350a9 100644
--- a/activerecord/lib/active_record/railties/databases.rake
+++ b/activerecord/lib/active_record/railties/databases.rake
@@ -26,7 +26,7 @@ db_namespace = namespace :db do
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
desc "Create #{spec_name} database for current environment"
task spec_name => :load_config do
- db_config = ActiveRecord::Base.configurations.configs_for(Rails.env, spec_name)
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
ActiveRecord::Tasks::DatabaseTasks.create(db_config.config)
end
end
@@ -45,7 +45,7 @@ db_namespace = namespace :db do
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
desc "Drop #{spec_name} database for current environment"
task spec_name => [:load_config, :check_protected_environments] do
- db_config = ActiveRecord::Base.configurations.configs_for(Rails.env, spec_name)
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config)
end
end
@@ -73,7 +73,7 @@ db_namespace = namespace :db do
desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
task migrate: :load_config do
- ActiveRecord::Base.configurations.configs_for(Rails.env).each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
ActiveRecord::Base.establish_connection(db_config.config)
ActiveRecord::Tasks::DatabaseTasks.migrate
end
@@ -99,7 +99,7 @@ db_namespace = namespace :db do
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
desc "Migrate #{spec_name} database for current environment"
task spec_name => :load_config do
- db_config = ActiveRecord::Base.configurations.configs_for(Rails.env, spec_name)
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
ActiveRecord::Base.establish_connection(db_config.config)
ActiveRecord::Tasks::DatabaseTasks.migrate
end
@@ -274,7 +274,7 @@ db_namespace = namespace :db do
desc "Creates a db/schema.rb file that is portable against any DB supported by Active Record"
task dump: :load_config do
require "active_record/schema_dumper"
- ActiveRecord::Base.configurations.configs_for(Rails.env).each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :ruby)
File.open(filename, "w:utf-8") do |file|
ActiveRecord::Base.establish_connection(db_config.config)
@@ -313,7 +313,7 @@ db_namespace = namespace :db do
namespace :structure do
desc "Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
task dump: :load_config do
- ActiveRecord::Base.configurations.configs_for(Rails.env).each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
ActiveRecord::Base.establish_connection(db_config.config)
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :sql)
ActiveRecord::Tasks::DatabaseTasks.structure_dump(db_config.config, filename)
@@ -354,7 +354,7 @@ db_namespace = namespace :db do
begin
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
ActiveRecord::Schema.verbose = false
- ActiveRecord::Base.configurations.configs_for("test").each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :ruby)
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, :ruby, filename, "test")
end
@@ -367,7 +367,7 @@ db_namespace = namespace :db do
# desc "Recreate the test database from an existent structure.sql file"
task load_structure: %w(db:test:purge) do
- ActiveRecord::Base.configurations.configs_for("test").each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :sql)
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, :sql, filename, "test")
end
@@ -375,7 +375,7 @@ db_namespace = namespace :db do
# desc "Empty the test database"
task purge: %w(load_config check_protected_environments) do
- ActiveRecord::Base.configurations.configs_for("test").each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
ActiveRecord::Tasks::DatabaseTasks.purge(db_config.config)
end
end
diff --git a/activerecord/lib/active_record/tasks/database_tasks.rb b/activerecord/lib/active_record/tasks/database_tasks.rb
index 3a1791f9c7..16e66982e5 100644
--- a/activerecord/lib/active_record/tasks/database_tasks.rb
+++ b/activerecord/lib/active_record/tasks/database_tasks.rb
@@ -117,7 +117,7 @@ module ActiveRecord
if options.has_key?(:config)
@current_config = options[:config]
else
- @current_config ||= ActiveRecord::Base.configurations.configs_for(options[:env], options[:spec]).config
+ @current_config ||= ActiveRecord::Base.configurations.configs_for(env_name: options[:env], spec_name: options[:spec]).config
end
end
@@ -143,7 +143,7 @@ module ActiveRecord
def for_each
databases = Rails.application.config.database_configuration
- database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(Rails.env)
+ database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
# if this is a single database application we don't want tasks for each primary database
return if database_configs.count == 1
@@ -208,7 +208,7 @@ module ActiveRecord
end
def charset_current(environment = env, specification_name = spec)
- charset ActiveRecord::Base.configurations.configs_for(environment, specification_name).config
+ charset ActiveRecord::Base.configurations.configs_for(env_name: environment, spec_name: specification_name).config
end
def charset(*arguments)
@@ -217,7 +217,7 @@ module ActiveRecord
end
def collation_current(environment = env, specification_name = spec)
- collation ActiveRecord::Base.configurations.configs_for(environment, specification_name).config
+ collation ActiveRecord::Base.configurations.configs_for(env_name: environment, spec_name: specification_name).config
end
def collation(*arguments)
@@ -351,7 +351,7 @@ module ActiveRecord
environments << "test" if environment == "development"
environments.each do |env|
- ActiveRecord::Base.configurations.configs_for(env).each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: env).each do |db_config|
yield db_config.config, db_config.spec_name, env
end
end
diff --git a/activerecord/lib/active_record/test_databases.rb b/activerecord/lib/active_record/test_databases.rb
index 16113eb04e..999830ba79 100644
--- a/activerecord/lib/active_record/test_databases.rb
+++ b/activerecord/lib/active_record/test_databases.rb
@@ -15,7 +15,7 @@ module ActiveRecord
def self.create_and_load_schema(i, env_name:)
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
- ActiveRecord::Base.configurations.configs_for(env_name).each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
db_config.config["database"] += "-#{i}"
ActiveRecord::Tasks::DatabaseTasks.create(db_config.config)
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
@@ -28,7 +28,7 @@ module ActiveRecord
def self.drop(env_name:)
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
- ActiveRecord::Base.configurations.configs_for(env_name).each do |db_config|
+ ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config)
end
ensure
diff --git a/activerecord/test/cases/adapter_test.rb b/activerecord/test/cases/adapter_test.rb
index 67734d24d7..1c461a0459 100644
--- a/activerecord/test/cases/adapter_test.rb
+++ b/activerecord/test/cases/adapter_test.rb
@@ -300,6 +300,34 @@ module ActiveRecord
def test_supports_multi_insert_is_deprecated
assert_deprecated { @connection.supports_multi_insert? }
end
+
+ def test_column_name_length_is_deprecated
+ assert_deprecated { @connection.column_name_length }
+ end
+
+ def test_table_name_length_is_deprecated
+ assert_deprecated { @connection.table_name_length }
+ end
+
+ def test_columns_per_table_is_deprecated
+ assert_deprecated { @connection.columns_per_table }
+ end
+
+ def test_indexes_per_table_is_deprecated
+ assert_deprecated { @connection.indexes_per_table }
+ end
+
+ def test_columns_per_multicolumn_index_is_deprecated
+ assert_deprecated { @connection.columns_per_multicolumn_index }
+ end
+
+ def test_sql_query_length_is_deprecated
+ assert_deprecated { @connection.sql_query_length }
+ end
+
+ def test_joins_per_query_is_deprecated
+ assert_deprecated { @connection.joins_per_query }
+ end
end
class AdapterForeignKeyTest < ActiveRecord::TestCase
diff --git a/activerecord/test/cases/autosave_association_test.rb b/activerecord/test/cases/autosave_association_test.rb
index ade1f4b44d..fa618735d7 100644
--- a/activerecord/test/cases/autosave_association_test.rb
+++ b/activerecord/test/cases/autosave_association_test.rb
@@ -558,6 +558,13 @@ class TestDefaultAutosaveAssociationOnAHasManyAssociation < ActiveRecord::TestCa
assert_equal no_of_clients + 1, Client.count
end
+ def test_parent_should_save_children_record_with_foreign_key_validation_set_in_before_save_callback
+ company = NewlyContractedCompany.new(name: "test")
+
+ assert company.save
+ assert_not_empty company.reload.new_contracts
+ end
+
def test_parent_should_not_get_saved_with_duplicate_children_records
assert_no_difference "Reply.count" do
assert_no_difference "SillyUniqueReply.count" do
@@ -568,7 +575,13 @@ class TestDefaultAutosaveAssociationOnAHasManyAssociation < ActiveRecord::TestCa
])
assert_not reply.save
- assert_not_empty reply.errors
+ assert_equal ["is invalid"], reply.errors[:silly_unique_replies]
+ assert_empty reply.silly_unique_replies.first.errors
+
+ assert_equal(
+ ["has already been taken"],
+ reply.silly_unique_replies.last.errors[:content]
+ )
end
end
end
diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb
index d216fe16fa..f6311f9256 100644
--- a/activerecord/test/cases/base_test.rb
+++ b/activerecord/test/cases/base_test.rb
@@ -853,8 +853,7 @@ class BasicsTest < ActiveRecord::TestCase
assert_equal company, Company.find(company.id)
end
- # TODO: extend defaults tests to other databases!
- if current_adapter?(:PostgreSQLAdapter)
+ if current_adapter?(:PostgreSQLAdapter, :Mysql2Adapter, :SQLite3Adapter)
def test_default
with_timezone_config default: :local do
default = Default.new
@@ -866,7 +865,10 @@ class BasicsTest < ActiveRecord::TestCase
# char types
assert_equal "Y", default.char1
assert_equal "a varchar field", default.char2
- assert_equal "a text field", default.char3
+ # Mysql text type can't have default value
+ unless current_adapter?(:Mysql2Adapter)
+ assert_equal "a text field", default.char3
+ end
end
end
end
diff --git a/activerecord/test/cases/tasks/database_tasks_test.rb b/activerecord/test/cases/tasks/database_tasks_test.rb
index a39a7371fe..d674bd562f 100644
--- a/activerecord/test/cases/tasks/database_tasks_test.rb
+++ b/activerecord/test/cases/tasks/database_tasks_test.rb
@@ -156,24 +156,20 @@ module ActiveRecord
class DatabaseTasksCreateAllTest < ActiveRecord::TestCase
def setup
- @old_configurations = ActiveRecord::Base.configurations
@configurations = { "development" => { "database" => "my-db" } }
$stdout, @original_stdout = StringIO.new, $stdout
$stderr, @original_stderr = StringIO.new, $stderr
-
- ActiveRecord::Base.configurations = @configurations
end
def teardown
$stdout, $stderr = @original_stdout, @original_stderr
- ActiveRecord::Base.configurations = @old_configurations
end
def test_ignores_configurations_without_databases
@configurations["development"]["database"] = nil
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_not_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
ActiveRecord::Tasks::DatabaseTasks.create_all
end
@@ -183,7 +179,7 @@ module ActiveRecord
def test_ignores_remote_databases
@configurations["development"]["host"] = "my.server.tld"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_not_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
ActiveRecord::Tasks::DatabaseTasks.create_all
end
@@ -193,7 +189,7 @@ module ActiveRecord
def test_warning_for_remote_databases
@configurations["development"]["host"] = "my.server.tld"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
ActiveRecord::Tasks::DatabaseTasks.create_all
assert_match "This task only modifies local databases. my-db is on a remote host.",
@@ -204,7 +200,7 @@ module ActiveRecord
def test_creates_configurations_with_local_ip
@configurations["development"]["host"] = "127.0.0.1"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
ActiveRecord::Tasks::DatabaseTasks.create_all
end
@@ -214,7 +210,7 @@ module ActiveRecord
def test_creates_configurations_with_local_host
@configurations["development"]["host"] = "localhost"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
ActiveRecord::Tasks::DatabaseTasks.create_all
end
@@ -224,33 +220,39 @@ module ActiveRecord
def test_creates_configurations_with_blank_hosts
@configurations["development"]["host"] = nil
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
ActiveRecord::Tasks::DatabaseTasks.create_all
end
end
end
+
+ private
+ def with_stubbed_configurations_establish_connection
+ old_configurations = ActiveRecord::Base.configurations
+ ActiveRecord::Base.configurations = @configurations
+
+ # To refrain from connecting to a newly created empty DB in
+ # sqlite3_mem tests
+ ActiveRecord::Base.connection_handler.stub(:establish_connection, nil) do
+ yield
+ end
+ ensure
+ ActiveRecord::Base.configurations = old_configurations
+ end
end
class DatabaseTasksCreateCurrentTest < ActiveRecord::TestCase
def setup
- @old_configurations = ActiveRecord::Base.configurations
-
@configurations = {
"development" => { "database" => "dev-db" },
"test" => { "database" => "test-db" },
- "production" => { "url" => "abstract://prod-db-url" }
+ "production" => { "url" => "abstract://prod-db-host/prod-db" }
}
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- ActiveRecord::Base.configurations = @old_configurations
end
def test_creates_current_environment_database
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:create,
@@ -264,11 +266,11 @@ module ActiveRecord
end
def test_creates_current_environment_database_with_url
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:create,
- ["url" => "prod-db-url"],
+ ["adapter" => "abstract", "database" => "prod-db", "host" => "prod-db-host"],
) do
ActiveRecord::Tasks::DatabaseTasks.create_current(
ActiveSupport::StringInquirer.new("production")
@@ -278,7 +280,7 @@ module ActiveRecord
end
def test_creates_test_and_development_databases_when_env_was_not_specified
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:create,
@@ -298,7 +300,7 @@ module ActiveRecord
old_env = ENV["RAILS_ENV"]
ENV["RAILS_ENV"] = "development"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:create,
@@ -325,27 +327,31 @@ module ActiveRecord
end
end
end
+
+ private
+ def with_stubbed_configurations_establish_connection
+ old_configurations = ActiveRecord::Base.configurations
+ ActiveRecord::Base.configurations = @configurations
+
+ ActiveRecord::Base.connection_handler.stub(:establish_connection, nil) do
+ yield
+ end
+ ensure
+ ActiveRecord::Base.configurations = old_configurations
+ end
end
class DatabaseTasksCreateCurrentThreeTierTest < ActiveRecord::TestCase
def setup
- @old_configurations = ActiveRecord::Base.configurations
-
@configurations = {
"development" => { "primary" => { "database" => "dev-db" }, "secondary" => { "database" => "secondary-dev-db" } },
"test" => { "primary" => { "database" => "test-db" }, "secondary" => { "database" => "secondary-test-db" } },
- "production" => { "primary" => { "url" => "abstract://prod-db-url" }, "secondary" => { "url" => "abstract://secondary-prod-db-url" } }
+ "production" => { "primary" => { "url" => "abstract://prod-db-host/prod-db" }, "secondary" => { "url" => "abstract://secondary-prod-db-host/secondary-prod-db" } }
}
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- ActiveRecord::Base.configurations = @old_configurations
end
def test_creates_current_environment_database
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:create,
@@ -362,13 +368,13 @@ module ActiveRecord
end
def test_creates_current_environment_database_with_url
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:create,
[
- ["url" => "prod-db-url"],
- ["url" => "secondary-prod-db-url"]
+ ["adapter" => "abstract", "database" => "prod-db", "host" => "prod-db-host"],
+ ["adapter" => "abstract", "database" => "secondary-prod-db", "host" => "secondary-prod-db-host"]
]
) do
ActiveRecord::Tasks::DatabaseTasks.create_current(
@@ -379,7 +385,7 @@ module ActiveRecord
end
def test_creates_test_and_development_databases_when_env_was_not_specified
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:create,
@@ -401,7 +407,7 @@ module ActiveRecord
old_env = ENV["RAILS_ENV"]
ENV["RAILS_ENV"] = "development"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations_establish_connection do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:create,
@@ -434,6 +440,18 @@ module ActiveRecord
end
end
end
+
+ private
+ def with_stubbed_configurations_establish_connection
+ old_configurations = ActiveRecord::Base.configurations
+ ActiveRecord::Base.configurations = @configurations
+
+ ActiveRecord::Base.connection_handler.stub(:establish_connection, nil) do
+ yield
+ end
+ ensure
+ ActiveRecord::Base.configurations = old_configurations
+ end
end
class DatabaseTasksDropTest < ActiveRecord::TestCase
@@ -452,24 +470,20 @@ module ActiveRecord
class DatabaseTasksDropAllTest < ActiveRecord::TestCase
def setup
- @old_configurations = ActiveRecord::Base.configurations
@configurations = { development: { "database" => "my-db" } }
$stdout, @original_stdout = StringIO.new, $stdout
$stderr, @original_stderr = StringIO.new, $stderr
-
- ActiveRecord::Base.configurations = @configurations
end
def teardown
$stdout, $stderr = @original_stdout, @original_stderr
- ActiveRecord::Base.configurations = @old_configurations
end
def test_ignores_configurations_without_databases
@configurations[:development]["database"] = nil
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_not_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
ActiveRecord::Tasks::DatabaseTasks.drop_all
end
@@ -479,7 +493,7 @@ module ActiveRecord
def test_ignores_remote_databases
@configurations[:development]["host"] = "my.server.tld"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_not_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
ActiveRecord::Tasks::DatabaseTasks.drop_all
end
@@ -489,7 +503,7 @@ module ActiveRecord
def test_warning_for_remote_databases
@configurations[:development]["host"] = "my.server.tld"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
ActiveRecord::Tasks::DatabaseTasks.drop_all
assert_match "This task only modifies local databases. my-db is on a remote host.",
@@ -500,7 +514,7 @@ module ActiveRecord
def test_drops_configurations_with_local_ip
@configurations[:development]["host"] = "127.0.0.1"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
ActiveRecord::Tasks::DatabaseTasks.drop_all
end
@@ -510,7 +524,7 @@ module ActiveRecord
def test_drops_configurations_with_local_host
@configurations[:development]["host"] = "localhost"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
ActiveRecord::Tasks::DatabaseTasks.drop_all
end
@@ -520,32 +534,35 @@ module ActiveRecord
def test_drops_configurations_with_blank_hosts
@configurations[:development]["host"] = nil
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
ActiveRecord::Tasks::DatabaseTasks.drop_all
end
end
end
+
+ private
+ def with_stubbed_configurations
+ old_configurations = ActiveRecord::Base.configurations
+ ActiveRecord::Base.configurations = @configurations
+
+ yield
+ ensure
+ ActiveRecord::Base.configurations = old_configurations
+ end
end
class DatabaseTasksDropCurrentTest < ActiveRecord::TestCase
def setup
- @old_configurations = ActiveRecord::Base.configurations
@configurations = {
"development" => { "database" => "dev-db" },
"test" => { "database" => "test-db" },
- "production" => { "url" => "abstract://prod-db-url" }
+ "production" => { "url" => "abstract://prod-db-host/prod-db" }
}
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- ActiveRecord::Base.configurations = @old_configurations
end
def test_drops_current_environment_database
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called_with(ActiveRecord::Tasks::DatabaseTasks, :drop,
["database" => "test-db"]) do
ActiveRecord::Tasks::DatabaseTasks.drop_current(
@@ -556,9 +573,9 @@ module ActiveRecord
end
def test_drops_current_environment_database_with_url
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called_with(ActiveRecord::Tasks::DatabaseTasks, :drop,
- ["url" => "prod-db-url"]) do
+ ["adapter" => "abstract", "database" => "prod-db", "host" => "prod-db-host"]) do
ActiveRecord::Tasks::DatabaseTasks.drop_current(
ActiveSupport::StringInquirer.new("production")
)
@@ -567,7 +584,7 @@ module ActiveRecord
end
def test_drops_test_and_development_databases_when_env_was_not_specified
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:drop,
@@ -587,7 +604,7 @@ module ActiveRecord
old_env = ENV["RAILS_ENV"]
ENV["RAILS_ENV"] = "development"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:drop,
@@ -604,26 +621,29 @@ module ActiveRecord
ensure
ENV["RAILS_ENV"] = old_env
end
+
+ private
+ def with_stubbed_configurations
+ old_configurations = ActiveRecord::Base.configurations
+ ActiveRecord::Base.configurations = @configurations
+
+ yield
+ ensure
+ ActiveRecord::Base.configurations = old_configurations
+ end
end
class DatabaseTasksDropCurrentThreeTierTest < ActiveRecord::TestCase
def setup
- @old_configurations = ActiveRecord::Base.configurations
@configurations = {
"development" => { "primary" => { "database" => "dev-db" }, "secondary" => { "database" => "secondary-dev-db" } },
"test" => { "primary" => { "database" => "test-db" }, "secondary" => { "database" => "secondary-test-db" } },
- "production" => { "primary" => { "url" => "abstract://prod-db-url" }, "secondary" => { "url" => "abstract://secondary-prod-db-url" } }
+ "production" => { "primary" => { "url" => "abstract://prod-db-host/prod-db" }, "secondary" => { "url" => "abstract://secondary-prod-db-host/secondary-prod-db" } }
}
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- ActiveRecord::Base.configurations = @old_configurations
end
def test_drops_current_environment_database
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:drop,
@@ -640,13 +660,13 @@ module ActiveRecord
end
def test_drops_current_environment_database_with_url
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:drop,
[
- ["url" => "prod-db-url"],
- ["url" => "secondary-prod-db-url"]
+ ["adapter" => "abstract", "database" => "prod-db", "host" => "prod-db-host"],
+ ["adapter" => "abstract", "database" => "secondary-prod-db", "host" => "secondary-prod-db-host"]
]
) do
ActiveRecord::Tasks::DatabaseTasks.drop_current(
@@ -657,7 +677,7 @@ module ActiveRecord
end
def test_drops_test_and_development_databases_when_env_was_not_specified
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:drop,
@@ -679,7 +699,7 @@ module ActiveRecord
old_env = ENV["RAILS_ENV"]
ENV["RAILS_ENV"] = "development"
- ActiveRecord::Base.configurations do
+ with_stubbed_configurations do
assert_called_with(
ActiveRecord::Tasks::DatabaseTasks,
:drop,
@@ -698,6 +718,16 @@ module ActiveRecord
ensure
ENV["RAILS_ENV"] = old_env
end
+
+ private
+ def with_stubbed_configurations
+ old_configurations = ActiveRecord::Base.configurations
+ ActiveRecord::Base.configurations = @configurations
+
+ yield
+ ensure
+ ActiveRecord::Base.configurations = old_configurations
+ end
end
if current_adapter?(:SQLite3Adapter) && !in_memory_db?
@@ -860,15 +890,13 @@ module ActiveRecord
ActiveRecord::Base.configurations = configurations
- ActiveRecord::Base.configurations do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :purge,
- ["database" => "prod-db"]
- ) do
- assert_called_with(ActiveRecord::Base, :establish_connection, [:production]) do
- ActiveRecord::Tasks::DatabaseTasks.purge_current("production")
- end
+ assert_called_with(
+ ActiveRecord::Tasks::DatabaseTasks,
+ :purge,
+ ["database" => "prod-db"]
+ ) do
+ assert_called_with(ActiveRecord::Base, :establish_connection, [:production]) do
+ ActiveRecord::Tasks::DatabaseTasks.purge_current("production")
end
end
ensure
@@ -881,14 +909,13 @@ module ActiveRecord
old_configurations = ActiveRecord::Base.configurations
configurations = { development: { "database" => "my-db" } }
ActiveRecord::Base.configurations = configurations
- ActiveRecord::Base.configurations do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :purge,
- ["database" => "my-db"]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.purge_all
- end
+
+ assert_called_with(
+ ActiveRecord::Tasks::DatabaseTasks,
+ :purge,
+ ["database" => "my-db"]
+ ) do
+ ActiveRecord::Tasks::DatabaseTasks.purge_all
end
ensure
ActiveRecord::Base.configurations = old_configurations
diff --git a/activerecord/test/cases/tasks/legacy_database_tasks_test.rb b/activerecord/test/cases/tasks/legacy_database_tasks_test.rb
deleted file mode 100644
index ffa55be878..0000000000
--- a/activerecord/test/cases/tasks/legacy_database_tasks_test.rb
+++ /dev/null
@@ -1,591 +0,0 @@
-# frozen_string_literal: true
-
-require "cases/helper"
-require "active_record/tasks/database_tasks"
-
-module ActiveRecord
- class LegacyDatabaseTasksCreateAllTest < ActiveRecord::TestCase
- def setup
- @old_configurations = ActiveRecord::Base.configurations.to_h
-
- @configurations = { "development" => { "database" => "my-db" } }
-
- $stdout, @original_stdout = StringIO.new, $stdout
- $stderr, @original_stderr = StringIO.new, $stderr
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- $stdout, $stderr = @original_stdout, @original_stderr
- ActiveRecord::Base.configurations = @old_configurations
- end
-
- def test_ignores_configurations_without_databases
- @configurations["development"]["database"] = nil
-
- ActiveRecord::Base.configurations.to_h do
- assert_not_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
- ActiveRecord::Tasks::DatabaseTasks.create_all
- end
- end
- end
-
- def test_ignores_remote_databases
- @configurations["development"]["host"] = "my.server.tld"
-
- ActiveRecord::Base.configurations.to_h do
- assert_not_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
- ActiveRecord::Tasks::DatabaseTasks.create_all
- end
- end
- end
-
- def test_warning_for_remote_databases
- @configurations["development"]["host"] = "my.server.tld"
-
- ActiveRecord::Base.configurations.to_h do
- ActiveRecord::Tasks::DatabaseTasks.create_all
-
- assert_match "This task only modifies local databases. my-db is on a remote host.",
- $stderr.string
- end
- end
-
- def test_creates_configurations_with_local_ip
- @configurations["development"]["host"] = "127.0.0.1"
-
- ActiveRecord::Base.configurations.to_h do
- assert_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
- ActiveRecord::Tasks::DatabaseTasks.create_all
- end
- end
- end
-
- def test_creates_configurations_with_local_host
- @configurations["development"]["host"] = "localhost"
-
- ActiveRecord::Base.configurations.to_h do
- assert_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
- ActiveRecord::Tasks::DatabaseTasks.create_all
- end
- end
- end
-
- def test_creates_configurations_with_blank_hosts
- @configurations["development"]["host"] = nil
-
- ActiveRecord::Base.configurations.to_h do
- assert_called(ActiveRecord::Tasks::DatabaseTasks, :create) do
- ActiveRecord::Tasks::DatabaseTasks.create_all
- end
- end
- end
- end
-
- class LegacyDatabaseTasksCreateCurrentTest < ActiveRecord::TestCase
- def setup
- @old_configurations = ActiveRecord::Base.configurations.to_h
-
- @configurations = {
- "development" => { "database" => "dev-db" },
- "test" => { "database" => "test-db" },
- "production" => { "url" => "abstract://prod-db-url" }
- }
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- ActiveRecord::Base.configurations = @old_configurations
- end
-
- def test_creates_current_environment_database
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :create,
- ["database" => "test-db"],
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("test")
- )
- end
- end
- end
-
- def test_creates_current_environment_database_with_url
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :create,
- ["url" => "prod-db-url"],
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("production")
- )
- end
- end
- end
-
- def test_creates_test_and_development_databases_when_env_was_not_specified
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :create,
- [
- ["database" => "dev-db"],
- ["database" => "test-db"]
- ],
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- end
-
- def test_creates_test_and_development_databases_when_rails_env_is_development
- old_env = ENV["RAILS_ENV"]
- ENV["RAILS_ENV"] = "development"
-
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :create,
- [
- ["database" => "dev-db"],
- ["database" => "test-db"]
- ],
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- ensure
- ENV["RAILS_ENV"] = old_env
- end
-
- def test_establishes_connection_for_the_given_environments
- ActiveRecord::Tasks::DatabaseTasks.stub(:create, nil) do
- assert_called_with(ActiveRecord::Base, :establish_connection, [:development]) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- end
- end
-
- class LegacyDatabaseTasksCreateCurrentThreeTierTest < ActiveRecord::TestCase
- def setup
- @old_configurations = ActiveRecord::Base.configurations.to_h
-
- @configurations = {
- "development" => { "primary" => { "database" => "dev-db" }, "secondary" => { "database" => "secondary-dev-db" } },
- "test" => { "primary" => { "database" => "test-db" }, "secondary" => { "database" => "secondary-test-db" } },
- "production" => { "primary" => { "url" => "abstract://prod-db-url" }, "secondary" => { "url" => "abstract://secondary-prod-db-url" } }
- }
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- ActiveRecord::Base.configurations = @old_configurations
- end
-
- def test_creates_current_environment_database
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :create,
- [
- ["database" => "test-db"],
- ["database" => "secondary-test-db"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("test")
- )
- end
- end
- end
-
- def test_creates_current_environment_database_with_url
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :create,
- [
- ["url" => "prod-db-url"],
- ["url" => "secondary-prod-db-url"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("production")
- )
- end
- end
- end
-
- def test_creates_test_and_development_databases_when_env_was_not_specified
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :create,
- [
- ["database" => "dev-db"],
- ["database" => "secondary-dev-db"],
- ["database" => "test-db"],
- ["database" => "secondary-test-db"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- end
-
- def test_creates_test_and_development_databases_when_rails_env_is_development
- old_env = ENV["RAILS_ENV"]
- ENV["RAILS_ENV"] = "development"
-
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :create,
- [
- ["database" => "dev-db"],
- ["database" => "secondary-dev-db"],
- ["database" => "test-db"],
- ["database" => "secondary-test-db"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- ensure
- ENV["RAILS_ENV"] = old_env
- end
-
- def test_establishes_connection_for_the_given_environments_config
- ActiveRecord::Tasks::DatabaseTasks.stub(:create, nil) do
- assert_called_with(
- ActiveRecord::Base,
- :establish_connection,
- [:development]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.create_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- end
- end
-
- class LegacyDatabaseTasksDropAllTest < ActiveRecord::TestCase
- def setup
- @old_configurations = ActiveRecord::Base.configurations.to_h
-
- @configurations = { development: { "database" => "my-db" } }
-
- $stdout, @original_stdout = StringIO.new, $stdout
- $stderr, @original_stderr = StringIO.new, $stderr
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- $stdout, $stderr = @original_stdout, @original_stderr
- ActiveRecord::Base.configurations = @old_configurations
- end
-
- def test_ignores_configurations_without_databases
- @configurations[:development]["database"] = nil
-
- ActiveRecord::Base.configurations.to_h do
- assert_not_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
- ActiveRecord::Tasks::DatabaseTasks.drop_all
- end
- end
- end
-
- def test_ignores_remote_databases
- @configurations[:development]["host"] = "my.server.tld"
-
- ActiveRecord::Base.configurations.to_h do
- assert_not_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
- ActiveRecord::Tasks::DatabaseTasks.drop_all
- end
- end
- end
-
- def test_warning_for_remote_databases
- @configurations[:development]["host"] = "my.server.tld"
-
- ActiveRecord::Base.configurations.to_h do
- ActiveRecord::Tasks::DatabaseTasks.drop_all
-
- assert_match "This task only modifies local databases. my-db is on a remote host.",
- $stderr.string
- end
- end
-
- def test_drops_configurations_with_local_ip
- @configurations[:development]["host"] = "127.0.0.1"
-
- ActiveRecord::Base.configurations.to_h do
- assert_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
- ActiveRecord::Tasks::DatabaseTasks.drop_all
- end
- end
- end
-
- def test_drops_configurations_with_local_host
- @configurations[:development]["host"] = "localhost"
-
- ActiveRecord::Base.configurations.to_h do
- assert_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
- ActiveRecord::Tasks::DatabaseTasks.drop_all
- end
- end
- end
-
- def test_drops_configurations_with_blank_hosts
- @configurations[:development]["host"] = nil
-
- ActiveRecord::Base.configurations.to_h do
- assert_called(ActiveRecord::Tasks::DatabaseTasks, :drop) do
- ActiveRecord::Tasks::DatabaseTasks.drop_all
- end
- end
- end
- end
-
- class LegacyDatabaseTasksDropCurrentTest < ActiveRecord::TestCase
- def setup
- @old_configurations = ActiveRecord::Base.configurations.to_h
-
- @configurations = {
- "development" => { "database" => "dev-db" },
- "test" => { "database" => "test-db" },
- "production" => { "url" => "abstract://prod-db-url" }
- }
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- ActiveRecord::Base.configurations = @old_configurations
- end
-
- def test_drops_current_environment_database
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(ActiveRecord::Tasks::DatabaseTasks, :drop,
- ["database" => "test-db"]) do
- ActiveRecord::Tasks::DatabaseTasks.drop_current(
- ActiveSupport::StringInquirer.new("test")
- )
- end
- end
- end
-
- def test_drops_current_environment_database_with_url
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(ActiveRecord::Tasks::DatabaseTasks, :drop,
- ["url" => "prod-db-url"]) do
- ActiveRecord::Tasks::DatabaseTasks.drop_current(
- ActiveSupport::StringInquirer.new("production")
- )
- end
- end
- end
-
- def test_drops_test_and_development_databases_when_env_was_not_specified
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :drop,
- [
- ["database" => "dev-db"],
- ["database" => "test-db"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.drop_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- end
-
- def test_drops_testand_development_databases_when_rails_env_is_development
- old_env = ENV["RAILS_ENV"]
- ENV["RAILS_ENV"] = "development"
-
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :drop,
- [
- ["database" => "dev-db"],
- ["database" => "test-db"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.drop_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- ensure
- ENV["RAILS_ENV"] = old_env
- end
- end
-
- class LegacyDatabaseTasksDropCurrentThreeTierTest < ActiveRecord::TestCase
- def setup
- @old_configurations = ActiveRecord::Base.configurations.to_h
-
- @configurations = {
- "development" => { "primary" => { "database" => "dev-db" }, "secondary" => { "database" => "secondary-dev-db" } },
- "test" => { "primary" => { "database" => "test-db" }, "secondary" => { "database" => "secondary-test-db" } },
- "production" => { "primary" => { "url" => "abstract://prod-db-url" }, "secondary" => { "url" => "abstract://secondary-prod-db-url" } }
- }
-
- ActiveRecord::Base.configurations = @configurations
- end
-
- def teardown
- ActiveRecord::Base.configurations = @old_configurations
- end
-
- def test_drops_current_environment_database
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :drop,
- [
- ["database" => "test-db"],
- ["database" => "secondary-test-db"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.drop_current(
- ActiveSupport::StringInquirer.new("test")
- )
- end
- end
- end
-
- def test_drops_current_environment_database_with_url
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :drop,
- [
- ["url" => "prod-db-url"],
- ["url" => "secondary-prod-db-url"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.drop_current(
- ActiveSupport::StringInquirer.new("production")
- )
- end
- end
- end
-
- def test_drops_test_and_development_databases_when_env_was_not_specified
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :drop,
- [
- ["database" => "dev-db"],
- ["database" => "secondary-dev-db"],
- ["database" => "test-db"],
- ["database" => "secondary-test-db"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.drop_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- end
-
- def test_drops_testand_development_databases_when_rails_env_is_development
- old_env = ENV["RAILS_ENV"]
- ENV["RAILS_ENV"] = "development"
-
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :drop,
- [
- ["database" => "dev-db"],
- ["database" => "secondary-dev-db"],
- ["database" => "test-db"],
- ["database" => "secondary-test-db"]
- ]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.drop_current(
- ActiveSupport::StringInquirer.new("development")
- )
- end
- end
- ensure
- ENV["RAILS_ENV"] = old_env
- end
- end
-
- class LegacyDatabaseTasksPurgeCurrentTest < ActiveRecord::TestCase
- def test_purges_current_environment_database
- @old_configurations = ActiveRecord::Base.configurations.to_h
-
- configurations = {
- "development" => { "database" => "dev-db" },
- "test" => { "database" => "test-db" },
- "production" => { "database" => "prod-db" }
- }
-
- ActiveRecord::Base.configurations = configurations
-
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :purge,
- ["database" => "prod-db"]
- ) do
- assert_called_with(ActiveRecord::Base, :establish_connection, [:production]) do
- ActiveRecord::Tasks::DatabaseTasks.purge_current("production")
- end
- end
- end
- ensure
- ActiveRecord::Base.configurations = @old_configurations
- end
- end
-
- class LegacyDatabaseTasksPurgeAllTest < ActiveRecord::TestCase
- def test_purge_all_local_configurations
- @old_configurations = ActiveRecord::Base.configurations.to_h
-
- configurations = { development: { "database" => "my-db" } }
- ActiveRecord::Base.configurations = configurations
-
- ActiveRecord::Base.configurations.to_h do
- assert_called_with(
- ActiveRecord::Tasks::DatabaseTasks,
- :purge,
- ["database" => "my-db"]
- ) do
- ActiveRecord::Tasks::DatabaseTasks.purge_all
- end
- end
- ensure
- ActiveRecord::Base.configurations = @old_configurations
- end
- end
-end
diff --git a/activerecord/test/models/company.rb b/activerecord/test/models/company.rb
index d4d5275b78..485b35d58b 100644
--- a/activerecord/test/models/company.rb
+++ b/activerecord/test/models/company.rb
@@ -204,4 +204,12 @@ end
class VerySpecialClient < SpecialClient
end
+class NewlyContractedCompany < Company
+ has_many :new_contracts, foreign_key: "company_id"
+
+ before_save do
+ self.new_contracts << NewContract.new
+ end
+end
+
require "models/account"
diff --git a/activerecord/test/models/contract.rb b/activerecord/test/models/contract.rb
index f273badd85..3f663375c4 100644
--- a/activerecord/test/models/contract.rb
+++ b/activerecord/test/models/contract.rb
@@ -20,3 +20,7 @@ class Contract < ActiveRecord::Base
@bye_count += 1
end
end
+
+class NewContract < Contract
+ validates :company_id, presence: true
+end
diff --git a/activerecord/test/schema/mysql2_specific_schema.rb b/activerecord/test/schema/mysql2_specific_schema.rb
index 8371ba9528..0f2f6ddd68 100644
--- a/activerecord/test/schema/mysql2_specific_schema.rb
+++ b/activerecord/test/schema/mysql2_specific_schema.rb
@@ -14,6 +14,13 @@ ActiveRecord::Schema.define do
end
end
+ create_table :defaults, force: true do |t|
+ t.date :fixed_date, default: "2004-01-01"
+ t.datetime :fixed_time, default: "2004-01-01 00:00:00"
+ t.column :char1, "char(1)", default: "Y"
+ t.string :char2, limit: 50, default: "a varchar field"
+ end
+
create_table :binary_fields, force: true do |t|
t.binary :var_binary, limit: 255
t.binary :var_binary_large, limit: 4095
diff --git a/activerecord/test/schema/sqlite_specific_schema.rb b/activerecord/test/schema/sqlite_specific_schema.rb
new file mode 100644
index 0000000000..18192292e4
--- /dev/null
+++ b/activerecord/test/schema/sqlite_specific_schema.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+ActiveRecord::Schema.define do
+ create_table :defaults, force: true do |t|
+ t.date :fixed_date, default: "2004-01-01"
+ t.datetime :fixed_time, default: "2004-01-01 00:00:00"
+ t.column :char1, "char(1)", default: "Y"
+ t.string :char2, limit: 50, default: "a varchar field"
+ t.text :char3, limit: 50, default: "a text field"
+ end
+end