hanami/spec/integration/code_loading/loading_from_lib_spec.rb

209 lines
5.4 KiB
Ruby

# frozen_string_literal: true
RSpec.describe "Code loading / Loading from lib directory", :app_integration do
describe "default root" do
before :context do
with_directory(@dir = make_tmp_directory.realpath) do
write "config/app.rb", <<~'RUBY'
require "hanami"
module TestApp
class App < Hanami::App
end
end
RUBY
write "lib/external_class.rb", <<~'RUBY'
class ExternalClass
end
RUBY
write "lib/test_app/test_class.rb", <<~'RUBY'
module TestApp
class TestClass
end
end
RUBY
end
end
context "setup app" do
before do
with_directory(@dir) { require "hanami/setup" }
end
it "adds the lib directory to the load path" do
expect($LOAD_PATH).to include(@dir.join("lib").to_s)
end
specify "classes in lib/ can be required directly" do
expect(require("external_class")).to be true
expect(ExternalClass).to be
end
specify "classes in lib/[app_namespace]/ cannot yet be autoloaded" do
expect { TestApp::TestClass }.to raise_error(NameError)
end
end
context "prepared app" do
before do
with_directory(@dir) { require "hanami/prepare" }
end
it "leaves the lib directory already in the load path" do
expect($LOAD_PATH).to include(@dir.join("lib").to_s).exactly(1).times
end
specify "classes in lib/[app_namespace]/ can be autoloaded" do
expect(TestApp::TestClass).to be
end
end
context "lib dir missing" do
before do
with_directory(@dir = make_tmp_directory.realpath) do
write "config/app.rb", <<~'RUBY'
require "hanami"
module TestApp
class App < Hanami::App
end
end
RUBY
require "hanami/setup"
end
end
it "does not add the lib directory to the load path" do
expect($LOAD_PATH).not_to include(@dir.join("lib").to_s)
end
end
end
context "app root reconfigured" do
before :context do
with_directory(@dir = make_tmp_directory.realpath) do
write "config/app.rb", <<~'RUBY'
require "hanami"
module TestApp
class App < Hanami::App
config.root = Pathname(__dir__).join("..", "src").realpath
end
end
RUBY
write "src/lib/external_class.rb", <<~'RUBY'
class ExternalClass
end
RUBY
write "src/lib/test_app/test_class.rb", <<~'RUBY'
module TestApp
class TestClass
end
end
RUBY
end
end
context "setup app" do
before do
with_directory(@dir) { require "hanami/setup" }
end
it "does not add the lib directory to the load path (already done at time of subclassing)" do
expect($LOAD_PATH).not_to include(@dir.join("src", "lib").to_s)
end
it "adds the lib directory under the new root with `prepare_load_path`" do
expect { Hanami.app.prepare_load_path }
.to change { $LOAD_PATH }
.to include(@dir.join("src", "lib").to_s)
end
end
context "prepared app" do
before do
with_directory(@dir) { require "hanami/prepare" }
end
it "adds the lib directory to the load path" do
expect($LOAD_PATH).to include(@dir.join("src", "lib").to_s)
end
specify "classes in lib/ can be required directly" do
expect(require("external_class")).to be true
expect(ExternalClass).to be
end
specify "classes in lib/[app_namespace]/ can be autoloaded" do
expect(TestApp::TestClass).to be
end
end
end
context "app root reconfigured and load path immediately prepared" do
before :context do
with_directory(@dir = make_tmp_directory.realpath) do
write "config/app.rb", <<~'RUBY'
require "hanami"
module TestApp
class App < Hanami::App
config.root = Pathname(__dir__).join("..", "src").realpath and prepare_load_path
end
end
RUBY
write "src/lib/external_class.rb", <<~'RUBY'
class ExternalClass
end
RUBY
write "src/lib/test_app/test_class.rb", <<~'RUBY'
module TestApp
class TestClass
end
end
RUBY
end
end
context "setup app" do
before do
with_directory(@dir) { require "hanami/setup" }
end
it "adds the lib directory to the load path" do
expect($LOAD_PATH).to include(@dir.join("src", "lib").to_s)
end
specify "classes in lib/ can be required directly" do
expect(require("external_class")).to be true
expect(ExternalClass).to be
end
specify "classes in lib/[app_namespace]/ cannot yet be autoloaded" do
expect { TestApp::TestClass }.to raise_error(NameError)
end
end
context "prepared app" do
before do
with_directory(@dir) { require "hanami/prepare" }
end
it "leaves the lib directory to the load path" do
expect($LOAD_PATH).to include(@dir.join("src", "lib").to_s).exactly(1).times
end
specify "classes in lib/[app_namespace]/ can be autoloaded" do
expect(TestApp::TestClass).to be
end
end
end
end