hanami/spec/integration/slices/slice_routing_spec.rb

227 lines
5.3 KiB
Ruby

# frozen_string_literal: true
require "rack/test"
RSpec.describe "Slices / Slice routing", :app_integration do
include Rack::Test::Methods
let(:app) { Main::Slice.rack_app }
specify "Slices have a nil router when no routes are defined" do
with_tmp_directory(Dir.mktmpdir) do
write "config/app.rb", <<~'RUBY'
require "hanami"
module TestApp
class App < Hanami::App
end
end
RUBY
write "slices/main/.keep", ""
require "hanami/prepare"
expect(Main::Slice.routes).to be nil
expect(Main::Slice.router).to be nil
end
end
specify "Slices have the app 'routes' component registered when app routes are defined but not their own" do
with_tmp_directory(Dir.mktmpdir) do
write "config/app.rb", <<~'RUBY'
require "hanami"
module TestApp
class App < Hanami::App
config.logger.stream = File.new("/dev/null", "w")
end
end
RUBY
write "config/routes.rb", <<~'RUBY'
require "hanami/routes"
module TestApp
class Routes < Hanami::Routes
define do
get "home", to: "home.show", as: :home
end
end
end
RUBY
write "slices/main/.keep", ""
require "hanami/prepare"
expect(Main::Slice["routes"].path(:home)).to eq "/home"
expect(Main::Slice.router).to be nil
expect(TestApp::App.router).not_to be nil
end
end
specify "Slices use their own router and registered 'routes' component when their own routes are defined" do
with_tmp_directory(Dir.mktmpdir) do
write "config/app.rb", <<~'RUBY'
require "hanami"
module TestApp
class App < Hanami::App
config.logger.stream = File.new("/dev/null", "w")
end
end
RUBY
write "slices/main/config/routes.rb", <<~'RUBY'
require "hanami/routes"
module Main
class Routes < Hanami::Routes
define do
get "home", to: "home.show", as: :home
end
end
end
RUBY
write "slices/main/actions/home/show.rb", <<~'RUBY'
require "hanami/action"
module Main
module Actions
module Home
class Show < Hanami::Action
def handle(*, res)
res.body = "Hello world"
end
end
end
end
end
RUBY
require "hanami/prepare"
Main::Slice.boot
expect(Main::Slice["routes"].path(:home)).to eq "/home"
get "/home"
expect(last_response.status).to eq 200
expect(last_response.body).to eq "Hello world"
end
end
describe "Mounting slice routes" do
before :context do
with_directory(@dir = make_tmp_directory) do
write "config/app.rb", <<~'RUBY'
require "hanami"
module TestApp
class App < Hanami::App
config.logger.stream = File.new("/dev/null", "w")
end
end
RUBY
write "config/routes.rb", <<~'RUBY'
module TestApp
class Routes < Hanami::Routes
define do
root to: "home.show"
slice :main, at: "/main"
end
end
end
RUBY
write "app/actions/home/show.rb", <<~'RUBY'
require "hanami/action"
module TestApp
module Actions
module Home
class Show < Hanami::Action
def handle(*, res)
res.body = "Hello from app"
end
end
end
end
end
RUBY
write "slices/main/config/routes.rb", <<~'RUBY'
module Main
class Routes < Hanami::Routes
define do
root to: "home.show"
end
end
end
RUBY
write "slices/main/actions/home/show.rb", <<~'RUBY'
require "hanami/action"
module Main
module Actions
module Home
class Show < Hanami::Action
def handle(*, res)
res.body = "Hello from slice"
end
end
end
end
end
RUBY
end
end
let(:app) { TestApp::App.app }
describe "A slice with its own router can be mounted in its parent's routes" do
context "prepared" do
before do
with_directory(@dir) { require "hanami/prepare" }
end
specify do
get "/"
expect(last_response.status).to eq 200
expect(last_response.body).to eq "Hello from app"
get "/main"
expect(last_response.status).to eq 200
expect(last_response.body).to eq "Hello from slice"
end
end
context "booted" do
before do
with_directory(@dir) { require "hanami/boot" }
end
specify do
get "/"
expect(last_response.status).to eq 200
expect(last_response.body).to eq "Hello from app"
get "/main"
expect(last_response.status).to eq 200
expect(last_response.body).to eq "Hello from slice"
end
end
end
end
end