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