# -*- coding: utf-8 -*-
import webapp2
from webapp2_extras import sessions
import test_base
app = webapp2.WSGIApplication(config={
'webapp2_extras.sessions': {
'secret_key': 'my-super-secret',
},
})
class TestSecureCookieSession(test_base.BaseTestCase):
factory = sessions.SecureCookieSessionFactory
def test_config(self):
app = webapp2.WSGIApplication()
req = webapp2.Request.blank('/')
req.app = app
self.assertRaises(Exception, sessions.SessionStore, req)
# Just to set a special config.
app = webapp2.WSGIApplication()
req = webapp2.Request.blank('/')
req.app = app
store = sessions.SessionStore(req, config={
'secret_key': 'my-super-secret',
'cookie_name': 'foo'
})
session = store.get_session(factory=self.factory)
session['bar'] = 'bar'
rsp = webapp2.Response()
store.save_sessions(rsp)
self.assertTrue(rsp.headers['Set-Cookie'].startswith('foo='))
def test_get_save_session(self):
# Round 1 -------------------------------------------------------------
req = webapp2.Request.blank('/')
req.app = app
store = sessions.SessionStore(req)
session = store.get_session(factory=self.factory)
rsp = webapp2.Response()
# Nothing changed, we want to test anyway.
store.save_sessions(rsp)
session['a'] = 'b'
session['c'] = 'd'
session['e'] = 'f'
store.save_sessions(rsp)
# Round 2 -------------------------------------------------------------
cookies = rsp.headers.get('Set-Cookie')
req = webapp2.Request.blank('/', headers=[('Cookie', cookies)])
req.app = app
store = sessions.SessionStore(req)
session = store.get_session(factory=self.factory)
self.assertEqual(session['a'], 'b')
self.assertEqual(session['c'], 'd')
self.assertEqual(session['e'], 'f')
session['g'] = 'h'
rsp = webapp2.Response()
store.save_sessions(rsp)
# Round 3 -------------------------------------------------------------
cookies = rsp.headers.get('Set-Cookie')
req = webapp2.Request.blank('/', headers=[('Cookie', cookies)])
req.app = app
store = sessions.SessionStore(req)
session = store.get_session(factory=self.factory)
self.assertEqual(session['a'], 'b')
self.assertEqual(session['c'], 'd')
self.assertEqual(session['e'], 'f')
self.assertEqual(session['g'], 'h')
self.assertRaises(KeyError, session.pop, 'foo')
def test_flashes(self):
# Round 1 -------------------------------------------------------------
req = webapp2.Request.blank('/')
req.app = app
store = sessions.SessionStore(req)
session = store.get_session(factory=self.factory)
flashes = session.get_flashes()
self.assertEqual(flashes, [])
session.add_flash('foo')
rsp = webapp2.Response()
store.save_sessions(rsp)
# Round 2 -------------------------------------------------------------
cookies = rsp.headers.get('Set-Cookie')
req = webapp2.Request.blank('/', headers=[('Cookie', cookies)])
req.app = app
store = sessions.SessionStore(req)
session = store.get_session(factory=self.factory)
flashes = session.get_flashes()
self.assertEqual(flashes, [[u'foo', None]])
flashes = session.get_flashes()
self.assertEqual(flashes, [])
session.add_flash('bar')
session.add_flash('baz', 'important')
rsp = webapp2.Response()
store.save_sessions(rsp)
# Round 3 -------------------------------------------------------------
cookies = rsp.headers.get('Set-Cookie')
req = webapp2.Request.blank('/', headers=[('Cookie', cookies)])
req.app = app
store = sessions.SessionStore(req)
session = store.get_session(factory=self.factory)
flashes = session.get_flashes()
self.assertEqual(flashes, [[u'bar', None], [u'baz', 'important']])
flashes = session.get_flashes()
self.assertEqual(flashes, [])
rsp = webapp2.Response()
store.save_sessions(rsp)
# Round 4 -------------------------------------------------------------
cookies = rsp.headers.get('Set-Cookie')
req = webapp2.Request.blank('/', headers=[('Cookie', cookies)])
req.app = app
store = sessions.SessionStore(req)
session = store.get_session(factory=self.factory)
flashes = session.get_flashes()
self.assertEqual(flashes, [])
def test_set_secure_cookie(self):
rsp = webapp2.Response()
# Round 1 -------------------------------------------------------------
req = webapp2.Request.blank('/')
req.app = app
store = sessions.SessionStore(req)
store.set_secure_cookie('foo', {'bar': 'baz'})
store.save_sessions(rsp)
# Round 2 -------------------------------------------------------------
cookies = rsp.headers.get('Set-Cookie')
req = webapp2.Request.blank('/', headers=[('Cookie', cookies)])
req.app = app
store = sessions.SessionStore(req)
res = store.get_secure_cookie('foo')
self.assertEqual(res, {'bar': 'baz'})
def test_set_session_store(self):
app = webapp2.WSGIApplication(config={
'webapp2_extras.sessions': {
'secret_key': 'my-super-secret',
}
})
req = webapp2.Request.blank('/')
req.app = app
store = sessions.SessionStore(req)
self.assertEqual(len(req.registry), 0)
sessions.set_store(store, request=req)
self.assertEqual(len(req.registry), 1)
s = sessions.get_store(request=req)
self.assertTrue(isinstance(s, sessions.SessionStore))
def test_get_session_store(self):
app = webapp2.WSGIApplication(config={
'webapp2_extras.sessions': {
'secret_key': 'my-super-secret',
}
})
req = webapp2.Request.blank('/')
req.app = app
self.assertEqual(len(req.registry), 0)
s = sessions.get_store(request=req)
self.assertEqual(len(req.registry), 1)
self.assertTrue(isinstance(s, sessions.SessionStore))
def test_not_implemented(self):
req = webapp2.Request.blank('/')
req.app = app
store = sessions.SessionStore(req)
f = sessions.BaseSessionFactory('foo', store)
self.assertRaises(NotImplementedError, f.get_session)
self.assertRaises(NotImplementedError, f.save_session, None)
f = sessions.CustomBackendSessionFactory('foo', store)
self.assertRaises(NotImplementedError, f._get_by_sid, None)
if __name__ == '__main__':
test_base.main()