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