1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
import re
import os
from beaker.middleware import SessionMiddleware
from nose import SkipTest
try:
from webtest import TestApp
except ImportError:
raise SkipTest("webtest not installed")
def teardown():
import shutil
shutil.rmtree('./cache', True)
def no_save_app(environ, start_response):
session = environ['beaker.session']
sess_id = environ.get('SESSION_ID')
start_response('200 OK', [('Content-type', 'text/plain')])
return ['The current value is: %s, session id is %s' % (session.get('value'),
session.id)]
def simple_app(environ, start_response):
session = environ['beaker.session']
sess_id = environ.get('SESSION_ID')
if sess_id:
session = session.get_by_id(sess_id)
if not session:
start_response('200 OK', [('Content-type', 'text/plain')])
return ["No session id of %s found." % sess_id]
if not session.has_key('value'):
session['value'] = 0
session['value'] += 1
if not environ['PATH_INFO'].startswith('/nosave'):
session.save()
start_response('200 OK', [('Content-type', 'text/plain')])
return ['The current value is: %d, session id is %s' % (session['value'],
session.id)]
def simple_auto_app(environ, start_response):
"""Like the simple_app, but assume that sessions auto-save"""
session = environ['beaker.session']
sess_id = environ.get('SESSION_ID')
if sess_id:
session = session.get_by_id(sess_id)
if not session:
start_response('200 OK', [('Content-type', 'text/plain')])
return ["No session id of %s found." % sess_id]
if not session.has_key('value'):
session['value'] = 0
session['value'] += 1
if environ['PATH_INFO'].startswith('/nosave'):
session.revert()
start_response('200 OK', [('Content-type', 'text/plain')])
return ['The current value is: %d, session id is %s' % (session.get('value', 0),
session.id)]
def test_no_save():
options = {'session.data_dir':'./cache', 'session.secret':'blah'}
app = TestApp(SessionMiddleware(no_save_app, **options))
res = app.get('/')
assert 'current value is: None' in res
assert [] == res.headers.getall('Set-Cookie')
def test_increment():
options = {'session.data_dir':'./cache', 'session.secret':'blah'}
app = TestApp(SessionMiddleware(simple_app, **options))
res = app.get('/')
assert 'current value is: 1' in res
res = app.get('/')
assert 'current value is: 2' in res
res = app.get('/')
assert 'current value is: 3' in res
def test_increment_auto():
options = {'session.data_dir':'./cache', 'session.secret':'blah'}
app = TestApp(SessionMiddleware(simple_auto_app, auto=True, **options))
res = app.get('/')
assert 'current value is: 1' in res
res = app.get('/')
assert 'current value is: 2' in res
res = app.get('/')
assert 'current value is: 3' in res
def test_different_sessions():
options = {'session.data_dir':'./cache', 'session.secret':'blah'}
app = TestApp(SessionMiddleware(simple_app, **options))
app2 = TestApp(SessionMiddleware(simple_app, **options))
res = app.get('/')
assert 'current value is: 1' in res
res = app2.get('/')
assert 'current value is: 1' in res
res = app2.get('/')
res = app2.get('/')
res = app2.get('/')
res2 = app.get('/')
assert 'current value is: 2' in res2
assert 'current value is: 4' in res
def test_different_sessions_auto():
options = {'session.data_dir':'./cache', 'session.secret':'blah'}
app = TestApp(SessionMiddleware(simple_auto_app, auto=True, **options))
app2 = TestApp(SessionMiddleware(simple_auto_app, auto=True, **options))
res = app.get('/')
assert 'current value is: 1' in res
res = app2.get('/')
assert 'current value is: 1' in res
res = app2.get('/')
res = app2.get('/')
res = app2.get('/')
res2 = app.get('/')
assert 'current value is: 2' in res2
assert 'current value is: 4' in res
def test_nosave():
options = {'session.data_dir':'./cache', 'session.secret':'blah'}
app = TestApp(SessionMiddleware(simple_app, **options))
res = app.get('/nosave')
assert 'current value is: 1' in res
res = app.get('/nosave')
assert 'current value is: 1' in res
res = app.get('/')
assert 'current value is: 1' in res
res = app.get('/')
assert 'current value is: 2' in res
def test_revert():
options = {'session.data_dir':'./cache', 'session.secret':'blah'}
app = TestApp(SessionMiddleware(simple_auto_app, auto=True, **options))
res = app.get('/nosave')
assert 'current value is: 0' in res
res = app.get('/nosave')
assert 'current value is: 0' in res
res = app.get('/')
assert 'current value is: 1' in res
assert [] == res.headers.getall('Set-Cookie')
res = app.get('/')
assert [] == res.headers.getall('Set-Cookie')
assert 'current value is: 2' in res
# Finally, ensure that reverting shows the proper one
res = app.get('/nosave')
assert [] == res.headers.getall('Set-Cookie')
assert 'current value is: 2' in res
def test_load_session_by_id():
options = {'session.data_dir':'./cache', 'session.secret':'blah'}
app = TestApp(SessionMiddleware(simple_app, **options))
res = app.get('/')
assert 'current value is: 1' in res
res = app.get('/')
res = app.get('/')
assert 'current value is: 3' in res
old_id = re.sub(r'^.*?session id is (\S+)$', r'\1', res.body, re.M)
# Clear the cookies and do a new request
app = TestApp(SessionMiddleware(simple_app, **options))
res = app.get('/')
assert 'current value is: 1' in res
# Load a bogus session to see that its not there
res = app.get('/', extra_environ={'SESSION_ID':'jil2j34il2j34ilj23'})
assert 'No session id of' in res
# Saved session was at 3, now it'll be 4
res = app.get('/', extra_environ={'SESSION_ID':old_id})
assert 'current value is: 4' in res
# Prior request is now up to 2
res = app.get('/')
assert 'current value is: 2' in res
if __name__ == '__main__':
from paste import httpserver
wsgi_app = SessionMiddleware(simple_app, {})
httpserver.serve(wsgi_app, host='127.0.0.1', port=8080)
|