1b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik# -*- coding: utf-8 -*- 2b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom google.appengine.api import datastore_errors 3b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom google.appengine.api import memcache 4b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 5b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport webapp2 6b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras import sessions 7b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras import sessions_ndb 8b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 9b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport test_base 10b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 11b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 12b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikapp = webapp2.WSGIApplication(config={ 13b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'webapp2_extras.sessions': { 14b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'secret_key': 'my-super-secret', 15b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik }, 16b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik}) 17b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 18b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 19b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikclass TestNdbSession(test_base.BaseTestCase): 20b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik #factory = sessions_ndb.DatastoreSessionFactory 21b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 22b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def setUp(self): 23b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik super(TestNdbSession, self).setUp() 24b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.register_model('Session', sessions_ndb.Session) 25b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 26b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_get_save_session(self): 27b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 28b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 1 ------------------------------------------------------------- 29b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 30b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 31b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 32b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 33b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 34b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(backend='datastore') 35b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 36b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 37b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Nothing changed, we want to test anyway. 38b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 39b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 40b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['a'] = 'b' 41b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['c'] = 'd' 42b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['e'] = 'f' 43b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 44b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 45b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 46b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 2 ------------------------------------------------------------- 47b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 48b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 49b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 50b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 51b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 52b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 53b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(backend='datastore') 54b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['a'], 'b') 55b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['c'], 'd') 56b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['e'], 'f') 57b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 58b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['g'] = 'h' 59b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 60b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 61b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 62b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 63b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 3 ------------------------------------------------------------- 64b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 65b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 66b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 67b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 68b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 69b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 70b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(backend='datastore') 71b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['a'], 'b') 72b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['c'], 'd') 73b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['e'], 'f') 74b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['g'], 'h') 75b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 76b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 4 ------------------------------------------------------------- 77b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 78b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # For this attempt we don't want the memcache backup. 79b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik sid = session.container.sid 80b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik memcache.delete(sid) 81b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 82b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 83b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 84b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 85b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 86b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 87b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(backend='datastore') 88b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['a'], 'b') 89b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['c'], 'd') 90b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['e'], 'f') 91b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['g'], 'h') 92b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 93b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_flashes(self): 94b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 95b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 1 ------------------------------------------------------------- 96b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 97b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 98b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 99b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 100b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 101b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(backend='datastore') 102b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 103b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, []) 104b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session.add_flash('foo') 105b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 106b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 107b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 108b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 109b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 2 ------------------------------------------------------------- 110b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 111b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 112b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 113b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 114b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 115b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 116b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(backend='datastore') 117b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 118b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 119b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, [(u'foo', None)]) 120b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 121b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 122b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, []) 123b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 124b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session.add_flash('bar') 125b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session.add_flash('baz', 'important') 126b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 127b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 128b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 129b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 130b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 3 ------------------------------------------------------------- 131b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 132b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 133b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 134b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 135b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 136b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 137b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(backend='datastore') 138b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 139b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 140b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, [(u'bar', None), (u'baz', 'important')]) 141b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 142b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 143b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, []) 144b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 145b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 146b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 147b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 148b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 4 ------------------------------------------------------------- 149b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 150b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 151b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 152b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 153b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 154b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 155b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(backend='datastore') 156b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 157b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, []) 158b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 159b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_misc(self): 160b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 161b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = sessions_ndb.Session(id='foo') 162b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik key = s.put() 163b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 164b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = key.get() 165b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(s.data, None) 166b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 167b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 168b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikif __name__ == '__main__': 169b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik test_base.main() 170