Home | History | Annotate | Download | only in tests
      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