4b38a99e7a
The cause by which the test suite for the mysql adapter broke in 1502cae (reverted 89ba5bb) is because the precision was not extracted. The rounding problem in mysql adapter has not been fixed, but `mysql_56` helper tested only mysql2 adapter, its behavior was not apparent.
211 lines
5.8 KiB
Ruby
211 lines
5.8 KiB
Ruby
require File.expand_path('../../../../load_paths', __FILE__)
|
|
|
|
require 'config'
|
|
|
|
require 'active_support/testing/autorun'
|
|
require 'stringio'
|
|
|
|
require 'active_record'
|
|
require 'cases/test_case'
|
|
require 'active_support/dependencies'
|
|
require 'active_support/logger'
|
|
require 'active_support/core_ext/string/strip'
|
|
|
|
require 'support/config'
|
|
require 'support/connection'
|
|
|
|
# TODO: Move all these random hacks into the ARTest namespace and into the support/ dir
|
|
|
|
Thread.abort_on_exception = true
|
|
|
|
# Show backtraces for deprecated behavior for quicker cleanup.
|
|
ActiveSupport::Deprecation.debug = true
|
|
|
|
# Disable available locale checks to avoid warnings running the test suite.
|
|
I18n.enforce_available_locales = false
|
|
|
|
# Connect to the database
|
|
ARTest.connect
|
|
|
|
# Quote "type" if it's a reserved word for the current connection.
|
|
QUOTED_TYPE = ActiveRecord::Base.connection.quote_column_name('type')
|
|
|
|
# FIXME: Remove this when the deprecation cycle on TZ aware types by default ends.
|
|
ActiveRecord::Base.time_zone_aware_types << :time
|
|
|
|
def current_adapter?(*types)
|
|
types.any? do |type|
|
|
ActiveRecord::ConnectionAdapters.const_defined?(type) &&
|
|
ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters.const_get(type))
|
|
end
|
|
end
|
|
|
|
def in_memory_db?
|
|
current_adapter?(:SQLite3Adapter) &&
|
|
ActiveRecord::Base.connection_pool.spec.config[:database] == ":memory:"
|
|
end
|
|
|
|
def mysql_56?
|
|
current_adapter?(:MysqlAdapter, :Mysql2Adapter) &&
|
|
ActiveRecord::Base.connection.send(:version).join(".") >= "5.6.0"
|
|
end
|
|
|
|
def mysql_enforcing_gtid_consistency?
|
|
current_adapter?(:MysqlAdapter, :Mysql2Adapter) && 'ON' == ActiveRecord::Base.connection.show_variable('enforce_gtid_consistency')
|
|
end
|
|
|
|
def supports_savepoints?
|
|
ActiveRecord::Base.connection.supports_savepoints?
|
|
end
|
|
|
|
def with_env_tz(new_tz = 'US/Eastern')
|
|
old_tz, ENV['TZ'] = ENV['TZ'], new_tz
|
|
yield
|
|
ensure
|
|
old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
|
|
end
|
|
|
|
def with_timezone_config(cfg)
|
|
verify_default_timezone_config
|
|
|
|
old_default_zone = ActiveRecord::Base.default_timezone
|
|
old_awareness = ActiveRecord::Base.time_zone_aware_attributes
|
|
old_zone = Time.zone
|
|
|
|
if cfg.has_key?(:default)
|
|
ActiveRecord::Base.default_timezone = cfg[:default]
|
|
end
|
|
if cfg.has_key?(:aware_attributes)
|
|
ActiveRecord::Base.time_zone_aware_attributes = cfg[:aware_attributes]
|
|
end
|
|
if cfg.has_key?(:zone)
|
|
Time.zone = cfg[:zone]
|
|
end
|
|
yield
|
|
ensure
|
|
ActiveRecord::Base.default_timezone = old_default_zone
|
|
ActiveRecord::Base.time_zone_aware_attributes = old_awareness
|
|
Time.zone = old_zone
|
|
end
|
|
|
|
# This method makes sure that tests don't leak global state related to time zones.
|
|
EXPECTED_ZONE = nil
|
|
EXPECTED_DEFAULT_TIMEZONE = :utc
|
|
EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES = false
|
|
def verify_default_timezone_config
|
|
if Time.zone != EXPECTED_ZONE
|
|
$stderr.puts <<-MSG
|
|
\n#{self}
|
|
Global state `Time.zone` was leaked.
|
|
Expected: #{EXPECTED_ZONE}
|
|
Got: #{Time.zone}
|
|
MSG
|
|
end
|
|
if ActiveRecord::Base.default_timezone != EXPECTED_DEFAULT_TIMEZONE
|
|
$stderr.puts <<-MSG
|
|
\n#{self}
|
|
Global state `ActiveRecord::Base.default_timezone` was leaked.
|
|
Expected: #{EXPECTED_DEFAULT_TIMEZONE}
|
|
Got: #{ActiveRecord::Base.default_timezone}
|
|
MSG
|
|
end
|
|
if ActiveRecord::Base.time_zone_aware_attributes != EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES
|
|
$stderr.puts <<-MSG
|
|
\n#{self}
|
|
Global state `ActiveRecord::Base.time_zone_aware_attributes` was leaked.
|
|
Expected: #{EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES}
|
|
Got: #{ActiveRecord::Base.time_zone_aware_attributes}
|
|
MSG
|
|
end
|
|
end
|
|
|
|
def enable_extension!(extension, connection)
|
|
return false unless connection.supports_extensions?
|
|
return connection.reconnect! if connection.extension_enabled?(extension)
|
|
|
|
connection.enable_extension extension
|
|
connection.commit_db_transaction if connection.transaction_open?
|
|
connection.reconnect!
|
|
end
|
|
|
|
def disable_extension!(extension, connection)
|
|
return false unless connection.supports_extensions?
|
|
return true unless connection.extension_enabled?(extension)
|
|
|
|
connection.disable_extension extension
|
|
connection.reconnect!
|
|
end
|
|
|
|
require "cases/validations_repair_helper"
|
|
class ActiveSupport::TestCase
|
|
include ActiveRecord::TestFixtures
|
|
include ActiveRecord::ValidationsRepairHelper
|
|
|
|
self.fixture_path = FIXTURES_ROOT
|
|
self.use_instantiated_fixtures = false
|
|
self.use_transactional_fixtures = true
|
|
|
|
def create_fixtures(*fixture_set_names, &block)
|
|
ActiveRecord::FixtureSet.create_fixtures(ActiveSupport::TestCase.fixture_path, fixture_set_names, fixture_class_names, &block)
|
|
end
|
|
end
|
|
|
|
def load_schema
|
|
# silence verbose schema loading
|
|
original_stdout = $stdout
|
|
$stdout = StringIO.new
|
|
|
|
adapter_name = ActiveRecord::Base.connection.adapter_name.downcase
|
|
adapter_specific_schema_file = SCHEMA_ROOT + "/#{adapter_name}_specific_schema.rb"
|
|
|
|
load SCHEMA_ROOT + "/schema.rb"
|
|
|
|
if File.exist?(adapter_specific_schema_file)
|
|
load adapter_specific_schema_file
|
|
end
|
|
ensure
|
|
$stdout = original_stdout
|
|
end
|
|
|
|
load_schema
|
|
|
|
class SQLSubscriber
|
|
attr_reader :logged
|
|
attr_reader :payloads
|
|
|
|
def initialize
|
|
@logged = []
|
|
@payloads = []
|
|
end
|
|
|
|
def start(name, id, payload)
|
|
@payloads << payload
|
|
@logged << [payload[:sql].squish, payload[:name], payload[:binds]]
|
|
end
|
|
|
|
def finish(name, id, payload); end
|
|
end
|
|
|
|
module InTimeZone
|
|
private
|
|
|
|
def in_time_zone(zone)
|
|
old_zone = Time.zone
|
|
old_tz = ActiveRecord::Base.time_zone_aware_attributes
|
|
|
|
Time.zone = zone ? ActiveSupport::TimeZone[zone] : nil
|
|
ActiveRecord::Base.time_zone_aware_attributes = !zone.nil?
|
|
yield
|
|
ensure
|
|
Time.zone = old_zone
|
|
ActiveRecord::Base.time_zone_aware_attributes = old_tz
|
|
end
|
|
end
|
|
|
|
require 'mocha/setup' # FIXME: stop using mocha
|
|
|
|
# FIXME: we have tests that depend on run order, we should fix that and
|
|
# remove this method call.
|
|
require 'active_support/test_case'
|
|
ActiveSupport::TestCase.test_order = :sorted
|