2011-03-24 07:45:47 +00:00
|
|
|
require 'sinatra/base'
|
|
|
|
require 'rack/test'
|
|
|
|
require 'rack'
|
|
|
|
require 'forwardable'
|
|
|
|
|
|
|
|
module Sinatra
|
|
|
|
Base.set :environment, :test
|
|
|
|
|
|
|
|
module TestHelpers
|
|
|
|
class Session < Rack::Test::Session
|
|
|
|
def global_env
|
|
|
|
@global_env ||= {}
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def default_env
|
|
|
|
super.merge global_env
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
include Rack::Test::Methods
|
|
|
|
extend Forwardable
|
2011-03-25 23:13:26 +00:00
|
|
|
attr_accessor :settings
|
2011-03-24 07:45:47 +00:00
|
|
|
|
|
|
|
def_delegators :last_response, :body, :headers, :status, :errors
|
|
|
|
def_delegators :app, :configure, :set, :enable, :disable, :use, :helpers, :register
|
|
|
|
def_delegators :current_session, :env_for
|
2011-09-05 01:13:40 +00:00
|
|
|
def_delegators :rack_mock_session, :cookie_jar
|
2011-03-24 07:45:47 +00:00
|
|
|
|
|
|
|
def mock_app(base = Sinatra::Base, &block)
|
2011-03-25 23:13:26 +00:00
|
|
|
inner = nil
|
|
|
|
@app = Sinatra.new(base) do
|
|
|
|
inner = self
|
|
|
|
class_eval(&block)
|
|
|
|
end
|
|
|
|
@settings = inner
|
|
|
|
app
|
2011-03-24 07:45:47 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def app=(base)
|
|
|
|
@app = base
|
|
|
|
end
|
|
|
|
|
|
|
|
alias set_app app=
|
|
|
|
|
|
|
|
def app
|
|
|
|
@app ||= Class.new Sinatra::Base
|
|
|
|
Rack::Lint.new @app
|
|
|
|
end
|
|
|
|
|
|
|
|
unless method_defined? :options
|
|
|
|
def options(uri, params = {}, env = {}, &block)
|
|
|
|
env = env_for(uri, env.merge(:method => "OPTIONS", :params => params))
|
|
|
|
current_session.send(:process_request, uri, env, &block)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
unless method_defined? :patch
|
|
|
|
def patch(uri, params = {}, env = {}, &block)
|
|
|
|
env = env_for(uri, env.merge(:method => "PATCH", :params => params))
|
|
|
|
current_session.send(:process_request, uri, env, &block)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def last_request?
|
|
|
|
last_request
|
|
|
|
true
|
|
|
|
rescue Rack::Test::Error
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
|
|
|
def session
|
|
|
|
return {} unless last_request?
|
2013-01-15 00:42:09 +00:00
|
|
|
raise Rack::Test::Error, "session not enabled for app" unless last_env["rack.session"] or app.session?
|
2011-03-24 07:45:47 +00:00
|
|
|
last_request.session
|
|
|
|
end
|
|
|
|
|
|
|
|
def last_env
|
|
|
|
last_request.env
|
|
|
|
end
|
|
|
|
|
|
|
|
def build_rack_test_session(name) # :nodoc:
|
|
|
|
Session.new rack_mock_session(name)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|