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