1b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik# -*- coding: utf-8 -*- 2b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport webapp2 3b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras import sessions 4b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 5b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport test_base 6b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 7b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikapp = webapp2.WSGIApplication(config={ 8b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'webapp2_extras.sessions': { 9b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'secret_key': 'my-super-secret', 10b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik }, 11b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik}) 12b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 13b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 14b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikclass TestSecureCookieSession(test_base.BaseTestCase): 15b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik factory = sessions.SecureCookieSessionFactory 16b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 17b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_config(self): 18b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 19b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 20b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 21b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertRaises(Exception, sessions.SessionStore, req) 22b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 23b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Just to set a special config. 24b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 25b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 26b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 27b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req, config={ 28b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'secret_key': 'my-super-secret', 29b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'cookie_name': 'foo' 30b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik }) 31b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(factory=self.factory) 32b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['bar'] = 'bar' 33b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 34b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 35b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(rsp.headers['Set-Cookie'].startswith('foo=')) 36b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 37b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_get_save_session(self): 38b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 1 ------------------------------------------------------------- 39b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 40b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 41b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 42b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 43b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 44b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(factory=self.factory) 45b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 46b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 47b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Nothing changed, we want to test anyway. 48b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 49b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 50b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['a'] = 'b' 51b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['c'] = 'd' 52b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['e'] = 'f' 53b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 54b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 55b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 56b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 2 ------------------------------------------------------------- 57b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 58b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 59b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 60b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 61b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 62b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 63b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(factory=self.factory) 64b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['a'], 'b') 65b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['c'], 'd') 66b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['e'], 'f') 67b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 68b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session['g'] = 'h' 69b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 70b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 71b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 72b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 73b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 3 ------------------------------------------------------------- 74b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 75b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 76b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 77b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 78b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 79b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 80b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(factory=self.factory) 81b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['a'], 'b') 82b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['c'], 'd') 83b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['e'], 'f') 84b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session['g'], 'h') 85b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 86b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertRaises(KeyError, session.pop, 'foo') 87b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 88b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_flashes(self): 89b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 90b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 1 ------------------------------------------------------------- 91b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 92b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 93b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 94b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 95b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 96b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(factory=self.factory) 97b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 98b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, []) 99b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session.add_flash('foo') 100b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 101b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 102b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 103b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 104b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 2 ------------------------------------------------------------- 105b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 106b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 107b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 108b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 109b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 110b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 111b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(factory=self.factory) 112b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 113b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 114b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, [[u'foo', None]]) 115b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 116b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 117b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, []) 118b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 119b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session.add_flash('bar') 120b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session.add_flash('baz', 'important') 121b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 122b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 123b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 124b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 125b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 3 ------------------------------------------------------------- 126b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 127b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 128b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 129b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 130b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 131b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 132b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(factory=self.factory) 133b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 134b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 135b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, [[u'bar', None], [u'baz', 'important']]) 136b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 137b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 138b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, []) 139b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 140b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 141b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 142b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 143b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 4 ------------------------------------------------------------- 144b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 145b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 146b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 147b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 148b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 149b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 150b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session = store.get_session(factory=self.factory) 151b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik flashes = session.get_flashes() 152b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(flashes, []) 153b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 154b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_set_secure_cookie(self): 155b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 156b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 157b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 158b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 1 ------------------------------------------------------------- 159b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 160b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 161b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 162b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 163b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 164b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.set_secure_cookie('foo', {'bar': 'baz'}) 165b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store.save_sessions(rsp) 166b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 167b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Round 2 ------------------------------------------------------------- 168b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 169b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 170b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 171b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 172b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 173b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik res = store.get_secure_cookie('foo') 174b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(res, {'bar': 'baz'}) 175b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 176b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_set_session_store(self): 177b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication(config={ 178b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'webapp2_extras.sessions': { 179b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'secret_key': 'my-super-secret', 180b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik } 181b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik }) 182b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 183b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 184b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 185b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 186b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(req.registry), 0) 187b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik sessions.set_store(store, request=req) 188b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(req.registry), 1) 189b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = sessions.get_store(request=req) 190b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(isinstance(s, sessions.SessionStore)) 191b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 192b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_get_session_store(self): 193b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication(config={ 194b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'webapp2_extras.sessions': { 195b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'secret_key': 'my-super-secret', 196b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik } 197b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik }) 198b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 199b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 200b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(req.registry), 0) 201b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = sessions.get_store(request=req) 202b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(req.registry), 1) 203b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(isinstance(s, sessions.SessionStore)) 204b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 205b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_not_implemented(self): 206b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 207b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 208b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = sessions.SessionStore(req) 209b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 210b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik f = sessions.BaseSessionFactory('foo', store) 211b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertRaises(NotImplementedError, f.get_session) 212b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertRaises(NotImplementedError, f.save_session, None) 213b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 214b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik f = sessions.CustomBackendSessionFactory('foo', store) 215b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertRaises(NotImplementedError, f._get_by_sid, None) 216b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 217b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 218b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikif __name__ == '__main__': 219b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik test_base.main() 220