108 lines
2.5 KiB
Ruby
108 lines
2.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe "App action / View rendering", :app_integration do
|
|
specify "Views render with a request-specific context object" do
|
|
with_tmp_directory(Dir.mktmpdir) do
|
|
write "config/app.rb", <<~RUBY
|
|
require "hanami"
|
|
|
|
module TestApp
|
|
class App < Hanami::App
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/action.rb", <<~RUBY
|
|
# auto_register: false
|
|
|
|
module TestApp
|
|
class Action < Hanami::Action
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/view.rb", <<~RUBY
|
|
# auto_register: false
|
|
|
|
require "hanami/view"
|
|
|
|
module TestApp
|
|
class View < Hanami::View
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/views/context.rb", <<~RUBY
|
|
require "hanami/view/context"
|
|
|
|
module TestApp
|
|
module Views
|
|
class Context < Hanami::View::Context
|
|
def request
|
|
_options.fetch(:request)
|
|
end
|
|
|
|
def response
|
|
_options.fetch(:response)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/actions/users/show.rb", <<~RUBY
|
|
module TestApp
|
|
module Actions
|
|
module Users
|
|
class Show < TestApp::Action
|
|
include Deps[view: "views.users.show"]
|
|
|
|
def handle(req, res)
|
|
res[:job] = "Singer"
|
|
res[:age] = 0
|
|
|
|
res.render view, name: req.params[:name], age: 51
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/views/users/show.rb", <<~RUBY
|
|
module TestApp
|
|
module Views
|
|
module Users
|
|
class Show < TestApp::View
|
|
expose :name, :job, :age
|
|
end
|
|
end
|
|
end
|
|
end
|
|
RUBY
|
|
|
|
write "app/templates/layouts/app.html.slim", <<~SLIM
|
|
html
|
|
body
|
|
== yield
|
|
SLIM
|
|
|
|
write "app/templates/users/show.html.slim", <<~'SLIM'
|
|
h1 Hello, #{name}
|
|
- request.params.to_h.values.sort.each do |value|
|
|
p = value
|
|
p = job
|
|
p = age
|
|
SLIM
|
|
|
|
require "hanami/prepare"
|
|
|
|
action = TestApp::App["actions.users.show"]
|
|
response = action.(name: "Jennifer", last_name: "Lopez")
|
|
rendered = response.body[0]
|
|
|
|
expect(rendered).to eq "<html><body><h1>Hello, Jennifer</h1><p>Jennifer</p><p>Lopez</p><p>Singer</p><p>51</p></body></html>"
|
|
end
|
|
end
|
|
end
|