mem_cache_store_test.rb 3.1 KB
Newer Older
1
require 'abstract_unit'
2

J
Joshua Peek 已提交
3 4 5 6 7 8
# You need to start a memcached server inorder to run these tests
class MemCacheStoreTest < ActionController::IntegrationTest
  class TestController < ActionController::Base
    def no_session_access
      head :ok
    end
9

J
Joshua Peek 已提交
10 11 12 13
    def set_session_value
      session[:foo] = "bar"
      head :ok
    end
14

J
Joshua Peek 已提交
15 16
    def get_session_value
      render :text => "foo: #{session[:foo].inspect}"
17
    end
J
Joshua Peek 已提交
18

19
    def get_session_id
20 21
      session[:foo]
      render :text => "#{request.session_options[:id]}"
22 23
    end

24
    def call_reset_session
25
      session[:bar]
26
      reset_session
27
      session[:bar] = "baz"
28 29 30
      head :ok
    end

J
Joshua Peek 已提交
31
    def rescue_action(e) raise end
32 33
  end

J
Joshua Peek 已提交
34 35
  begin
    DispatcherApp = ActionController::Dispatcher.new
36
    MemCacheStoreApp = ActionDispatch::Session::MemCacheStore.new(
J
Joshua Peek 已提交
37
                         DispatcherApp, :key => '_session_id')
38 39


J
Joshua Peek 已提交
40 41
    def setup
      @integration_session = open_session(MemCacheStoreApp)
42 43
    end

J
Joshua Peek 已提交
44 45 46 47 48
    def test_setting_and_getting_session_value
      with_test_route_set do
        get '/set_session_value'
        assert_response :success
        assert cookies['_session_id']
49

J
Joshua Peek 已提交
50 51 52
        get '/get_session_value'
        assert_response :success
        assert_equal 'foo: "bar"', response.body
53 54 55
      end
    end

J
Joshua Peek 已提交
56 57 58 59
    def test_getting_nil_session_value
      with_test_route_set do
        get '/get_session_value'
        assert_response :success
60
        assert_equal 'foo: nil', response.body
61 62 63
      end
    end

64
    def test_setting_session_value_after_session_reset
J
Joshua Peek 已提交
65
      with_test_route_set do
66
        get '/set_session_value'
J
Joshua Peek 已提交
67
        assert_response :success
68
        assert cookies['_session_id']
J
Joshua Peek 已提交
69
        session_id = cookies['_session_id']
70

71
        get '/call_reset_session'
72
        assert_response :success
73
        assert_not_equal [], headers['Set-Cookie']
J
Joshua Peek 已提交
74 75 76 77 78

        get '/get_session_value'
        assert_response :success
        assert_equal 'foo: nil', response.body

79
        get '/get_session_id'
J
Joshua Peek 已提交
80
        assert_response :success
81
        assert_not_equal session_id, response.body
82 83
      end
    end
84

85
    def test_getting_session_id
86 87 88 89
      with_test_route_set do
        get '/set_session_value'
        assert_response :success
        assert cookies['_session_id']
90
        session_id = cookies['_session_id']
91

92
        get '/get_session_id'
93
        assert_response :success
94 95 96
        assert_equal session_id, response.body
      end
    end
97

98 99
    def test_prevents_session_fixation
      with_test_route_set do
100 101 102
        get '/get_session_value'
        assert_response :success
        assert_equal 'foo: nil', response.body
103 104 105 106 107 108 109
        session_id = cookies['_session_id']

        reset!

        get '/set_session_value', :_session_id => session_id
        assert_response :success
        assert_equal nil, cookies['_session_id']
110 111
      end
    end
J
Joshua Peek 已提交
112 113
  rescue LoadError, RuntimeError
    $stderr.puts "Skipping MemCacheStoreTest tests. Start memcached and try again."
114 115 116
  end

  private
J
Joshua Peek 已提交
117 118 119 120 121 122 123 124 125
    def with_test_route_set
      with_routing do |set|
        set.draw do |map|
          map.with_options :controller => "mem_cache_store_test/test" do |c|
            c.connect "/:action"
          end
        end
        yield
      end
126 127
    end
end