153 lines
4.0 KiB
Ruby
153 lines
4.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe "Code loading / Loading from app directory", :app_integration do
|
|
before :context do
|
|
with_directory(@dir = make_tmp_directory) do
|
|
write "config/app.rb", <<~'RUBY'
|
|
require "hanami"
|
|
|
|
module TestApp
|
|
class App < Hanami::App
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/test_class.rb", <<~'RUBY'
|
|
module TestApp
|
|
class TestClass
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/action.rb", <<~'RUBY'
|
|
# auto_register: false
|
|
|
|
module TestApp
|
|
class Action < Hanami::Action
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/actions/home/show.rb", <<~'RUBY'
|
|
module TestApp
|
|
module Actions
|
|
module Home
|
|
class Show < TestApp::Action
|
|
end
|
|
end
|
|
end
|
|
end
|
|
RUBY
|
|
end
|
|
end
|
|
|
|
before do
|
|
with_directory(@dir) do
|
|
require "hanami/prepare"
|
|
end
|
|
end
|
|
|
|
specify "Classes in app/ directory are autoloaded with the app namespace" do
|
|
expect(TestApp::TestClass).to be
|
|
expect(TestApp::Action).to be
|
|
expect(TestApp::Actions::Home::Show).to be
|
|
end
|
|
|
|
specify "Classes in app directory are auto-registered" do
|
|
expect(TestApp::App["test_class"]).to be_an_instance_of TestApp::TestClass
|
|
expect(TestApp::App["actions.home.show"]).to be_an_instance_of TestApp::Actions::Home::Show
|
|
|
|
# Files with "auto_register: false" magic comments are not auto-registered
|
|
expect(TestApp::App.key?("action")).to be false
|
|
end
|
|
|
|
describe "app/lib/ directory" do
|
|
before :context do
|
|
with_directory(@dir = make_tmp_directory) do
|
|
write "config/app.rb", <<~'RUBY'
|
|
require "hanami"
|
|
|
|
module TestApp
|
|
class App < Hanami::App
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/lib/test_class.rb", <<~'RUBY'
|
|
module TestApp
|
|
class TestClass
|
|
end
|
|
end
|
|
RUBY
|
|
end
|
|
end
|
|
|
|
specify "Classes in app/lib/ directory are autoloaded with the app namespace" do
|
|
expect(TestApp::TestClass).to be
|
|
end
|
|
|
|
specify "Classes in app/lib/ directory are auto-registered" do
|
|
expect(TestApp::App["test_class"]).to be_an_instance_of TestApp::TestClass
|
|
end
|
|
|
|
specify "Classes in app/lib/ directory are not redundantly auto-registered under 'lib' key namespace" do
|
|
expect(TestApp::App.key?("lib.test_class")).to be false
|
|
end
|
|
end
|
|
|
|
# rubocop:disable Style/GlobalVars
|
|
describe "same-named class defined in both app/ and app/lib/ directories" do
|
|
before :context do
|
|
with_directory(@dir = make_tmp_directory) do
|
|
write "config/app.rb", <<~'RUBY'
|
|
require "hanami"
|
|
|
|
module TestApp
|
|
class App < Hanami::App
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/test_class.rb", <<~'RUBY'
|
|
$app_class_loaded = true
|
|
|
|
module TestApp
|
|
class TestClass
|
|
(@loaded_from ||= []) << "app"
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/lib/test_class.rb", <<~'RUBY'
|
|
$app_lib_class_loaded = true
|
|
|
|
module TestApp
|
|
class TestClass
|
|
(@loaded_from ||= []) << "app/lib"
|
|
end
|
|
end
|
|
RUBY
|
|
end
|
|
end
|
|
|
|
after do
|
|
$app_class_loaded = $app_lib_class_loaded = nil
|
|
end
|
|
|
|
specify "Classes in app/lib/ directory are preferred for autoloading" do
|
|
expect(TestApp::TestClass).to be
|
|
expect(TestApp::TestClass.instance_variable_get(:@loaded_from)).to eq ["app/lib"]
|
|
expect($app_lib_class_loaded).to be true
|
|
expect($app_class_loaded).to be nil
|
|
end
|
|
|
|
specify "Classes in app/lib/ directory are preferred for auto-registration" do
|
|
expect(TestApp::App["test_class"]).to be
|
|
expect(TestApp::TestClass.instance_variable_get(:@loaded_from)).to eq ["app/lib"]
|
|
expect($app_lib_class_loaded).to be true
|
|
expect($app_class_loaded).to be nil
|
|
end
|
|
end
|
|
# rubocop:enable Style/GlobalVars
|
|
end
|