Session testing made easy

Just say:

get '/foo' do
  session[:bar] # => 'baz'
end

get_it '/foo', :session => session(:bar => 'baz')
This commit is contained in:
Blake Mizerany 2008-04-20 18:03:41 -07:00
parent f80203adb6
commit 9c875ffda0
3 changed files with 19 additions and 22 deletions

View File

@ -52,7 +52,7 @@ module Rack #:nodoc:
end
def user_agent
env['HTTP_USER_AGENT']
@env['HTTP_USER_AGENT']
end
private
@ -810,7 +810,7 @@ module Sinatra
end
def session
@request.env['rack.session'] || {}
request.env['rack.session'] ||= {}
end
private

View File

@ -1,13 +1,3 @@
class Rack::MockRequest
class << self
alias :env_for_without_env :env_for
def env_for(uri = "", opts = {})
env = { 'HTTP_USER_AGENT' => opts.delete(:agent) }
env_for_without_env(uri, opts).merge(env)
end
end
end
module Sinatra
module Test
@ -16,12 +6,19 @@ module Sinatra
def easy_env_map
{
:accept => 'HTTP_ACCEPT',
:agent => 'HTTP_AGENT',
:host => 'HTTP_POST'
:accept => "HTTP_ACCEPT",
:agent => "HTTP_USER_AGENT",
:host => "HTTP_HOST",
:session => "HTTP_COOKIE",
:cookies => "HTTP_COOKIE"
}
end
def session(data, key = 'rack.session')
data = data.from_params if data.respond_to?(:from_params)
"#{Rack::Utils.escape(key)}=#{[Marshal.dump(data)].pack("m*")}"
end
def map_easys(params)
easy_env_map.inject(params.dup) do |m, (from, to)|
m[to] = m.delete(from) if m.has_key?(from); m
@ -30,14 +27,14 @@ module Sinatra
%w(get head post put delete).each do |m|
define_method("#{m}_it") do |path, *args|
request = Rack::MockRequest.new(Sinatra.build_application)
env, input = if args.size == 2
[args.last, args.first]
elsif args.size == 1
data = args.first
data.is_a?(Hash) ? [data.delete(:env), data.to_params] : [nil, data]
data.is_a?(Hash) ? [map_easys(data.delete(:env) || {}), data.to_params] : [nil, data]
end
@response = request.request(m.upcase, path, {:input => input}.merge(env || {}))
@request = Rack::MockRequest.new(Sinatra.build_application)
@response = @request.request(m.upcase, path, {:input => input}.merge(env || {}))
end
end

View File

@ -135,17 +135,17 @@ context "Events in an app" do
get '/', :agent => /Windows/ do
request.env['HTTP_USER_AGENT']
end
get_it '/', :env => { :agent => 'Windows' }
should.be.ok
body.should.equal 'Windows'
get_it '/', :agent => 'Mac'
get_it '/', :env => { :agent => 'Mac' }
should.not.be.ok
end
specify "can filters by agent" do
specify "can use regex to get parts of user-agent" do
get '/', :agent => /Windows (NT)/ do
params[:agent].first