blob: 4d43c9f849a087b9a2affb35ed1627ac3181dab9 [file] [log] [blame]
from webapp2_extras import auth
from webapp2_extras.appengine.auth import models
from google.appengine.ext.ndb import model
import test_base
class UniqueConstraintViolation(Exception):
pass
class User(model.Model):
username = model.StringProperty(required=True)
auth_id = model.StringProperty()
email = model.StringProperty()
class TestAuthModels(test_base.BaseTestCase):
def setUp(self):
super(TestAuthModels, self).setUp()
self.register_model('User', models.User)
self.register_model('UserToken', models.UserToken)
self.register_model('Unique', models.Unique)
def test_get(self):
m = models.User
success, user = m.create_user(auth_id='auth_id_1', password_raw='foo')
self.assertEqual(success, True)
self.assertTrue(user is not None)
self.assertTrue(user.password is not None)
# user.key.id() is required to retrieve the auth token
user_id = user.key.id()
token = m.create_auth_token(user_id)
self.assertEqual(m.get_by_auth_id('auth_id_1'), user)
self.assertEqual(m.get_by_auth_id('auth_id_2'), None)
u, ts = m.get_by_auth_token(user_id, token)
self.assertEqual(u, user)
u, ts = m.get_by_auth_token('fake_user_id', token)
self.assertEqual(u, None)
u = m.get_by_auth_password('auth_id_1', 'foo')
self.assertEqual(u, user)
self.assertRaises(auth.InvalidPasswordError,
m.get_by_auth_password, 'auth_id_1', 'bar')
self.assertRaises(auth.InvalidAuthIdError,
m.get_by_auth_password, 'auth_id_2', 'foo')
def test_create_user(self):
m = models.User
success, info = m.create_user(auth_id='auth_id_1', password_raw='foo')
self.assertEqual(success, True)
self.assertTrue(info is not None)
self.assertTrue(info.password is not None)
success, info = m.create_user(auth_id='auth_id_1')
self.assertEqual(success, False)
self.assertEqual(info, ['auth_id'])
# 3 extras and unique properties; plus 1 extra and not unique.
extras = ['foo', 'bar', 'baz']
values = dict((v, v + '_value') for v in extras)
values['ding'] = 'ding_value'
success, info = m.create_user(auth_id='auth_id_2',
unique_properties=extras, **values)
self.assertEqual(success, True)
self.assertTrue(info is not None)
for prop in extras:
self.assertEqual(getattr(info, prop), prop + '_value')
self.assertEqual(info.ding, 'ding_value')
# Let's do it again.
success, info = m.create_user(auth_id='auth_id_3',
unique_properties=extras, **values)
self.assertEqual(success, False)
self.assertEqual(info, extras)
def test_add_auth_ids(self):
m = models.User
success, new_user = m.create_user(auth_id='auth_id_1', password_raw='foo')
self.assertEqual(success, True)
self.assertTrue(new_user is not None)
self.assertTrue(new_user.password is not None)
success, new_user_2 = m.create_user(auth_id='auth_id_2', password_raw='foo')
self.assertEqual(success, True)
self.assertTrue(new_user is not None)
self.assertTrue(new_user.password is not None)
success, info = new_user.add_auth_id('auth_id_3')
self.assertEqual(success, True)
self.assertEqual(info.auth_ids, ['auth_id_1', 'auth_id_3'])
success, info = new_user.add_auth_id('auth_id_2')
self.assertEqual(success, False)
self.assertEqual(info, ['auth_id'])
def test_token(self):
m = models.UserToken
auth_id = 'foo'
subject = 'bar'
token_1 = m.create(auth_id, subject, token=None)
token = token_1.token
token_2 = m.get(user=auth_id, subject=subject, token=token)
self.assertEqual(token_2, token_1)
token_3 = m.get(subject=subject, token=token)
self.assertEqual(token_3, token_1)
m.get_key(auth_id, subject, token).delete()
token_2 = m.get(user=auth_id, subject=subject, token=token)
self.assertEqual(token_2, None)
token_3 = m.get(subject=subject, token=token)
self.assertEqual(token_3, None)
def test_user_token(self):
m = models.User
auth_id = 'foo'
token = m.create_auth_token(auth_id)
self.assertTrue(m.validate_auth_token(auth_id, token))
m.delete_auth_token(auth_id, token)
self.assertFalse(m.validate_auth_token(auth_id, token))
token = m.create_signup_token(auth_id)
self.assertTrue(m.validate_signup_token(auth_id, token))
m.delete_signup_token(auth_id, token)
self.assertFalse(m.validate_signup_token(auth_id, token))
class TestUniqueModel(test_base.BaseTestCase):
def setUp(self):
super(TestUniqueModel, self).setUp()
self.register_model('Unique', models.Unique)
def test_single(self):
def create_user(username):
# Assemble the unique scope/value combinations.
unique_username = 'User.username:%s' % username
# Create the unique username, auth_id and email.
success = models.Unique.create(unique_username)
if success:
user = User(username=username)
user.put()
return user
else:
raise UniqueConstraintViolation('Username %s already '
'exists' % username)
user = create_user('username_1')
self.assertRaises(UniqueConstraintViolation, create_user, 'username_1')
user = create_user('username_2')
self.assertRaises(UniqueConstraintViolation, create_user, 'username_2')
def test_multi(self):
def create_user(username, auth_id, email):
# Assemble the unique scope/value combinations.
unique_username = 'User.username:%s' % username
unique_auth_id = 'User.auth_id:%s' % auth_id
unique_email = 'User.email:%s' % email
# Create the unique username, auth_id and email.
uniques = [unique_username, unique_auth_id, unique_email]
success, existing = models.Unique.create_multi(uniques)
if success:
user = User(username=username, auth_id=auth_id, email=email)
user.put()
return user
else:
if unique_username in existing:
raise UniqueConstraintViolation('Username %s already '
'exists' % username)
if unique_auth_id in existing:
raise UniqueConstraintViolation('Auth id %s already '
'exists' % auth_id)
if unique_email in existing:
raise UniqueConstraintViolation('Email %s already '
'exists' % email)
user = create_user('username_1', 'auth_id_1', 'email_1')
self.assertRaises(UniqueConstraintViolation, create_user, 'username_1', 'auth_id_2', 'email_2')
self.assertRaises(UniqueConstraintViolation, create_user, 'username_2', 'auth_id_1', 'email_2')
self.assertRaises(UniqueConstraintViolation, create_user, 'username_2', 'auth_id_2', 'email_1')
user = create_user('username_2', 'auth_id_2', 'email_2')
self.assertRaises(UniqueConstraintViolation, create_user, 'username_2', 'auth_id_1', 'email_1')
self.assertRaises(UniqueConstraintViolation, create_user, 'username_1', 'auth_id_2', 'email_1')
self.assertRaises(UniqueConstraintViolation, create_user, 'username_1', 'auth_id_1', 'email_2')
def test_delete_multi(self):
rv = models.Unique.create_multi(('foo', 'bar', 'baz'))
self.assertEqual(rv, (True, []))
rv = models.Unique.create_multi(('foo', 'bar', 'baz'))
self.assertEqual(rv, (False, ['foo', 'bar', 'baz']))
models.Unique.delete_multi(('foo', 'bar', 'baz'))
rv = models.Unique.create_multi(('foo', 'bar', 'baz'))
self.assertEqual(rv, (True, []))
if __name__ == '__main__':
test_base.main()