Skip to content
Snippets Groups Projects
test_invite.py 11 KiB
Newer Older
  • Learn to ignore specific revisions
  • Julian's avatar
    Julian committed
    import datetime
    
    from flask import current_app
    
    from uffd.database import db
    from uffd.models import Invite, InviteGrant, InviteSignup, User, Role, RoleGroup
    
    from tests.utils import UffdTestCase, db_flush
    
    class TestInviteModel(UffdTestCase):
    	def test_expire(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), creator=self.get_admin())
    		self.assertFalse(invite.expired)
    		self.assertTrue(invite.active)
    		invite.valid_until = datetime.datetime.utcnow() - datetime.timedelta(seconds=60)
    		self.assertTrue(invite.expired)
    		self.assertFalse(invite.active)
    
    	def test_void(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), single_use=False, creator=self.get_admin())
    		self.assertFalse(invite.voided)
    		self.assertTrue(invite.active)
    		invite.used = True
    		self.assertFalse(invite.voided)
    		self.assertTrue(invite.active)
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), single_use=True, creator=self.get_admin())
    		self.assertFalse(invite.voided)
    		self.assertTrue(invite.active)
    		invite.used = True
    		self.assertTrue(invite.voided)
    		self.assertFalse(invite.active)
    
    	def test_permitted(self):
    		role = Role(name='testrole')
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), allow_signup=True, roles=[role])
    		self.assertFalse(invite.permitted)
    		self.assertFalse(invite.active)
    		invite.creator = self.get_admin()
    		self.assertTrue(invite.permitted)
    		self.assertTrue(invite.active)
    
    Julian's avatar
    Julian committed
    		invite.creator.is_deactivated = True
    		self.assertFalse(invite.permitted)
    		self.assertFalse(invite.active)
    
    Julian's avatar
    Julian committed
    		invite.creator = self.get_user()
    		self.assertFalse(invite.permitted)
    		self.assertFalse(invite.active)
    		role.moderator_group = self.get_access_group()
    		current_app.config['ACL_SIGNUP_GROUP'] = 'uffd_access'
    		self.assertTrue(invite.permitted)
    		self.assertTrue(invite.active)
    		role.moderator_group = None
    		self.assertFalse(invite.permitted)
    		self.assertFalse(invite.active)
    		role.moderator_group = self.get_access_group()
    		current_app.config['ACL_SIGNUP_GROUP'] = 'uffd_admin'
    		self.assertFalse(invite.permitted)
    		self.assertFalse(invite.active)
    
    	def test_disable(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), creator=self.get_admin())
    		self.assertTrue(invite.active)
    		invite.disable()
    		self.assertFalse(invite.active)
    
    	def test_reset_disabled(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), creator=self.get_admin())
    		invite.disable()
    		self.assertFalse(invite.active)
    		invite.reset()
    		self.assertTrue(invite.active)
    
    	def test_reset_expired(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() - datetime.timedelta(seconds=60), creator=self.get_admin())
    		self.assertFalse(invite.active)
    		invite.reset()
    		self.assertFalse(invite.active)
    
    	def test_reset_single_use(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), single_use=False, creator=self.get_admin())
    		invite.used = True
    		invite.disable()
    		self.assertFalse(invite.active)
    		invite.reset()
    		self.assertTrue(invite.active)
    
    	def test_short_token(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), creator=self.get_admin())
    		db.session.add(invite)
    		db.session.commit()
    		self.assertTrue(len(invite.short_token) <= len(invite.token)/3)
    
    class TestInviteGrantModel(UffdTestCase):
    	def test_success(self):
    		user = self.get_user()
    		group0 = self.get_access_group()
    		role0 = Role(name='baserole', groups={group0: RoleGroup(group=group0)})
    		db.session.add(role0)
    		user.roles.append(role0)
    		user.update_groups()
    		group1 = self.get_admin_group()
    		role1 = Role(name='testrole1', groups={group1: RoleGroup(group=group1)})
    		db.session.add(role1)
    		role2 = Role(name='testrole2')
    		db.session.add(role2)
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), roles=[role1, role2], creator=self.get_admin())
    		self.assertIn(role0, user.roles)
    		self.assertNotIn(role1, user.roles)
    		self.assertNotIn(role2, user.roles)
    		self.assertIn(group0, user.groups)
    		self.assertNotIn(group1, user.groups)
    		self.assertFalse(invite.used)
    		grant = InviteGrant(invite=invite, user=user)
    		success, msg = grant.apply()
    		self.assertTrue(success)
    		self.assertIn(role0, user.roles)
    		self.assertIn(role1, user.roles)
    		self.assertIn(role2, user.roles)
    		self.assertIn(group0, user.groups)
    		self.assertIn(group1, user.groups)
    		self.assertTrue(invite.used)
    		db.session.commit()
    		db_flush()
    		user = self.get_user()
    		self.assertIn('baserole', [role.name for role in user.roles_effective])
    		self.assertIn('testrole1', [role.name for role in user.roles])
    		self.assertIn('testrole2', [role.name for role in user.roles])
    		self.assertIn(self.get_access_group(), user.groups)
    		self.assertIn(self.get_admin_group(), user.groups)
    
    	def test_inactive(self):
    		user = self.get_user()
    		group = self.get_admin_group()
    		role = Role(name='testrole1', groups={group: RoleGroup(group=group)})
    		db.session.add(role)
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), roles=[role], single_use=True, used=True, creator=self.get_admin())
    		self.assertFalse(invite.active)
    		grant = InviteGrant(invite=invite, user=user)
    		success, msg = grant.apply()
    		self.assertFalse(success)
    		self.assertIsInstance(msg, str)
    		self.assertNotIn(role, user.roles)
    		self.assertNotIn(group, user.groups)
    
    	def test_no_roles(self):
    		user = self.get_user()
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), creator=self.get_admin())
    		self.assertTrue(invite.active)
    		grant = InviteGrant(invite=invite, user=user)
    		success, msg = grant.apply()
    		self.assertFalse(success)
    		self.assertIsInstance(msg, str)
    
    	def test_no_new_roles(self):
    		user = self.get_user()
    		role = Role(name='testrole1')
    		db.session.add(role)
    		user.roles.append(role)
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), roles=[role], creator=self.get_admin())
    		self.assertTrue(invite.active)
    		grant = InviteGrant(invite=invite, user=user)
    		success, msg = grant.apply()
    		self.assertFalse(success)
    		self.assertIsInstance(msg, str)
    
    class TestInviteSignupModel(UffdTestCase):
    	def create_base_roles(self):
    		baserole = Role(name='base', is_default=True)
    		baserole.groups[self.get_access_group()] = RoleGroup()
    		baserole.groups[self.get_users_group()] = RoleGroup()
    		db.session.add(baserole)
    		db.session.commit()
    
    	def test_success(self):
    		self.create_base_roles()
    		base_role = Role.query.filter_by(name='base').one()
    		base_group1 = self.get_access_group()
    		base_group2 = self.get_users_group()
    		group = self.get_admin_group()
    		role1 = Role(name='testrole1', groups={group: RoleGroup(group=group)})
    		db.session.add(role1)
    		role2 = Role(name='testrole2')
    		db.session.add(role2)
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), roles=[role1, role2], allow_signup=True, creator=self.get_admin())
    		signup = InviteSignup(invite=invite, loginname='newuser', displayname='New User', mail='test@example.com', password='notsecret')
    		self.assertFalse(invite.used)
    		valid, msg = signup.validate()
    		self.assertTrue(valid)
    		self.assertFalse(invite.used)
    		user, msg = signup.finish('notsecret')
    		self.assertIsInstance(user, User)
    		self.assertTrue(invite.used)
    		self.assertEqual(user.loginname, 'newuser')
    		self.assertEqual(user.displayname, 'New User')
    		self.assertEqual(user.primary_email.address, 'test@example.com')
    		self.assertEqual(signup.user, user)
    		self.assertIn(base_role, user.roles_effective)
    		self.assertIn(role1, user.roles)
    		self.assertIn(role2, user.roles)
    		self.assertIn(base_group1, user.groups)
    		self.assertIn(base_group2, user.groups)
    		self.assertIn(group, user.groups)
    		db.session.commit()
    		db_flush()
    		self.assertEqual(len(User.query.filter_by(loginname='newuser').all()), 1)
    
    	def test_success_no_roles(self):
    		self.create_base_roles()
    		base_role = Role.query.filter_by(name='base').one()
    		base_group1 = self.get_access_group()
    		base_group2 = self.get_users_group()
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), allow_signup=True, creator=self.get_admin())
    		signup = InviteSignup(invite=invite, loginname='newuser', displayname='New User', mail='test@example.com', password='notsecret')
    		self.assertFalse(invite.used)
    		valid, msg = signup.validate()
    		self.assertTrue(valid)
    		self.assertFalse(invite.used)
    		user, msg = signup.finish('notsecret')
    		self.assertIsInstance(user, User)
    		self.assertTrue(invite.used)
    		self.assertEqual(user.loginname, 'newuser')
    		self.assertEqual(user.displayname, 'New User')
    		self.assertEqual(user.primary_email.address, 'test@example.com')
    		self.assertEqual(signup.user, user)
    		self.assertIn(base_role, user.roles_effective)
    		self.assertEqual(len(user.roles_effective), 1)
    		self.assertIn(base_group1, user.groups)
    		self.assertIn(base_group2, user.groups)
    		self.assertEqual(len(user.groups), 2)
    		db.session.commit()
    		db_flush()
    		self.assertEqual(len(User.query.filter_by(loginname='newuser').all()), 1)
    
    	def test_inactive(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), allow_signup=True, single_use=True, used=True, creator=self.get_admin())
    		self.assertFalse(invite.active)
    		signup = InviteSignup(invite=invite, loginname='newuser', displayname='New User', mail='test@example.com', password='notsecret')
    		valid, msg = signup.validate()
    		self.assertFalse(valid)
    		self.assertIsInstance(msg, str)
    		user, msg = signup.finish('notsecret')
    		self.assertIsNone(user)
    		self.assertIsInstance(msg, str)
    
    	def test_invalid(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), allow_signup=True, creator=self.get_admin())
    		self.assertTrue(invite.active)
    		signup = InviteSignup(invite=invite, loginname='', displayname='New User', mail='test@example.com', password='notsecret')
    		valid, msg = signup.validate()
    		self.assertFalse(valid)
    		self.assertIsInstance(msg, str)
    
    	def test_invalid2(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), allow_signup=True, creator=self.get_admin())
    		self.assertTrue(invite.active)
    		signup = InviteSignup(invite=invite, loginname='newuser', displayname='New User', mail='test@example.com', password='notsecret')
    		user, msg = signup.finish('wrongpassword')
    		self.assertIsNone(user)
    		self.assertIsInstance(msg, str)
    
    	def test_no_signup(self):
    		invite = Invite(valid_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=60), allow_signup=False, creator=self.get_admin())
    		self.assertTrue(invite.active)
    		signup = InviteSignup(invite=invite, loginname='newuser', displayname='New User', mail='test@example.com', password='notsecret')
    		valid, msg = signup.validate()
    		self.assertFalse(valid)
    		self.assertIsInstance(msg, str)
    		user, msg = signup.finish('notsecret')
    		self.assertIsNone(user)
    		self.assertIsInstance(msg, str)