1b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport webapp2
2b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras import sessions
3b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
4b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras import auth
5b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras.appengine.auth import models
6b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
7b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom google.appengine.ext.ndb import model
8b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
9b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport test_base
10b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
11b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
12b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikclass TestAuth(test_base.BaseTestCase):
13b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
14b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def setUp(self):
15b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        super(TestAuth, self).setUp()
16b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.register_model('User', models.User)
17b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.register_model('UserToken', models.UserToken)
18b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.register_model('Unique', models.Unique)
19b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
20b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def _check_token(self, user_id, token, subject='auth'):
21b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = models.UserToken.get(user=user_id, subject=subject, token=token)
22b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        return rv is not None
23b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
24b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_get_user_by_session(self):
25b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication(config={
26b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            'webapp2_extras.sessions': {
27b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                'secret_key': 'foo',
28b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            }
29b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        })
30b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
31b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rsp = webapp2.Response()
32b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
33b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s = auth.get_store(app=app)
34b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a = auth.Auth(request=req)
35b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        session_store = sessions.get_store(request=req)
36b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
37b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # This won't work.
38b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a.set_session_data({})
39b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(a.session.get('_user'), None)
40b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
41b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # This won't work.
42b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a.session['_user'] = {}
43b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(a.get_session_data(), None)
44b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(a.session.get('_user'), None)
45b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
46b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Create a user.
47b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        m = models.User
48b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        success, user = m.create_user(auth_id='auth_id',
49b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                                      password_raw='password')
50b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
51b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        user_id = user.key.id()
52b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
53b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Get user with session. An anonymous_user is returned.
54b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_session()
55b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(rv is None)
56b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
57b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Login with password. User dict is returned.
58b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_password('auth_id', 'password')
59b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv['user_id'], user_id)
60b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
61b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Save sessions.
62b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        session_store.save_sessions(rsp)
63b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
64b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Get user with session. Voila!
65b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        cookies = rsp.headers.get('Set-Cookie')
66b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/', headers=[('Cookie', cookies)])
67b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rsp = webapp2.Response()
68b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
69b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a = auth.Auth(request=req)
70b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
71b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # only auth_id is returned when there're no
72b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # custom user attributes defined.
73b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_session()
74b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv['user_id'], user_id)
75b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
76b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # If we call get_user_by_token() now, the same user is returned.
77b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv2 = a.get_user_by_token(rv['user_id'], rv['token'])
78b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(rv is rv2)
79b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
80b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Let's get it again and check that token is the same.
81b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        token = rv['token']
82b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a._user = None
83b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_session()
84b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv['user_id'], user_id)
85b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv['token'], token)
86b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
87b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Now let's force token to be renewed and check that we have a new one.
88b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s.config['token_new_age'] = -300
89b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a._user = None
90b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_session()
91b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv['user_id'], user_id)
92b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertNotEqual(rv['token'], token)
93b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
94b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Now let's force token to be invalid.
95b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s.config['token_max_age'] = -300
96b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a._user = None
97b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_session()
98b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, None)
99b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
100b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_get_user_by_password(self):
101b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication(config={
102b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            'webapp2_extras.sessions': {
103b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                'secret_key': 'foo',
104b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            }
105b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        })
106b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
107b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
108b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s = auth.get_store(app=app)
109b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a = auth.get_auth(request=req)
110b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        session_store = sessions.get_store(request=req)
111b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
112b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        m = models.User
113b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        success, user = m.create_user(auth_id='auth_id',
114b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                                      password_raw='password')
115b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
116b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        user_id = user.key.id()
117b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Lets test the cookie max_age when we use remember=True or False.
118b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_password('auth_id', 'password', remember=True)
119b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv['user_id'], user_id)
120b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(session_store.sessions['auth'].session_args['max_age'],
121b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                         86400 * 7 * 3)
122b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
123b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Now remember=False.
124b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_password('auth_id', 'password')
125b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv['user_id'], user_id)
126b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(session_store.sessions['auth'].session_args['max_age'],
127b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                         None)
128b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
129b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # User was set so getting it from session will return the same one.
130b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_session()
131b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv['user_id'], user_id)
132b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
133b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Now try a failed password submission: user will be unset.
134b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_password('auth_id', 'password_2', silent=True)
135b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(rv is None)
136b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
137b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # And getting by session will no longer work.
138b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = a.get_user_by_session()
139b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(rv is None)
140b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
141b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_validate_password(self):
142b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication()
143b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
144b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
145b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s = auth.get_store(app=app)
146b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
147b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        m = models.User
148b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        success, user = m.create_user(auth_id='auth_id',
149b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                                      password_raw='foo')
150b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
151b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        u = s.validate_password('auth_id', 'foo')
152b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(u, s.user_to_dict(user))
153b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertRaises(auth.InvalidPasswordError,
154b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                          s.validate_password, 'auth_id', 'bar')
155b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertRaises(auth.InvalidAuthIdError,
156b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                          s.validate_password, 'auth_id_2', 'foo')
157b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
158b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_validate_token(self):
159b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication()
160b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
161b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
162b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s = auth.get_store(app=app)
163b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
164b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = s.validate_token('auth_id', 'token')
165b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, (None, None))
166b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
167b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Expired timestamp.
168b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = s.validate_token('auth_id', 'token', -300)
169b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, (None, None))
170b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
171b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        m = models.User
172b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        success, user = m.create_user(auth_id='auth_id',
173b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                                      password_raw='foo')
174b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
175b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        user_id = user.key.id()
176b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        token = m.create_auth_token(user_id)
177b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = s.validate_token(user_id, token)
178b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, (s.user_to_dict(user), token))
179b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Token must still be there.
180b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(self._check_token(user_id, token))
181b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
182b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Expired timestamp.
183b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        token = m.create_auth_token(user_id)
184b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = s.validate_token(user_id, token, -300)
185b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, (None, None))
186b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Token must have been deleted.
187b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertFalse(self._check_token(user_id, token))
188b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
189b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Force expiration.
190b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        token = m.create_auth_token(user_id)
191b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s.config['token_max_age'] = -300
192b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = s.validate_token(user_id, token)
193b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, (None, None))
194b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Token must have been deleted.
195b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertFalse(self._check_token(user_id, token))
196b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
197b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Revert expiration, force renewal.
198b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        token = m.create_auth_token(user_id)
199b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s.config['token_max_age'] = 86400 * 7 * 3
200b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s.config['token_new_age'] = -300
201b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = s.validate_token(user_id, token)
202b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, (s.user_to_dict(user), None))
203b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        # Token must have been deleted.
204b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertFalse(self._check_token(user_id, token))
205b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
206b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_set_auth_store(self):
207b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication()
208b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
209b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
210b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        store = auth.AuthStore(app)
211b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
212b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(len(app.registry), 0)
213b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        auth.set_store(store, app=app)
214b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(len(app.registry), 1)
215b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s = auth.get_store(app=app)
216b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(isinstance(s, auth.AuthStore))
217b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
218b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_get_auth_store(self):
219b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication()
220b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
221b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
222b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(len(app.registry), 0)
223b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s = auth.get_store(app=app)
224b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(len(app.registry), 1)
225b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(isinstance(s, auth.AuthStore))
226b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
227b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_set_auth(self):
228b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication()
229b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
230b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
231b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a = auth.Auth(req)
232b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
233b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(len(req.registry), 0)
234b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        auth.set_auth(a, request=req)
235b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(len(req.registry), 1)
236b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a = auth.get_auth(request=req)
237b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(isinstance(a, auth.Auth))
238b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
239b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_get_auth(self):
240b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication()
241b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
242b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
243b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(len(req.registry), 0)
244b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        a = auth.get_auth(request=req)
245b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(len(req.registry), 1)
246b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(isinstance(a, auth.Auth))
247b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
248b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    '''
249b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_set_callables(self):
250b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication()
251b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req = webapp2.Request.blank('/')
252b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        req.app = app
253b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s = auth.get_store(app=app)
254b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
255b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        def validate_password(store, auth_id, password):
256b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            self.assertTrue(store is s)
257b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            self.assertEqual(auth_id, 'auth_id')
258b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            self.assertEqual(password, 'password')
259b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            return 'validate_password'
260b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
261b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        def validate_token(store, auth_id, token, token_ts=None):
262b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            self.assertTrue(store is s)
263b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            self.assertEqual(auth_id, 'auth_id')
264b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            self.assertEqual(token, 'token')
265b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            self.assertEqual(token_ts, 'token_ts')
266b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            return 'validate_token'
267b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
268b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s.set_password_validator(validate_password)
269b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = s.validate_password('auth_id', 'password')
270b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, 'validate_password')
271b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
272b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s.set_token_validator(validate_token)
273b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        rv = s.validate_token('auth_id', 'token', 'token_ts')
274b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(rv, 'validate_token')
275b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    '''
276b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
277b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    def test_extended_user(self):
278b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        class MyUser(models.User):
279b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            newsletter = model.BooleanProperty()
280b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            age = model.IntegerProperty()
281b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
282b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        auth_id = 'own:username'
283b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        success, info = MyUser.create_user(auth_id, newsletter=True, age=22)
284b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(success)
285b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
286b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        app = webapp2.WSGIApplication(config={
287b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            'webapp2_extras.auth': {
288b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik                'user_model': MyUser,
289b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            }
290b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        })
291b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        s = auth.get_store(app=app)
292b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        user = s.user_model.get_by_auth_id(auth_id)
293b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(info, user)
294b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertEqual(user.age, 22)
295b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        self.assertTrue(user.newsletter is True)
296b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
297b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
298b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikif __name__ == '__main__':
299b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    test_base.main()
300