hanami/spec/integration/middleware_spec.rb

82 lines
2.0 KiB
Ruby

# frozen_string_literal: true
RSpec.describe "Project middleware", type: :integration do
it "mounts Rack middleware" do
with_project do
generate_middleware
unshift "config/environment.rb", 'require "rack/etag"'
unshift "config/environment.rb", 'require_relative "./middleware/runtime"'
unshift "config/environment.rb", 'require_relative "./middleware/custom"'
inject_line_after "config/environment.rb", "Hanami.configure", <<~EOL
middleware.use Middleware::Runtime
middleware.use Middleware::Custom, "OK"
middleware.use Rack::ETag
EOL
generate "action web home#index --url=/"
rewrite "apps/web/controllers/home/index.rb", <<~EOF
module Web::Controllers::Home
class Index
include Web::Action
def call(params)
self.body = "OK"
end
end
end
EOF
server do
get "/"
expect(last_response.status).to eq(200)
expect(last_response.headers["X-Runtime"]).to eq("1ms")
expect(last_response.headers["X-Custom"]).to eq("OK")
expect(last_response.headers["ETag"]).to_not be_nil
end
end
end
private
def generate_middleware # rubocop:disable Metrics/MethodLength
write "config/middleware/runtime.rb", <<~EOF
module Middleware
class Runtime
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
headers["X-Runtime"] = "1ms"
[status, headers, body]
end
end
end
EOF
write "config/middleware/custom.rb", <<~EOF
module Middleware
class Custom
def initialize(app, value)
@app = app
@value = value
end
def call(env)
status, headers, body = @app.call(env)
headers["X-Custom"] = @value
[status, headers, body]
end
end
end
EOF
end
end