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