2017-07-09 08:06:36 -04:00
|
|
|
# frozen_string_literal: true
|
2017-07-10 09:39:13 -04:00
|
|
|
|
2018-09-29 20:50:43 -04:00
|
|
|
require_relative "abstract_unit"
|
|
|
|
require "pp"
|
2016-08-06 12:03:25 -04:00
|
|
|
require "active_support/dependencies"
|
2018-09-29 20:50:43 -04:00
|
|
|
require_relative "dependencies_test_helpers"
|
2004-12-29 16:03:21 -05:00
|
|
|
|
2006-08-16 13:50:52 -04:00
|
|
|
module ModuleWithMissing
|
|
|
|
mattr_accessor :missing_count
|
|
|
|
def self.const_missing(name)
|
|
|
|
self.missing_count += 1
|
|
|
|
name
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-03-14 19:27:28 -04:00
|
|
|
module ModuleWithConstant
|
|
|
|
InheritedConstant = "Hello"
|
|
|
|
end
|
|
|
|
|
2012-01-05 20:12:46 -05:00
|
|
|
class DependenciesTest < ActiveSupport::TestCase
|
2014-06-28 05:57:27 -04:00
|
|
|
include DependenciesTestHelpers
|
|
|
|
|
|
|
|
setup do
|
|
|
|
@loaded_features_copy = $LOADED_FEATURES.dup
|
2018-09-29 20:50:43 -04:00
|
|
|
$LOAD_PATH << "test"
|
2004-12-29 16:03:21 -05:00
|
|
|
end
|
2006-07-08 14:14:49 -04:00
|
|
|
|
2014-06-28 05:57:27 -04:00
|
|
|
teardown do
|
|
|
|
ActiveSupport::Dependencies.clear
|
|
|
|
$LOADED_FEATURES.replace(@loaded_features_copy)
|
2018-09-29 20:50:43 -04:00
|
|
|
$LOAD_PATH.pop
|
2014-06-28 05:57:27 -04:00
|
|
|
end
|
2009-08-09 15:14:25 -04:00
|
|
|
|
2012-06-12 19:19:51 -04:00
|
|
|
def test_depend_on_path
|
|
|
|
expected = assert_raises(LoadError) do
|
2016-08-06 12:03:25 -04:00
|
|
|
Kernel.require "omgwtfbbq"
|
2012-06-12 19:19:51 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
e = assert_raises(LoadError) do
|
2016-08-06 12:03:25 -04:00
|
|
|
ActiveSupport::Dependencies.depend_on "omgwtfbbq"
|
2012-06-12 19:19:51 -04:00
|
|
|
end
|
|
|
|
assert_equal expected.path, e.path
|
|
|
|
end
|
|
|
|
|
2013-09-30 16:20:28 -04:00
|
|
|
def test_require_dependency_accepts_an_object_which_implements_to_path
|
|
|
|
o = Object.new
|
2016-08-06 12:03:25 -04:00
|
|
|
def o.to_path; "dependencies/service_one"; end
|
2013-09-30 16:20:28 -04:00
|
|
|
assert_nothing_raised {
|
|
|
|
require_dependency o
|
|
|
|
}
|
|
|
|
assert defined?(ServiceOne)
|
|
|
|
ensure
|
|
|
|
remove_constants(:ServiceOne)
|
|
|
|
end
|
|
|
|
|
2005-11-23 16:31:51 -05:00
|
|
|
def test_tracking_loaded_files
|
2014-08-13 06:37:12 -04:00
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "dependencies/service_one"
|
|
|
|
require_dependency "dependencies/service_two"
|
2014-08-13 06:37:12 -04:00
|
|
|
assert_equal 2, ActiveSupport::Dependencies.loaded.size
|
|
|
|
end
|
2010-02-10 18:06:42 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:ServiceOne, :ServiceTwo)
|
2004-12-29 16:03:21 -05:00
|
|
|
end
|
2005-11-23 16:31:51 -05:00
|
|
|
|
|
|
|
def test_tracking_identical_loaded_files
|
2014-08-13 06:37:12 -04:00
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "dependencies/service_one"
|
|
|
|
require_dependency "dependencies/service_one"
|
2014-08-13 06:37:12 -04:00
|
|
|
assert_equal 1, ActiveSupport::Dependencies.loaded.size
|
|
|
|
end
|
2010-02-10 18:06:42 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:ServiceOne)
|
2004-12-29 16:03:21 -05:00
|
|
|
end
|
|
|
|
|
2005-11-23 16:31:51 -05:00
|
|
|
def test_missing_dependency_raises_missing_source_file
|
2013-01-01 20:02:14 -05:00
|
|
|
assert_raise(LoadError) { require_dependency("missing_service") }
|
2004-12-29 16:03:21 -05:00
|
|
|
end
|
2005-11-23 16:31:51 -05:00
|
|
|
|
|
|
|
def test_dependency_which_raises_exception_isnt_added_to_loaded_set
|
2006-03-27 00:13:46 -05:00
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
filename = "dependencies/raises_exception"
|
2016-02-19 09:01:03 -05:00
|
|
|
expanded = File.expand_path(filename)
|
2006-03-27 00:13:46 -05:00
|
|
|
$raises_exception_load_count = 0
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2006-03-27 00:13:46 -05:00
|
|
|
5.times do |count|
|
2016-08-06 12:03:25 -04:00
|
|
|
e = assert_raise Exception, "should have loaded dependencies/raises_exception which raises an exception" do
|
2006-11-06 14:23:30 -05:00
|
|
|
require_dependency filename
|
|
|
|
end
|
2013-12-19 06:03:39 -05:00
|
|
|
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal "Loading me failed, so do not add to loaded or history.", e.message
|
2006-03-27 00:13:46 -05:00
|
|
|
assert_equal count + 1, $raises_exception_load_count
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2016-02-19 09:01:03 -05:00
|
|
|
assert_not ActiveSupport::Dependencies.loaded.include?(expanded)
|
|
|
|
assert_not ActiveSupport::Dependencies.history.include?(expanded)
|
2006-03-27 00:13:46 -05:00
|
|
|
end
|
2005-11-23 16:31:51 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-03-03 08:50:59 -05:00
|
|
|
def test_dependency_which_raises_doesnt_blindly_call_blame_file!
|
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
filename = "dependencies/raises_exception_without_blame_file"
|
2013-03-03 08:50:59 -05:00
|
|
|
assert_raises(Exception) { require_dependency filename }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2005-11-23 16:31:51 -05:00
|
|
|
def test_warnings_should_be_enabled_on_first_load
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies" do
|
2008-06-03 14:32:53 -04:00
|
|
|
old_warnings, ActiveSupport::Dependencies.warnings_on_first_load = ActiveSupport::Dependencies.warnings_on_first_load, true
|
2006-08-16 16:33:31 -04:00
|
|
|
filename = "check_warnings"
|
2017-05-15 10:17:28 -04:00
|
|
|
expanded = File.expand_path("dependencies/#{filename}", __dir__)
|
2006-03-27 00:13:46 -05:00
|
|
|
$check_warnings_load_count = 0
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2014-11-05 09:20:26 -05:00
|
|
|
assert_not ActiveSupport::Dependencies.loaded.include?(expanded)
|
|
|
|
assert_not ActiveSupport::Dependencies.history.include?(expanded)
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2006-03-27 00:13:46 -05:00
|
|
|
silence_warnings { require_dependency filename }
|
|
|
|
assert_equal 1, $check_warnings_load_count
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal true, $checked_verbose, "On first load warnings should be enabled."
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2016-09-16 12:44:05 -04:00
|
|
|
assert_includes ActiveSupport::Dependencies.loaded, expanded
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2014-11-05 09:20:26 -05:00
|
|
|
assert_not ActiveSupport::Dependencies.loaded.include?(expanded)
|
2016-09-16 12:44:05 -04:00
|
|
|
assert_includes ActiveSupport::Dependencies.history, expanded
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2006-03-27 00:13:46 -05:00
|
|
|
silence_warnings { require_dependency filename }
|
|
|
|
assert_equal 2, $check_warnings_load_count
|
2016-12-24 12:29:52 -05:00
|
|
|
assert_nil $checked_verbose, "After first load warnings should be left alone."
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2016-09-16 12:44:05 -04:00
|
|
|
assert_includes ActiveSupport::Dependencies.loaded, expanded
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2014-11-05 09:20:26 -05:00
|
|
|
assert_not ActiveSupport::Dependencies.loaded.include?(expanded)
|
2016-09-16 12:44:05 -04:00
|
|
|
assert_includes ActiveSupport::Dependencies.history, expanded
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2006-03-27 00:13:46 -05:00
|
|
|
enable_warnings { require_dependency filename }
|
|
|
|
assert_equal 3, $check_warnings_load_count
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal true, $checked_verbose, "After first load warnings should be left alone."
|
2005-11-23 16:31:51 -05:00
|
|
|
|
2016-09-16 12:44:05 -04:00
|
|
|
assert_includes ActiveSupport::Dependencies.loaded, expanded
|
2010-07-22 23:28:09 -04:00
|
|
|
ActiveSupport::Dependencies.warnings_on_first_load = old_warnings
|
2006-03-27 00:13:46 -05:00
|
|
|
end
|
2005-11-23 16:31:51 -05:00
|
|
|
end
|
2005-11-24 00:43:27 -05:00
|
|
|
|
|
|
|
def test_mutual_dependencies_dont_infinite_loop
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies" do
|
2006-03-27 00:13:46 -05:00
|
|
|
$mutual_dependencies_count = 0
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_nothing_raised { require_dependency "mutual_one" }
|
2006-03-27 00:13:46 -05:00
|
|
|
assert_equal 2, $mutual_dependencies_count
|
2005-11-24 00:43:27 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2005-11-24 00:43:27 -05:00
|
|
|
|
2006-03-27 00:13:46 -05:00
|
|
|
$mutual_dependencies_count = 0
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_nothing_raised { require_dependency "mutual_two" }
|
2006-03-27 00:13:46 -05:00
|
|
|
assert_equal 2, $mutual_dependencies_count
|
|
|
|
end
|
2005-11-24 00:43:27 -05:00
|
|
|
end
|
2006-07-08 14:14:49 -04:00
|
|
|
|
2012-08-28 14:27:59 -04:00
|
|
|
def test_circular_autoloading_detection
|
|
|
|
with_autoloading_fixtures do
|
2012-10-28 15:54:06 -04:00
|
|
|
e = assert_raise(RuntimeError) { Circular1 }
|
|
|
|
assert_equal "Circular dependency detected while autoloading constant Circular1", e.message
|
2012-08-28 14:27:59 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-10-25 07:50:42 -04:00
|
|
|
def test_ensures_the_expected_constant_is_defined
|
|
|
|
with_autoloading_fixtures do
|
|
|
|
e = assert_raise(LoadError) { Typo }
|
2015-04-02 10:57:49 -04:00
|
|
|
assert_match %r{Unable to autoload constant Typo, expected .*/test/autoloading_fixtures/typo.rb to define it}, e.message
|
2014-10-25 07:50:42 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_require_dependency_does_not_assume_any_particular_constant_is_defined
|
|
|
|
with_autoloading_fixtures do
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "typo"
|
2014-10-25 07:50:42 -04:00
|
|
|
assert_equal 1, TypO
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Regression, see https://github.com/rails/rails/issues/16468.
|
|
|
|
def test_require_dependency_interaction_with_autoloading
|
|
|
|
with_autoloading_fixtures do
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "typo"
|
2014-10-25 07:50:42 -04:00
|
|
|
assert_equal 1, TypO
|
|
|
|
|
|
|
|
e = assert_raise(LoadError) { Typo }
|
2015-04-02 10:57:49 -04:00
|
|
|
assert_match %r{Unable to autoload constant Typo, expected .*/test/autoloading_fixtures/typo.rb to define it}, e.message
|
2014-10-25 07:50:42 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-01-26 08:59:33 -05:00
|
|
|
# Regression see https://github.com/rails/rails/issues/31694
|
|
|
|
def test_included_constant_that_changes_to_have_exception_then_back_does_not_loop_forever
|
|
|
|
# This constant references a nested constant whose namespace will be auto-generated
|
|
|
|
parent_constant = <<-RUBY
|
|
|
|
class ConstantReloadError
|
|
|
|
AnotherConstant::ReloadError
|
|
|
|
end
|
|
|
|
RUBY
|
|
|
|
|
|
|
|
# This constant's namespace will be auto-generated,
|
|
|
|
# also, we'll edit it to contain an error at load-time
|
|
|
|
child_constant = <<-RUBY
|
|
|
|
class AnotherConstant::ReloadError
|
|
|
|
# no_such_method_as_this
|
|
|
|
end
|
|
|
|
RUBY
|
|
|
|
|
|
|
|
# Create a version which contains an error during loading
|
|
|
|
child_constant_with_error = child_constant.sub("# no_such_method_as_this", "no_such_method_as_this")
|
|
|
|
|
|
|
|
fixtures_path = File.join(__dir__, "autoloading_fixtures")
|
|
|
|
Dir.mktmpdir(nil, fixtures_path) do |tmpdir|
|
|
|
|
# Set up the file structure where constants will be loaded from
|
|
|
|
child_constant_path = "#{tmpdir}/another_constant/reload_error.rb"
|
|
|
|
File.write("#{tmpdir}/constant_reload_error.rb", parent_constant)
|
|
|
|
Dir.mkdir("#{tmpdir}/another_constant")
|
|
|
|
File.write(child_constant_path, child_constant_with_error)
|
|
|
|
|
|
|
|
tmpdir_name = tmpdir.split("/").last
|
|
|
|
with_loading("autoloading_fixtures/#{tmpdir_name}") do
|
|
|
|
# Load the file, with the error:
|
|
|
|
assert_raises(NameError) {
|
|
|
|
ConstantReloadError
|
|
|
|
}
|
|
|
|
|
|
|
|
Timeout.timeout(0.1) do
|
|
|
|
# Remove the constant, as if Rails development middleware is reloading changed files:
|
|
|
|
ActiveSupport::Dependencies.remove_unloadable_constants!
|
2018-04-03 21:34:51 -04:00
|
|
|
assert_not defined?(AnotherConstant::ReloadError)
|
2018-01-26 08:59:33 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
# Change the file, so that it is **correct** this time:
|
|
|
|
File.write(child_constant_path, child_constant)
|
|
|
|
|
|
|
|
# Again: Remove the constant, as if Rails development middleware is reloading changed files:
|
|
|
|
ActiveSupport::Dependencies.remove_unloadable_constants!
|
2018-04-03 21:34:51 -04:00
|
|
|
assert_not defined?(AnotherConstant::ReloadError)
|
2018-01-26 08:59:33 -05:00
|
|
|
|
|
|
|
# Now, reload the _fixed_ constant:
|
|
|
|
assert ConstantReloadError
|
|
|
|
assert AnotherConstant::ReloadError
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2006-01-28 19:37:39 -05:00
|
|
|
def test_module_loading
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-02-04 16:24:40 -05:00
|
|
|
assert_kind_of Module, A
|
|
|
|
assert_kind_of Class, A::B
|
|
|
|
assert_kind_of Class, A::C::D
|
2015-05-20 15:14:33 -04:00
|
|
|
assert_kind_of Class, A::C::EM::F
|
2006-02-04 16:24:40 -05:00
|
|
|
end
|
|
|
|
end
|
2006-07-08 14:14:49 -04:00
|
|
|
|
2006-03-27 00:13:46 -05:00
|
|
|
def test_non_existing_const_raises_name_error
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2009-03-08 16:11:58 -04:00
|
|
|
assert_raise(NameError) { DoesNotExist }
|
|
|
|
assert_raise(NameError) { NoModule::DoesNotExist }
|
|
|
|
assert_raise(NameError) { A::DoesNotExist }
|
|
|
|
assert_raise(NameError) { A::B::DoesNotExist }
|
2006-02-04 16:24:40 -05:00
|
|
|
end
|
2006-01-28 19:37:39 -05:00
|
|
|
end
|
2006-07-08 14:14:49 -04:00
|
|
|
|
2006-08-16 05:18:17 -04:00
|
|
|
def test_directories_manifest_as_modules_unless_const_defined
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-03-27 00:13:46 -05:00
|
|
|
assert_kind_of Module, ModuleFolder
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleFolder)
|
2006-03-27 00:13:46 -05:00
|
|
|
end
|
2006-07-08 14:14:49 -04:00
|
|
|
|
2006-08-16 05:18:17 -04:00
|
|
|
def test_module_with_nested_class
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-03-27 00:13:46 -05:00
|
|
|
assert_kind_of Class, ModuleFolder::NestedClass
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleFolder)
|
2006-03-27 00:13:46 -05:00
|
|
|
end
|
2006-07-08 14:14:49 -04:00
|
|
|
|
2006-08-16 05:18:17 -04:00
|
|
|
def test_module_with_nested_inline_class
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-08-16 05:18:17 -04:00
|
|
|
assert_kind_of Class, ModuleFolder::InlineClass
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleFolder)
|
2006-08-16 05:18:17 -04:00
|
|
|
end
|
|
|
|
|
2018-10-18 13:05:20 -04:00
|
|
|
def test_module_with_nested_class_requiring_lib_class
|
|
|
|
with_autoloading_fixtures do
|
2018-11-22 03:20:51 -05:00
|
|
|
_ = ModuleFolder::NestedWithRequire # assignment to silence parse-time warning "possibly useless use of :: in void context"
|
2018-10-18 13:05:20 -04:00
|
|
|
|
|
|
|
assert defined?(ModuleFolder::LibClass)
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded_constants.include?("ModuleFolder::LibClass")
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded_constants.include?("ConstFromLib")
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleFolder)
|
|
|
|
remove_constants(:ConstFromLib)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_module_with_nested_class_and_parent_requiring_lib_class
|
|
|
|
with_autoloading_fixtures do
|
2018-11-22 03:20:51 -05:00
|
|
|
_ = NestedWithRequireParent # assignment to silence parse-time warning "possibly useless use of a constant in void context"
|
2018-10-18 13:05:20 -04:00
|
|
|
|
|
|
|
assert defined?(ModuleFolder::LibClass)
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded_constants.include?("ModuleFolder::LibClass")
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded_constants.include?("ConstFromLib")
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleFolder)
|
|
|
|
remove_constants(:ConstFromLib)
|
|
|
|
end
|
|
|
|
|
2006-08-16 05:18:17 -04:00
|
|
|
def test_directories_may_manifest_as_nested_classes
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-08-16 05:18:17 -04:00
|
|
|
assert_kind_of Class, ClassFolder
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ClassFolder)
|
2006-08-16 05:18:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_class_with_nested_class
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-08-16 05:18:17 -04:00
|
|
|
assert_kind_of Class, ClassFolder::NestedClass
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ClassFolder)
|
2006-08-16 05:18:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_class_with_nested_inline_class
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-08-16 05:18:17 -04:00
|
|
|
assert_kind_of Class, ClassFolder::InlineClass
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ClassFolder)
|
2006-08-16 05:18:17 -04:00
|
|
|
end
|
|
|
|
|
2006-11-16 17:50:46 -05:00
|
|
|
def test_class_with_nested_inline_subclass_of_parent
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-11-16 17:50:46 -05:00
|
|
|
assert_kind_of Class, ClassFolder::ClassFolderSubclass
|
|
|
|
assert_kind_of Class, ClassFolder
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal "indeed", ClassFolder::ClassFolderSubclass::ConstantInClassFolder
|
2006-11-16 17:50:46 -05:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ClassFolder)
|
2006-11-16 17:50:46 -05:00
|
|
|
end
|
|
|
|
|
2006-03-27 00:13:46 -05:00
|
|
|
def test_nested_class_can_access_sibling
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-03-27 00:13:46 -05:00
|
|
|
sibling = ModuleFolder::NestedClass.class_eval "NestedSibling"
|
|
|
|
assert defined?(ModuleFolder::NestedSibling)
|
|
|
|
assert_equal ModuleFolder::NestedSibling, sibling
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleFolder)
|
2006-03-27 00:13:46 -05:00
|
|
|
end
|
2006-07-08 14:14:49 -04:00
|
|
|
|
2016-03-16 02:43:27 -04:00
|
|
|
def test_raising_discards_autoloaded_constants
|
2016-03-16 02:40:11 -04:00
|
|
|
with_autoloading_fixtures do
|
2017-01-24 19:46:29 -05:00
|
|
|
e = assert_raises(Exception) { RaisesArbitraryException }
|
2017-02-05 20:00:18 -05:00
|
|
|
assert_equal("arbitrary exception message", e.message)
|
2016-03-16 02:47:28 -04:00
|
|
|
assert_not defined?(A)
|
|
|
|
assert_not defined?(RaisesArbitraryException)
|
2016-03-16 02:40:11 -04:00
|
|
|
end
|
|
|
|
ensure
|
2016-03-16 02:47:28 -04:00
|
|
|
remove_constants(:A, :RaisesArbitraryException)
|
2016-03-16 02:40:11 -04:00
|
|
|
end
|
|
|
|
|
2016-03-16 02:43:27 -04:00
|
|
|
def test_throwing_discards_autoloaded_constants
|
2016-03-15 18:44:40 -04:00
|
|
|
with_autoloading_fixtures do
|
|
|
|
catch :t do
|
|
|
|
Throws
|
|
|
|
end
|
2016-03-16 02:47:28 -04:00
|
|
|
assert_not defined?(A)
|
|
|
|
assert_not defined?(Throws)
|
2016-03-15 18:44:40 -04:00
|
|
|
end
|
|
|
|
ensure
|
2016-03-16 02:47:28 -04:00
|
|
|
remove_constants(:A, :Throws)
|
2016-03-15 18:44:40 -04:00
|
|
|
end
|
|
|
|
|
2010-07-26 03:59:54 -04:00
|
|
|
def test_doesnt_break_normal_require
|
2017-05-15 10:17:28 -04:00
|
|
|
path = File.expand_path("autoloading_fixtures/load_path", __dir__)
|
2010-07-26 03:59:54 -04:00
|
|
|
original_path = $:.dup
|
|
|
|
$:.push(path)
|
|
|
|
with_autoloading_fixtures do
|
2010-07-26 11:42:07 -04:00
|
|
|
# The _ = assignments are to prevent warnings
|
|
|
|
_ = RequiresConstant
|
2010-07-26 03:59:54 -04:00
|
|
|
assert defined?(RequiresConstant)
|
|
|
|
assert defined?(LoadedConstant)
|
|
|
|
ActiveSupport::Dependencies.clear
|
2010-07-26 11:42:07 -04:00
|
|
|
_ = RequiresConstant
|
2010-07-26 03:59:54 -04:00
|
|
|
assert defined?(RequiresConstant)
|
|
|
|
assert defined?(LoadedConstant)
|
|
|
|
end
|
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:RequiresConstant, :LoadedConstant)
|
2010-07-26 03:59:54 -04:00
|
|
|
$:.replace(original_path)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_doesnt_break_normal_require_nested
|
2017-05-15 10:17:28 -04:00
|
|
|
path = File.expand_path("autoloading_fixtures/load_path", __dir__)
|
2010-07-26 03:59:54 -04:00
|
|
|
original_path = $:.dup
|
|
|
|
$:.push(path)
|
|
|
|
|
|
|
|
with_autoloading_fixtures do
|
2010-07-26 11:42:07 -04:00
|
|
|
# The _ = assignments are to prevent warnings
|
|
|
|
_ = LoadsConstant
|
2010-07-26 03:59:54 -04:00
|
|
|
assert defined?(LoadsConstant)
|
|
|
|
assert defined?(LoadedConstant)
|
|
|
|
ActiveSupport::Dependencies.clear
|
2010-07-26 11:42:07 -04:00
|
|
|
_ = LoadsConstant
|
2010-07-26 03:59:54 -04:00
|
|
|
assert defined?(LoadsConstant)
|
|
|
|
assert defined?(LoadedConstant)
|
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_constants(:RequiresConstant, :LoadedConstant, :LoadsConstant)
|
|
|
|
$:.replace(original_path)
|
|
|
|
end
|
|
|
|
|
2011-12-03 09:41:03 -05:00
|
|
|
def test_require_returns_true_when_file_not_yet_required
|
2017-05-15 10:17:28 -04:00
|
|
|
path = File.expand_path("autoloading_fixtures/load_path", __dir__)
|
2011-12-03 09:41:03 -05:00
|
|
|
original_path = $:.dup
|
|
|
|
$:.push(path)
|
|
|
|
|
2011-12-03 13:10:58 -05:00
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal true, require("loaded_constant")
|
2011-12-03 09:41:03 -05:00
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_constants(:LoadedConstant)
|
|
|
|
$:.replace(original_path)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_require_returns_true_when_file_not_yet_required_even_when_no_new_constants_added
|
2017-05-15 10:17:28 -04:00
|
|
|
path = File.expand_path("autoloading_fixtures/load_path", __dir__)
|
2011-12-03 09:41:03 -05:00
|
|
|
original_path = $:.dup
|
|
|
|
$:.push(path)
|
|
|
|
|
2011-12-03 13:10:58 -05:00
|
|
|
with_loading do
|
2011-12-03 09:41:03 -05:00
|
|
|
Object.module_eval "module LoadedConstant; end"
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal true, require("loaded_constant")
|
2011-12-03 09:41:03 -05:00
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_constants(:LoadedConstant)
|
|
|
|
$:.replace(original_path)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_require_returns_false_when_file_already_required
|
2017-05-15 10:17:28 -04:00
|
|
|
path = File.expand_path("autoloading_fixtures/load_path", __dir__)
|
2011-12-03 09:41:03 -05:00
|
|
|
original_path = $:.dup
|
|
|
|
$:.push(path)
|
|
|
|
|
2011-12-03 13:10:58 -05:00
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
require "loaded_constant"
|
|
|
|
assert_equal false, require("loaded_constant")
|
2011-12-03 09:41:03 -05:00
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_constants(:LoadedConstant)
|
|
|
|
$:.replace(original_path)
|
|
|
|
end
|
|
|
|
|
2011-12-03 13:08:18 -05:00
|
|
|
def test_require_raises_load_error_when_file_not_found
|
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_raise(LoadError) { require "this_file_dont_exist_dude" }
|
2011-12-03 13:08:18 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-12-03 12:58:31 -05:00
|
|
|
def test_load_returns_true_when_file_found
|
2017-05-15 10:17:28 -04:00
|
|
|
path = File.expand_path("autoloading_fixtures/load_path", __dir__)
|
2011-12-03 12:58:31 -05:00
|
|
|
original_path = $:.dup
|
|
|
|
$:.push(path)
|
|
|
|
|
2011-12-03 13:10:58 -05:00
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal true, load("loaded_constant.rb")
|
|
|
|
assert_equal true, load("loaded_constant.rb")
|
2011-12-03 12:58:31 -05:00
|
|
|
end
|
|
|
|
ensure
|
|
|
|
remove_constants(:LoadedConstant)
|
|
|
|
$:.replace(original_path)
|
|
|
|
end
|
|
|
|
|
2011-12-03 13:08:18 -05:00
|
|
|
def test_load_raises_load_error_when_file_not_found
|
|
|
|
with_loading do
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_raise(LoadError) { load "this_file_dont_exist_dude.rb" }
|
2011-12-03 13:08:18 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-05-27 16:38:07 -04:00
|
|
|
def test_access_thru_and_upwards_fails
|
|
|
|
with_autoloading_fixtures do
|
|
|
|
assert_not defined?(ModuleFolder)
|
|
|
|
assert_raise(NameError) { ModuleFolder::Object }
|
|
|
|
assert_raise(NameError) { ModuleFolder::NestedClass::Object }
|
2006-03-27 00:13:46 -05:00
|
|
|
end
|
2019-05-27 16:38:07 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleFolder)
|
2006-03-27 00:13:46 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-05 18:52:15 -04:00
|
|
|
def test_non_existing_const_raises_name_error_with_fully_qualified_name
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2013-12-19 06:03:39 -05:00
|
|
|
e = assert_raise(NameError) { A::DoesNotExist.nil? }
|
|
|
|
assert_equal "uninitialized constant A::DoesNotExist", e.message
|
2014-06-24 13:07:29 -04:00
|
|
|
assert_equal :DoesNotExist, e.name
|
2013-12-19 06:03:39 -05:00
|
|
|
|
|
|
|
e = assert_raise(NameError) { A::B::DoesNotExist.nil? }
|
|
|
|
assert_equal "uninitialized constant A::B::DoesNotExist", e.message
|
2014-06-24 13:07:29 -04:00
|
|
|
assert_equal :DoesNotExist, e.name
|
2006-08-05 18:52:15 -04:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:A)
|
2006-08-05 18:52:15 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-05 18:52:15 -04:00
|
|
|
def test_smart_name_error_strings
|
2013-12-19 06:03:39 -05:00
|
|
|
e = assert_raise NameError do
|
|
|
|
Object.module_eval "ImaginaryObject"
|
|
|
|
end
|
|
|
|
assert_includes "uninitialized constant ImaginaryObject", e.message
|
2006-08-05 18:52:15 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-29 02:52:39 -04:00
|
|
|
def test_loadable_constants_for_path_should_handle_empty_autoloads
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal [], ActiveSupport::Dependencies.loadable_constants_for_path("hello")
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-29 02:52:39 -04:00
|
|
|
def test_loadable_constants_for_path_should_handle_relative_paths
|
2016-08-06 12:03:25 -04:00
|
|
|
fake_root = "dependencies"
|
2017-05-15 10:17:28 -04:00
|
|
|
relative_root = File.expand_path("dependencies", __dir__)
|
2016-08-06 12:03:25 -04:00
|
|
|
["", "/"].each do |suffix|
|
2006-08-08 17:21:04 -04:00
|
|
|
with_loading fake_root + suffix do
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal ["A::B"], ActiveSupport::Dependencies.loadable_constants_for_path(relative_root + "/a/b")
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-29 02:52:39 -04:00
|
|
|
def test_loadable_constants_for_path_should_provide_all_results
|
2016-08-06 12:03:25 -04:00
|
|
|
fake_root = "/usr/apps/backpack"
|
|
|
|
with_loading fake_root, fake_root + "/lib" do
|
2010-06-22 17:17:20 -04:00
|
|
|
root = ActiveSupport::Dependencies.autoload_paths.first
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal ["Lib::A::B", "A::B"], ActiveSupport::Dependencies.loadable_constants_for_path(root + "/lib/a/b")
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-29 02:52:39 -04:00
|
|
|
def test_loadable_constants_for_path_should_uniq_results
|
2016-08-06 12:03:25 -04:00
|
|
|
fake_root = "/usr/apps/backpack/lib"
|
|
|
|
with_loading fake_root, fake_root + "/" do
|
2010-06-22 17:17:20 -04:00
|
|
|
root = ActiveSupport::Dependencies.autoload_paths.first
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal ["A::B"], ActiveSupport::Dependencies.loadable_constants_for_path(root + "/a/b")
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-09-06 16:31:28 -04:00
|
|
|
def test_loadable_constants_with_load_path_without_trailing_slash
|
2017-05-15 10:17:28 -04:00
|
|
|
path = File.expand_path("autoloading_fixtures/class_folder/inline_class.rb", __dir__)
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "autoloading_fixtures/class/" do
|
2008-06-03 14:32:53 -04:00
|
|
|
assert_equal [], ActiveSupport::Dependencies.loadable_constants_for_path(path)
|
2006-09-06 16:31:28 -04:00
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-08 17:21:04 -04:00
|
|
|
def test_qualified_const_defined
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.qualified_const_defined?("Object")
|
|
|
|
assert ActiveSupport::Dependencies.qualified_const_defined?("::Object")
|
|
|
|
assert ActiveSupport::Dependencies.qualified_const_defined?("::Object::Kernel")
|
2012-01-05 20:12:46 -05:00
|
|
|
assert ActiveSupport::Dependencies.qualified_const_defined?("::ActiveSupport::TestCase")
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2010-02-14 13:47:50 -05:00
|
|
|
def test_qualified_const_defined_should_not_call_const_missing
|
2006-08-16 13:50:52 -04:00
|
|
|
ModuleWithMissing.missing_count = 0
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.qualified_const_defined?("ModuleWithMissing::A")
|
2006-08-16 13:50:52 -04:00
|
|
|
assert_equal 0, ModuleWithMissing.missing_count
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.qualified_const_defined?("ModuleWithMissing::A::B")
|
2006-08-16 13:50:52 -04:00
|
|
|
assert_equal 0, ModuleWithMissing.missing_count
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2010-02-14 13:47:50 -05:00
|
|
|
def test_qualified_const_defined_explodes_with_invalid_const_name
|
|
|
|
assert_raises(NameError) { ActiveSupport::Dependencies.qualified_const_defined?("invalid") }
|
|
|
|
end
|
|
|
|
|
2006-08-08 17:21:04 -04:00
|
|
|
def test_autoloaded?
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?("ModuleFolder")
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?("ModuleFolder::NestedClass")
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(ModuleFolder)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("ModuleFolder")
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?("ModuleFolder::NestedClass")
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(ModuleFolder::NestedClass)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("ModuleFolder")
|
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("ModuleFolder::NestedClass")
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("::ModuleFolder")
|
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(:ModuleFolder)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-12-31 18:53:05 -05:00
|
|
|
# Anonymous modules aren't autoloaded.
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(Module.new)
|
2006-12-31 18:53:05 -05:00
|
|
|
|
|
|
|
nil_name = Module.new
|
|
|
|
def nil_name.name() nil end
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(nil_name)
|
2019-07-25 17:02:03 -04:00
|
|
|
|
|
|
|
invalid_constant_name = Module.new do
|
|
|
|
def self.name
|
|
|
|
"primary::SchemaMigration"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(invalid_constant_name)
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleFolder)
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-08 17:21:04 -04:00
|
|
|
def test_qualified_name_for
|
2008-06-03 14:32:53 -04:00
|
|
|
assert_equal "A", ActiveSupport::Dependencies.qualified_name_for(Object, :A)
|
|
|
|
assert_equal "A", ActiveSupport::Dependencies.qualified_name_for(:Object, :A)
|
|
|
|
assert_equal "A", ActiveSupport::Dependencies.qualified_name_for("Object", :A)
|
|
|
|
assert_equal "A", ActiveSupport::Dependencies.qualified_name_for("::Object", :A)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
assert_equal "ActiveSupport::Dependencies::A", ActiveSupport::Dependencies.qualified_name_for(:'ActiveSupport::Dependencies', :A)
|
|
|
|
assert_equal "ActiveSupport::Dependencies::A", ActiveSupport::Dependencies.qualified_name_for(ActiveSupport::Dependencies, :A)
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-08 17:21:04 -04:00
|
|
|
def test_file_search
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies" do
|
2010-06-22 17:17:20 -04:00
|
|
|
root = ActiveSupport::Dependencies.autoload_paths.first
|
2016-12-24 12:29:52 -05:00
|
|
|
assert_nil ActiveSupport::Dependencies.search_for_file("service_three")
|
|
|
|
assert_nil ActiveSupport::Dependencies.search_for_file("service_three.rb")
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal root + "/service_one.rb", ActiveSupport::Dependencies.search_for_file("service_one")
|
|
|
|
assert_equal root + "/service_one.rb", ActiveSupport::Dependencies.search_for_file("service_one.rb")
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-29 02:52:39 -04:00
|
|
|
def test_file_search_uses_first_in_load_path
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies", "autoloading_fixtures" do
|
2010-06-22 17:17:20 -04:00
|
|
|
deps, autoload = ActiveSupport::Dependencies.autoload_paths
|
2006-08-08 17:21:04 -04:00
|
|
|
assert_match %r/dependencies/, deps
|
|
|
|
assert_match %r/autoloading_fixtures/, autoload
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal deps + "/conflict.rb", ActiveSupport::Dependencies.search_for_file("conflict")
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "autoloading_fixtures", "dependencies" do
|
2010-06-22 17:17:20 -04:00
|
|
|
autoload, deps = ActiveSupport::Dependencies.autoload_paths
|
2006-08-08 17:21:04 -04:00
|
|
|
assert_match %r/dependencies/, deps
|
|
|
|
assert_match %r/autoloading_fixtures/, autoload
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal autoload + "/conflict.rb", ActiveSupport::Dependencies.search_for_file("conflict")
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-08 17:21:04 -04:00
|
|
|
def test_custom_const_missing_should_work
|
2010-05-19 15:37:41 -04:00
|
|
|
Object.module_eval <<-end_eval, __FILE__, __LINE__ + 1
|
2006-08-08 17:21:04 -04:00
|
|
|
module ModuleWithCustomConstMissing
|
|
|
|
def self.const_missing(name)
|
|
|
|
const_set name, name.to_s.hash
|
|
|
|
end
|
|
|
|
|
|
|
|
module A
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end_eval
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-08-08 17:21:04 -04:00
|
|
|
assert_kind_of Integer, ::ModuleWithCustomConstMissing::B
|
|
|
|
assert_kind_of Module, ::ModuleWithCustomConstMissing::A
|
|
|
|
assert_kind_of String, ::ModuleWithCustomConstMissing::A::B
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ModuleWithCustomConstMissing)
|
2006-08-08 17:21:04 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2013-12-06 13:13:51 -05:00
|
|
|
def test_const_missing_in_anonymous_modules_loads_top_level_constants
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2013-12-06 13:13:51 -05:00
|
|
|
# class_eval STRING pushes the class to the nesting of the eval'ed code.
|
2015-05-20 15:14:33 -04:00
|
|
|
klass = Class.new.class_eval "EM"
|
|
|
|
assert_equal EM, klass
|
2006-08-16 16:54:25 -04:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
2015-05-20 15:14:33 -04:00
|
|
|
remove_constants(:EM)
|
2006-08-16 16:54:25 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2013-12-06 13:13:51 -05:00
|
|
|
def test_const_missing_in_anonymous_modules_raises_if_the_constant_belongs_to_Object
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "em"
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2013-12-06 13:13:51 -05:00
|
|
|
mod = Module.new
|
2015-05-20 15:14:33 -04:00
|
|
|
e = assert_raise(NameError) { mod::EM }
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal "EM cannot be autoloaded from an anonymous class or module", e.message
|
2015-05-20 15:14:33 -04:00
|
|
|
assert_equal :EM, e.name
|
2006-08-08 17:44:34 -04:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
2015-05-20 15:14:33 -04:00
|
|
|
remove_constants(:EM)
|
2006-08-08 17:44:34 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-08-16 23:35:36 -04:00
|
|
|
def test_removal_from_tree_should_be_detected
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies" do
|
2006-08-16 23:35:36 -04:00
|
|
|
c = ServiceOne
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2014-11-05 09:20:26 -05:00
|
|
|
assert_not defined?(ServiceOne)
|
2013-12-19 06:03:39 -05:00
|
|
|
e = assert_raise ArgumentError do
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.load_missing_constant(c, :FakeMissing)
|
2006-08-16 23:35:36 -04:00
|
|
|
end
|
2013-12-19 06:03:39 -05:00
|
|
|
assert_match %r{ServiceOne has been removed from the module tree}i, e.message
|
2006-08-16 23:35:36 -04:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ServiceOne)
|
2006-08-16 23:35:36 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2010-06-04 20:28:04 -04:00
|
|
|
def test_references_should_work
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies" do
|
2011-03-02 12:31:40 -05:00
|
|
|
c = ActiveSupport::Dependencies.reference("ServiceOne")
|
2010-06-04 20:28:04 -04:00
|
|
|
service_one_first = ServiceOne
|
2011-03-02 12:31:40 -05:00
|
|
|
assert_equal service_one_first, c.get("ServiceOne")
|
2010-06-04 20:28:04 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2014-11-05 09:20:26 -05:00
|
|
|
assert_not defined?(ServiceOne)
|
2010-06-04 20:28:04 -04:00
|
|
|
service_one_second = ServiceOne
|
2011-03-02 12:31:40 -05:00
|
|
|
assert_not_equal service_one_first, c.get("ServiceOne")
|
|
|
|
assert_equal service_one_second, c.get("ServiceOne")
|
2010-06-04 20:28:04 -04:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ServiceOne)
|
2010-06-04 20:28:04 -04:00
|
|
|
end
|
|
|
|
|
2010-06-05 23:33:53 -04:00
|
|
|
def test_constantize_shortcut_for_cached_constant_lookups
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies" do
|
2010-06-05 23:33:53 -04:00
|
|
|
assert_equal ServiceOne, ActiveSupport::Dependencies.constantize("ServiceOne")
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ServiceOne)
|
2010-06-05 23:33:53 -04:00
|
|
|
end
|
|
|
|
|
2006-08-17 13:32:23 -04:00
|
|
|
def test_nested_load_error_isnt_rescued
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies" do
|
2013-01-01 20:02:14 -05:00
|
|
|
assert_raise(LoadError) do
|
2006-08-17 13:32:23 -04:00
|
|
|
RequiresNonexistent1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2010-06-22 17:17:20 -04:00
|
|
|
def test_autoload_once_paths_do_not_add_to_autoloaded_constants
|
2014-06-28 05:57:27 -04:00
|
|
|
old_path = ActiveSupport::Dependencies.autoload_once_paths
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2010-06-22 17:17:20 -04:00
|
|
|
ActiveSupport::Dependencies.autoload_once_paths = ActiveSupport::Dependencies.autoload_paths.dup
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?("ModuleFolder")
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?("ModuleFolder::NestedClass")
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(ModuleFolder)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-09-02 17:13:30 -04:00
|
|
|
1 if ModuleFolder::NestedClass # 1 if to avoid warning
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(ModuleFolder::NestedClass)
|
2006-08-29 02:52:39 -04:00
|
|
|
end
|
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:ModuleFolder)
|
|
|
|
ActiveSupport::Dependencies.autoload_once_paths = old_path
|
2006-08-29 02:52:39 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2011-08-24 12:30:50 -04:00
|
|
|
def test_autoload_once_pathnames_do_not_add_to_autoloaded_constants
|
|
|
|
with_autoloading_fixtures do
|
2016-08-16 03:30:11 -04:00
|
|
|
pathnames = ActiveSupport::Dependencies.autoload_paths.collect { |p| Pathname.new(p) }
|
2011-08-24 12:30:50 -04:00
|
|
|
ActiveSupport::Dependencies.autoload_paths = pathnames
|
|
|
|
ActiveSupport::Dependencies.autoload_once_paths = pathnames
|
|
|
|
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?("ModuleFolder")
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?("ModuleFolder::NestedClass")
|
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(ModuleFolder)
|
2011-08-24 12:30:50 -04:00
|
|
|
|
|
|
|
1 if ModuleFolder::NestedClass # 1 if to avoid warning
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(ModuleFolder::NestedClass)
|
2011-08-24 12:30:50 -04:00
|
|
|
end
|
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:ModuleFolder)
|
2011-08-24 12:30:50 -04:00
|
|
|
ActiveSupport::Dependencies.autoload_once_paths = []
|
|
|
|
end
|
|
|
|
|
2006-09-02 17:13:30 -04:00
|
|
|
def test_application_should_special_case_application_controller
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "application"
|
2006-09-02 17:13:30 -04:00
|
|
|
assert_equal 10, ApplicationController
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(:ApplicationController)
|
2006-09-02 17:13:30 -04:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ApplicationController)
|
2006-09-02 17:13:30 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-09-05 19:36:14 -04:00
|
|
|
def test_preexisting_constants_are_not_marked_as_autoloaded
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "em"
|
2015-05-20 15:14:33 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(:EM)
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2006-09-05 19:36:14 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2015-05-20 15:14:33 -04:00
|
|
|
Object.const_set :EM, Class.new
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "em"
|
2018-05-12 22:26:10 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(:EM), "EM shouldn't be marked autoloaded!"
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2006-09-05 19:36:14 -04:00
|
|
|
end
|
|
|
|
ensure
|
2015-05-20 15:14:33 -04:00
|
|
|
remove_constants(:EM)
|
2006-09-05 19:36:14 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2013-07-26 12:37:00 -04:00
|
|
|
def test_constants_in_capitalized_nesting_marked_as_autoloaded
|
|
|
|
with_autoloading_fixtures do
|
|
|
|
ActiveSupport::Dependencies.load_missing_constant(HTML, "SomeClass")
|
|
|
|
|
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("HTML::SomeClass")
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:HTML)
|
2013-07-26 12:37:00 -04:00
|
|
|
end
|
|
|
|
|
2006-10-15 19:32:31 -04:00
|
|
|
def test_unloadable
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-10-15 19:32:31 -04:00
|
|
|
Object.const_set :M, Module.new
|
|
|
|
M.unloadable
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not defined?(M)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-10-15 19:32:31 -04:00
|
|
|
Object.const_set :M, Module.new
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2018-05-12 22:26:10 -04:00
|
|
|
assert_not defined?(M), "Dependencies should unload unloadable constants each time"
|
2006-10-15 19:32:31 -04:00
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-10-15 19:32:31 -04:00
|
|
|
def test_unloadable_should_fail_with_anonymous_modules
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-10-15 19:32:31 -04:00
|
|
|
m = Module.new
|
2009-03-08 16:11:58 -04:00
|
|
|
assert_raise(ArgumentError) { m.unloadable }
|
2006-10-15 19:32:31 -04:00
|
|
|
end
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-10-15 19:32:31 -04:00
|
|
|
def test_unloadable_should_return_change_flag
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2006-10-15 19:32:31 -04:00
|
|
|
Object.const_set :M, Module.new
|
|
|
|
assert_equal true, M.unloadable
|
|
|
|
assert_equal false, M.unloadable
|
|
|
|
end
|
2012-07-14 17:01:28 -04:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:M)
|
2006-10-15 19:32:31 -04:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2010-09-01 09:12:06 -04:00
|
|
|
def test_unloadable_constants_should_receive_callback
|
2015-06-11 12:18:33 -04:00
|
|
|
Object.const_set :C, Class.new { def self.before_remove_const; end }
|
2010-09-01 09:12:06 -04:00
|
|
|
C.unloadable
|
2015-06-11 12:18:33 -04:00
|
|
|
assert_called(C, :before_remove_const, times: 1) do
|
2018-01-24 21:14:10 -05:00
|
|
|
assert_respond_to C, :before_remove_const
|
2015-06-11 12:18:33 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not defined?(C)
|
2015-06-11 12:18:33 -04:00
|
|
|
end
|
2010-09-01 09:12:06 -04:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:C)
|
2010-09-01 09:12:06 -04:00
|
|
|
end
|
|
|
|
|
2019-02-01 11:47:10 -05:00
|
|
|
def test_new_constants_in_without_constants
|
2018-09-25 13:18:20 -04:00
|
|
|
assert_equal [], (ActiveSupport::Dependencies.new_constants_in(Object) { })
|
2016-10-28 23:05:58 -04:00
|
|
|
assert ActiveSupport::Dependencies.constant_watch_stack.all? { |k, v| v.empty? }
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
def test_new_constants_in_with_a_single_constant
|
2008-06-03 14:32:53 -04:00
|
|
|
assert_equal ["Hello"], ActiveSupport::Dependencies.new_constants_in(Object) {
|
2007-09-27 07:01:20 -04:00
|
|
|
Object.const_set :Hello, 10
|
|
|
|
}.map(&:to_s)
|
2016-10-28 23:05:58 -04:00
|
|
|
assert ActiveSupport::Dependencies.constant_watch_stack.all? { |k, v| v.empty? }
|
2006-11-01 18:21:13 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:Hello)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
def test_new_constants_in_with_nesting
|
2008-06-03 14:32:53 -04:00
|
|
|
outer = ActiveSupport::Dependencies.new_constants_in(Object) do
|
2006-11-01 18:21:13 -05:00
|
|
|
Object.const_set :OuterBefore, 10
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
assert_equal ["Inner"], ActiveSupport::Dependencies.new_constants_in(Object) {
|
2007-09-27 07:01:20 -04:00
|
|
|
Object.const_set :Inner, 20
|
|
|
|
}.map(&:to_s)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
Object.const_set :OuterAfter, 30
|
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2007-09-27 07:01:20 -04:00
|
|
|
assert_equal ["OuterAfter", "OuterBefore"], outer.sort.map(&:to_s)
|
2016-10-28 23:05:58 -04:00
|
|
|
assert ActiveSupport::Dependencies.constant_watch_stack.all? { |k, v| v.empty? }
|
2006-11-01 18:21:13 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:OuterBefore, :Inner, :OuterAfter)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
def test_new_constants_in_module
|
|
|
|
Object.const_set :M, Module.new
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
outer = ActiveSupport::Dependencies.new_constants_in(M) do
|
2006-11-01 18:21:13 -05:00
|
|
|
M.const_set :OuterBefore, 10
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
inner = ActiveSupport::Dependencies.new_constants_in(M) do
|
2006-11-01 18:21:13 -05:00
|
|
|
M.const_set :Inner, 20
|
|
|
|
end
|
|
|
|
assert_equal ["M::Inner"], inner
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
M.const_set :OuterAfter, 30
|
|
|
|
end
|
|
|
|
assert_equal ["M::OuterAfter", "M::OuterBefore"], outer.sort
|
2016-10-28 23:05:58 -04:00
|
|
|
assert ActiveSupport::Dependencies.constant_watch_stack.all? { |k, v| v.empty? }
|
2006-11-01 18:21:13 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:M)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
def test_new_constants_in_module_using_name
|
2008-06-03 14:32:53 -04:00
|
|
|
outer = ActiveSupport::Dependencies.new_constants_in(:M) do
|
2006-11-01 18:21:13 -05:00
|
|
|
Object.const_set :M, Module.new
|
|
|
|
M.const_set :OuterBefore, 10
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
inner = ActiveSupport::Dependencies.new_constants_in(:M) do
|
2006-11-01 18:21:13 -05:00
|
|
|
M.const_set :Inner, 20
|
|
|
|
end
|
|
|
|
assert_equal ["M::Inner"], inner
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
M.const_set :OuterAfter, 30
|
|
|
|
end
|
|
|
|
assert_equal ["M::OuterAfter", "M::OuterBefore"], outer.sort
|
2016-10-28 23:05:58 -04:00
|
|
|
assert ActiveSupport::Dependencies.constant_watch_stack.all? { |k, v| v.empty? }
|
2006-11-01 18:21:13 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:M)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2007-03-14 19:27:28 -04:00
|
|
|
def test_new_constants_in_with_inherited_constants
|
2008-06-03 14:32:53 -04:00
|
|
|
m = ActiveSupport::Dependencies.new_constants_in(:Object) do
|
2007-09-27 07:01:20 -04:00
|
|
|
Object.class_eval { include ModuleWithConstant }
|
2007-03-14 19:27:28 -04:00
|
|
|
end
|
|
|
|
assert_equal [], m
|
|
|
|
end
|
|
|
|
|
2008-04-29 08:21:51 -04:00
|
|
|
def test_new_constants_in_with_illegal_module_name_raises_correct_error
|
2009-03-08 16:11:58 -04:00
|
|
|
assert_raise(NameError) do
|
2018-09-25 13:18:20 -04:00
|
|
|
ActiveSupport::Dependencies.new_constants_in("Illegal-Name") { }
|
2008-04-29 08:21:51 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
def test_file_with_multiple_constants_and_require_dependency
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(MultipleConstantFile)
|
|
|
|
assert_not defined?(SiblingConstant)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "multiple_constant_file"
|
2006-11-01 18:21:13 -05:00
|
|
|
assert defined?(MultipleConstantFile)
|
|
|
|
assert defined?(SiblingConstant)
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(:MultipleConstantFile)
|
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(:SiblingConstant)
|
|
|
|
ActiveSupport::Dependencies.clear
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(MultipleConstantFile)
|
|
|
|
assert_not defined?(SiblingConstant)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:MultipleConstantFile, :SiblingConstant)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
def test_file_with_multiple_constants_and_auto_loading
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(MultipleConstantFile)
|
|
|
|
assert_not defined?(SiblingConstant)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
assert_equal 10, MultipleConstantFile
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
assert defined?(MultipleConstantFile)
|
|
|
|
assert defined?(SiblingConstant)
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(:MultipleConstantFile)
|
|
|
|
assert ActiveSupport::Dependencies.autoloaded?(:SiblingConstant)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(MultipleConstantFile)
|
|
|
|
assert_not defined?(SiblingConstant)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:MultipleConstantFile, :SiblingConstant)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
def test_nested_file_with_multiple_constants_and_require_dependency
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(ClassFolder::NestedClass)
|
|
|
|
assert_not defined?(ClassFolder::SiblingClass)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2016-08-06 12:03:25 -04:00
|
|
|
require_dependency "class_folder/nested_class"
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
assert defined?(ClassFolder::NestedClass)
|
|
|
|
assert defined?(ClassFolder::SiblingClass)
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("ClassFolder::NestedClass")
|
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("ClassFolder::SiblingClass")
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(ClassFolder::NestedClass)
|
|
|
|
assert_not defined?(ClassFolder::SiblingClass)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ClassFolder)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
def test_nested_file_with_multiple_constants_and_auto_loading
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(ClassFolder::NestedClass)
|
|
|
|
assert_not defined?(ClassFolder::SiblingClass)
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
assert_kind_of Class, ClassFolder::NestedClass
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-01 18:21:13 -05:00
|
|
|
assert defined?(ClassFolder::NestedClass)
|
|
|
|
assert defined?(ClassFolder::SiblingClass)
|
2008-06-03 14:32:53 -04:00
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("ClassFolder::NestedClass")
|
|
|
|
assert ActiveSupport::Dependencies.autoloaded?("ClassFolder::SiblingClass")
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(ClassFolder::NestedClass)
|
|
|
|
assert_not defined?(ClassFolder::SiblingClass)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:ClassFolder)
|
2006-11-01 18:21:13 -05:00
|
|
|
end
|
|
|
|
|
2006-11-07 15:29:50 -05:00
|
|
|
def test_autoload_doesnt_shadow_no_method_error_with_relative_constant
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2018-05-12 22:26:10 -04:00
|
|
|
assert_not defined?(::RaisesNoMethodError), "::RaisesNoMethodError is defined but it hasn't been referenced yet!"
|
2006-11-06 14:23:30 -05:00
|
|
|
2.times do
|
|
|
|
assert_raise(NoMethodError) { RaisesNoMethodError }
|
2018-05-12 22:26:10 -04:00
|
|
|
assert_not defined?(::RaisesNoMethodError), "::RaisesNoMethodError is defined but it should have failed!"
|
2006-11-06 14:23:30 -05:00
|
|
|
end
|
2006-11-07 15:29:50 -05:00
|
|
|
end
|
2006-11-07 15:45:36 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:RaisesNoMethodError)
|
2006-11-07 15:29:50 -05:00
|
|
|
end
|
2006-11-06 14:23:30 -05:00
|
|
|
|
2006-11-07 15:29:50 -05:00
|
|
|
def test_autoload_doesnt_shadow_no_method_error_with_absolute_constant
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2018-05-12 22:26:10 -04:00
|
|
|
assert_not defined?(::RaisesNoMethodError), "::RaisesNoMethodError is defined but it hasn't been referenced yet!"
|
2006-11-06 14:23:30 -05:00
|
|
|
2.times do
|
|
|
|
assert_raise(NoMethodError) { ::RaisesNoMethodError }
|
2018-05-12 22:26:10 -04:00
|
|
|
assert_not defined?(::RaisesNoMethodError), "::RaisesNoMethodError is defined but it should have failed!"
|
2006-11-06 14:23:30 -05:00
|
|
|
end
|
|
|
|
end
|
2006-11-07 15:45:36 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:RaisesNoMethodError)
|
2006-11-06 14:23:30 -05:00
|
|
|
end
|
|
|
|
|
2008-05-31 16:33:38 -04:00
|
|
|
def test_autoload_doesnt_shadow_error_when_mechanism_not_set_to_load
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.mechanism = :require
|
2008-05-31 16:33:38 -04:00
|
|
|
2.times do
|
2008-11-11 00:39:05 -05:00
|
|
|
assert_raise(NameError) { assert_equal 123, ::RaisesNameError::FooBarBaz }
|
2008-05-31 16:33:38 -04:00
|
|
|
end
|
|
|
|
end
|
2014-08-10 02:56:03 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:RaisesNameError)
|
2008-05-31 16:33:38 -04:00
|
|
|
end
|
|
|
|
|
2006-11-06 14:23:30 -05:00
|
|
|
def test_autoload_doesnt_shadow_name_error
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2013-03-11 06:33:10 -04:00
|
|
|
2.times do
|
2013-12-19 06:03:39 -05:00
|
|
|
e = assert_raise NameError do
|
2008-11-11 00:39:05 -05:00
|
|
|
::RaisesNameError::FooBarBaz.object_id
|
2006-11-06 14:23:30 -05:00
|
|
|
end
|
2016-08-06 12:03:25 -04:00
|
|
|
assert_equal "uninitialized constant RaisesNameError::FooBarBaz", e.message
|
2018-05-12 22:26:10 -04:00
|
|
|
assert_not defined?(::RaisesNameError), "::RaisesNameError is defined but it should have failed!"
|
2006-11-06 14:23:30 -05:00
|
|
|
end
|
|
|
|
|
2018-04-17 18:21:34 -04:00
|
|
|
assert_not defined?(::RaisesNameError)
|
2006-11-06 14:23:30 -05:00
|
|
|
2.times do
|
2008-11-11 00:39:05 -05:00
|
|
|
assert_raise(NameError) { ::RaisesNameError }
|
2018-05-12 22:26:10 -04:00
|
|
|
assert_not defined?(::RaisesNameError), "::RaisesNameError is defined but it should have failed!"
|
2006-11-06 14:23:30 -05:00
|
|
|
end
|
|
|
|
end
|
2006-11-07 15:45:36 -05:00
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
remove_constants(:RaisesNameError)
|
2006-11-06 14:23:30 -05:00
|
|
|
end
|
2008-05-31 16:33:38 -04:00
|
|
|
|
2006-12-09 00:21:33 -05:00
|
|
|
def test_remove_constant_handles_double_colon_at_start
|
2016-08-06 12:03:25 -04:00
|
|
|
Object.const_set "DeleteMe", Module.new
|
|
|
|
DeleteMe.const_set "OrMe", Module.new
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.remove_constant "::DeleteMe::OrMe"
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(DeleteMe::OrMe)
|
2006-12-09 00:21:33 -05:00
|
|
|
assert defined?(DeleteMe)
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.remove_constant "::DeleteMe"
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(DeleteMe)
|
|
|
|
ensure
|
|
|
|
remove_constants(:DeleteMe)
|
2006-12-09 00:21:33 -05:00
|
|
|
end
|
2008-05-31 16:33:38 -04:00
|
|
|
|
2012-11-14 22:33:17 -05:00
|
|
|
def test_remove_constant_does_not_trigger_loading_autoloads
|
2016-08-06 12:03:25 -04:00
|
|
|
constant = "ShouldNotBeAutoloaded"
|
2012-11-14 22:33:17 -05:00
|
|
|
Object.class_eval do
|
2017-05-15 10:17:28 -04:00
|
|
|
autoload constant, File.expand_path("autoloading_fixtures/should_not_be_required", __dir__)
|
2012-11-14 22:33:17 -05:00
|
|
|
end
|
|
|
|
|
2012-11-15 05:06:35 -05:00
|
|
|
assert_nil ActiveSupport::Dependencies.remove_constant(constant), "Kernel#autoload has been triggered by remove_constant"
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(ShouldNotBeAutoloaded)
|
|
|
|
ensure
|
|
|
|
remove_constants(constant)
|
2012-11-14 22:33:17 -05:00
|
|
|
end
|
|
|
|
|
2012-11-27 18:13:14 -05:00
|
|
|
def test_remove_constant_does_not_autoload_already_removed_parents_as_a_side_effect
|
|
|
|
with_autoloading_fixtures do
|
2012-12-24 15:14:02 -05:00
|
|
|
_ = ::A # assignment to silence parse-time warning "possibly useless use of :: in void context"
|
|
|
|
_ = ::A::B # assignment to silence parse-time warning "possibly useless use of :: in void context"
|
2016-08-06 12:03:25 -04:00
|
|
|
ActiveSupport::Dependencies.remove_constant("A")
|
|
|
|
ActiveSupport::Dependencies.remove_constant("A::B")
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(A)
|
2012-11-27 18:13:14 -05:00
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:A)
|
2012-11-27 18:13:14 -05:00
|
|
|
end
|
|
|
|
|
2006-12-24 09:41:29 -05:00
|
|
|
def test_load_once_constants_should_not_be_unloaded
|
2014-06-28 05:57:27 -04:00
|
|
|
old_path = ActiveSupport::Dependencies.autoload_once_paths
|
2009-08-09 15:14:25 -04:00
|
|
|
with_autoloading_fixtures do
|
2010-06-22 17:17:20 -04:00
|
|
|
ActiveSupport::Dependencies.autoload_once_paths = ActiveSupport::Dependencies.autoload_paths
|
2012-12-24 15:14:02 -05:00
|
|
|
_ = ::A # assignment to silence parse-time warning "possibly useless use of :: in void context"
|
2006-12-24 09:41:29 -05:00
|
|
|
assert defined?(A)
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2006-12-24 09:41:29 -05:00
|
|
|
assert defined?(A)
|
|
|
|
end
|
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
ActiveSupport::Dependencies.autoload_once_paths = old_path
|
|
|
|
remove_constants(:A)
|
2006-12-24 09:41:29 -05:00
|
|
|
end
|
2008-05-31 16:33:38 -04:00
|
|
|
|
2014-02-08 18:35:12 -05:00
|
|
|
def test_access_unloaded_constants_for_reload
|
|
|
|
with_autoloading_fixtures do
|
|
|
|
assert_kind_of Module, A
|
|
|
|
assert_kind_of Class, A::B # Necessary to load A::B for the test
|
|
|
|
ActiveSupport::Dependencies.mark_for_unload(A::B)
|
|
|
|
ActiveSupport::Dependencies.remove_unloadable_constants!
|
2014-06-20 09:55:41 -04:00
|
|
|
|
2014-02-08 18:35:12 -05:00
|
|
|
A::B # Make sure no circular dependency error
|
|
|
|
end
|
2014-06-28 05:57:27 -04:00
|
|
|
ensure
|
|
|
|
remove_constants(:A)
|
2014-02-08 18:35:12 -05:00
|
|
|
end
|
|
|
|
|
2010-06-22 17:17:20 -04:00
|
|
|
def test_autoload_once_paths_should_behave_when_recursively_loading
|
2014-06-28 05:57:27 -04:00
|
|
|
old_path = ActiveSupport::Dependencies.autoload_once_paths
|
2016-08-06 12:03:25 -04:00
|
|
|
with_loading "dependencies", "autoloading_fixtures" do
|
2010-06-22 17:17:20 -04:00
|
|
|
ActiveSupport::Dependencies.autoload_once_paths = [ActiveSupport::Dependencies.autoload_paths.last]
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not defined?(CrossSiteDependency)
|
2006-12-31 19:25:30 -05:00
|
|
|
assert_nothing_raised { CrossSiteDepender.nil? }
|
2006-12-24 09:41:29 -05:00
|
|
|
assert defined?(CrossSiteDependency)
|
2014-06-28 05:57:27 -04:00
|
|
|
assert_not ActiveSupport::Dependencies.autoloaded?(CrossSiteDependency),
|
2006-12-24 09:41:29 -05:00
|
|
|
"CrossSiteDependency shouldn't be marked as autoloaded!"
|
2008-06-03 14:32:53 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
2006-12-24 09:41:29 -05:00
|
|
|
assert defined?(CrossSiteDependency),
|
|
|
|
"CrossSiteDependency shouldn't have been unloaded!"
|
|
|
|
end
|
|
|
|
ensure
|
2014-06-28 05:57:27 -04:00
|
|
|
ActiveSupport::Dependencies.autoload_once_paths = old_path
|
|
|
|
remove_constants(:CrossSiteDependency)
|
2006-12-24 09:41:29 -05:00
|
|
|
end
|
2008-07-24 12:58:26 -04:00
|
|
|
|
|
|
|
def test_hook_called_multiple_times
|
|
|
|
assert_nothing_raised { ActiveSupport::Dependencies.hook! }
|
|
|
|
end
|
|
|
|
|
2014-11-10 17:17:01 -05:00
|
|
|
def test_load_and_require_stay_private
|
2016-09-16 12:44:05 -04:00
|
|
|
assert_includes Object.private_methods, :load
|
|
|
|
assert_includes Object.private_methods, :require
|
2014-11-10 17:17:01 -05:00
|
|
|
|
|
|
|
ActiveSupport::Dependencies.unhook!
|
|
|
|
|
2016-09-16 12:44:05 -04:00
|
|
|
assert_includes Object.private_methods, :load
|
|
|
|
assert_includes Object.private_methods, :require
|
2014-11-10 17:17:01 -05:00
|
|
|
ensure
|
|
|
|
ActiveSupport::Dependencies.hook!
|
|
|
|
end
|
2005-11-23 16:31:51 -05:00
|
|
|
end
|
2018-09-07 17:11:23 -04:00
|
|
|
|
|
|
|
class DependenciesLogging < ActiveSupport::TestCase
|
|
|
|
MESSAGE = "message"
|
|
|
|
|
|
|
|
def with_settings(logger, verbose)
|
|
|
|
original_logger = ActiveSupport::Dependencies.logger
|
|
|
|
original_verbose = ActiveSupport::Dependencies.verbose
|
|
|
|
|
|
|
|
ActiveSupport::Dependencies.logger = logger
|
|
|
|
ActiveSupport::Dependencies.verbose = verbose
|
|
|
|
|
|
|
|
yield
|
|
|
|
ensure
|
|
|
|
ActiveSupport::Dependencies.logger = original_logger
|
|
|
|
ActiveSupport::Dependencies.verbose = original_verbose
|
|
|
|
end
|
|
|
|
|
|
|
|
def fake_logger
|
|
|
|
Class.new do
|
|
|
|
def self.debug(message)
|
|
|
|
message
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "does not log if the logger is nil and verbose is false" do
|
|
|
|
with_settings(nil, false) do
|
|
|
|
assert_nil ActiveSupport::Dependencies.log(MESSAGE)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "does not log if the logger is nil and verbose is true" do
|
|
|
|
with_settings(nil, true) do
|
|
|
|
assert_nil ActiveSupport::Dependencies.log(MESSAGE)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "does not log if the logger is set and verbose is false" do
|
|
|
|
with_settings(fake_logger, false) do
|
|
|
|
assert_nil ActiveSupport::Dependencies.log(MESSAGE)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "logs if the logger is set and verbose is true" do
|
|
|
|
with_settings(fake_logger, true) do
|
|
|
|
assert_equal "autoloading: #{MESSAGE}", ActiveSupport::Dependencies.log(MESSAGE)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|