session_test.rb 3.4 KB
Newer Older
A
Aaron Patterson 已提交
1 2 3 4 5 6
require 'abstract_unit'
require 'action_dispatch/middleware/session/abstract_store'

module ActionDispatch
  class Request
    class SessionTest < ActiveSupport::TestCase
7 8 9
      attr_reader :req

      def setup
E
eileencodes 已提交
10
        @req = ActionDispatch::Request.empty
11 12
      end

A
Aaron Patterson 已提交
13
      def test_create_adds_itself_to_env
14 15
        s = Session.create(store, req, {})
        assert_equal s, req.env[Rack::RACK_SESSION]
A
Aaron Patterson 已提交
16 17 18
      end

      def test_to_hash
19
        s = Session.create(store, req, {})
A
Aaron Patterson 已提交
20 21 22 23 24 25
        s['foo'] = 'bar'
        assert_equal 'bar', s['foo']
        assert_equal({'foo' => 'bar'}, s.to_hash)
      end

      def test_create_merges_old
26
        s = Session.create(store, req, {})
A
Aaron Patterson 已提交
27 28
        s['foo'] = 'bar'

29
        s1 = Session.create(store, req, {})
30
        assert_not_equal s, s1
A
Aaron Patterson 已提交
31 32 33 34
        assert_equal 'bar', s1['foo']
      end

      def test_find
35
        assert_nil Session.find(req)
A
Aaron Patterson 已提交
36

37 38
        s = Session.create(store, req, {})
        assert_equal s, Session.find(req)
A
Aaron Patterson 已提交
39 40
      end

41
      def test_destroy
42
        s = Session.create(store, req, {})
43 44 45 46 47 48 49
        s['rails'] = 'ftw'

        s.destroy

        assert_empty s
      end

50
      def test_keys
51
        s = Session.create(store, req, {})
52 53 54 55 56 57
        s['rails'] = 'ftw'
        s['adequate'] = 'awesome'
        assert_equal %w[rails adequate], s.keys
      end

      def test_values
58
        s = Session.create(store, req, {})
59 60 61 62 63
        s['rails'] = 'ftw'
        s['adequate'] = 'awesome'
        assert_equal %w[ftw awesome], s.values
      end

64
      def test_clear
65
        s = Session.create(store, req, {})
66 67
        s['rails'] = 'ftw'
        s['adequate'] = 'awesome'
68

69
        s.clear
70 71 72 73
        assert_empty(s.values)
      end

      def test_update
74
        s = Session.create(store, req, {})
75 76 77 78 79 80 81 82 83
        s['rails'] = 'ftw'

        s.update(:rails => 'awesome')

        assert_equal(['rails'], s.keys)
        assert_equal('awesome', s['rails'])
      end

      def test_delete
84
        s = Session.create(store, req, {})
85 86 87 88 89
        s['rails'] = 'ftw'

        s.delete('rails')

        assert_empty(s.keys)
90 91
      end

D
Damien Mathieu 已提交
92
      def test_fetch
93
        session = Session.create(store, req, {})
D
Damien Mathieu 已提交
94

95
        session['one'] = '1'
D
Damien Mathieu 已提交
96
        assert_equal '1', session.fetch(:one)
97

D
Damien Mathieu 已提交
98
        assert_equal '2', session.fetch(:two, '2')
99
        assert_nil session.fetch(:two, nil)
100

D
Damien Mathieu 已提交
101 102 103
        assert_equal 'three', session.fetch(:three) {|el| el.to_s }

        assert_raise KeyError do
104
          session.fetch(:three)
D
Damien Mathieu 已提交
105 106 107
        end
      end

A
Aaron Patterson 已提交
108 109 110 111 112
      private
      def store
        Class.new {
          def load_session(env); [1, {}]; end
          def session_exists?(env); true; end
113
          def delete_session(env, id, options); 123; end
A
Aaron Patterson 已提交
114 115 116
        }.new
      end
    end
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142

    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
A
Aaron Patterson 已提交
143 144
  end
end