mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
09159d8530
Adding the `each` method is required for ensuring compatibility between Rails, and other Rack frameworks (like Sinatra, etc.), that are mounted within Rails, and wish to use its session tooling. Prior to this, there was an inconsistency between ActionDispatch::Request::Session and Rack::Session::Cookie, due to the absence of the `each` method. This should hopefully fix that error. :) For a full integration test with Sinatra and a standalone Rack application, you can check out the gist for that here: https://gist.github.com/maclover7/08cd95b0bfe259465314311941326470. Solves #15843.
144 lines
3.4 KiB
Ruby
144 lines
3.4 KiB
Ruby
require 'abstract_unit'
|
|
require 'action_dispatch/middleware/session/abstract_store'
|
|
|
|
module ActionDispatch
|
|
class Request
|
|
class SessionTest < ActiveSupport::TestCase
|
|
attr_reader :req
|
|
|
|
def setup
|
|
@req = ActionDispatch::Request.empty
|
|
end
|
|
|
|
def test_create_adds_itself_to_env
|
|
s = Session.create(store, req, {})
|
|
assert_equal s, req.env[Rack::RACK_SESSION]
|
|
end
|
|
|
|
def test_to_hash
|
|
s = Session.create(store, req, {})
|
|
s['foo'] = 'bar'
|
|
assert_equal 'bar', s['foo']
|
|
assert_equal({'foo' => 'bar'}, s.to_hash)
|
|
end
|
|
|
|
def test_create_merges_old
|
|
s = Session.create(store, req, {})
|
|
s['foo'] = 'bar'
|
|
|
|
s1 = Session.create(store, req, {})
|
|
assert_not_equal s, s1
|
|
assert_equal 'bar', s1['foo']
|
|
end
|
|
|
|
def test_find
|
|
assert_nil Session.find(req)
|
|
|
|
s = Session.create(store, req, {})
|
|
assert_equal s, Session.find(req)
|
|
end
|
|
|
|
def test_destroy
|
|
s = Session.create(store, req, {})
|
|
s['rails'] = 'ftw'
|
|
|
|
s.destroy
|
|
|
|
assert_empty s
|
|
end
|
|
|
|
def test_keys
|
|
s = Session.create(store, req, {})
|
|
s['rails'] = 'ftw'
|
|
s['adequate'] = 'awesome'
|
|
assert_equal %w[rails adequate], s.keys
|
|
end
|
|
|
|
def test_values
|
|
s = Session.create(store, req, {})
|
|
s['rails'] = 'ftw'
|
|
s['adequate'] = 'awesome'
|
|
assert_equal %w[ftw awesome], s.values
|
|
end
|
|
|
|
def test_clear
|
|
s = Session.create(store, req, {})
|
|
s['rails'] = 'ftw'
|
|
s['adequate'] = 'awesome'
|
|
|
|
s.clear
|
|
assert_empty(s.values)
|
|
end
|
|
|
|
def test_update
|
|
s = Session.create(store, req, {})
|
|
s['rails'] = 'ftw'
|
|
|
|
s.update(:rails => 'awesome')
|
|
|
|
assert_equal(['rails'], s.keys)
|
|
assert_equal('awesome', s['rails'])
|
|
end
|
|
|
|
def test_delete
|
|
s = Session.create(store, req, {})
|
|
s['rails'] = 'ftw'
|
|
|
|
s.delete('rails')
|
|
|
|
assert_empty(s.keys)
|
|
end
|
|
|
|
def test_fetch
|
|
session = Session.create(store, req, {})
|
|
|
|
session['one'] = '1'
|
|
assert_equal '1', session.fetch(:one)
|
|
|
|
assert_equal '2', session.fetch(:two, '2')
|
|
assert_nil session.fetch(:two, nil)
|
|
|
|
assert_equal 'three', session.fetch(:three) {|el| el.to_s }
|
|
|
|
assert_raise KeyError do
|
|
session.fetch(:three)
|
|
end
|
|
end
|
|
|
|
private
|
|
def store
|
|
Class.new {
|
|
def load_session(env); [1, {}]; end
|
|
def session_exists?(env); true; end
|
|
def delete_session(env, id, options); 123; end
|
|
}.new
|
|
end
|
|
end
|
|
|
|
class SessionIntegrationTest < ActionDispatch::IntegrationTest
|
|
class MySessionApp
|
|
def call(env)
|
|
request = Rack::Request.new(env)
|
|
request.session['hello'] = 'Hello from MySessionApp!'
|
|
[ 200, {}, ['Hello from MySessionApp!'] ]
|
|
end
|
|
end
|
|
|
|
Router = ActionDispatch::Routing::RouteSet.new
|
|
Router.draw do
|
|
get '/mysessionapp' => MySessionApp.new
|
|
end
|
|
|
|
def app
|
|
@app ||= RoutedRackApp.new(Router)
|
|
end
|
|
|
|
def test_session_follows_rack_api_contract_1
|
|
get '/mysessionapp'
|
|
assert_response :ok
|
|
assert_equal 'Hello from MySessionApp!', @response.body
|
|
assert_equal 'Hello from MySessionApp!', session['hello']
|
|
end
|
|
end
|
|
end
|
|
end
|