Skip to content
Snippets Groups Projects
test_signup.py 7.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Julian's avatar
    Julian committed
    import datetime
    
    from uffd.database import db
    
    Julian's avatar
    Julian committed
    from uffd.models import Signup, User, FeatureFlag
    
    Julian's avatar
    Julian committed
    
    from tests.utils import UffdTestCase, db_flush
    
    def refetch_signup(signup):
    	db.session.add(signup)
    	db.session.commit()
    	id = signup.id
    	db.session.expunge(signup)
    	return Signup.query.get(id)
    
    # We assume in all tests that Signup.validate and Signup.password.verify do
    # not alter any state
    
    class TestSignupModel(UffdTestCase):
    	def assert_validate_valid(self, signup):
    		valid, msg = signup.validate()
    		self.assertTrue(valid)
    		self.assertIsInstance(msg, str)
    
    	def assert_validate_invalid(self, signup):
    		valid, msg = signup.validate()
    		self.assertFalse(valid)
    		self.assertIsInstance(msg, str)
    		self.assertNotEqual(msg, '')
    
    	def assert_finish_success(self, signup, password):
    		self.assertIsNone(signup.user)
    		user, msg = signup.finish(password)
    		db.session.commit()
    		self.assertIsNotNone(user)
    		self.assertIsInstance(msg, str)
    		self.assertIsNotNone(signup.user)
    
    	def assert_finish_failure(self, signup, password):
    		prev_id = signup.user_id
    		user, msg = signup.finish(password)
    		self.assertIsNone(user)
    		self.assertIsInstance(msg, str)
    		self.assertNotEqual(msg, '')
    		self.assertEqual(signup.user_id, prev_id)
    
    	def test_password(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com')
    
    Julian's avatar
    Julian committed
    		self.assertFalse(signup.password.verify('notsecret'))
    		self.assertFalse(signup.password.verify(''))
    		self.assertFalse(signup.password.verify('wrongpassword'))
    		self.assertTrue(signup.set_password('notsecret'))
    		self.assertTrue(signup.password.verify('notsecret'))
    		self.assertFalse(signup.password.verify('wrongpassword'))
    
    	def test_expired(self):
    		# TODO: Find a better way to test this!
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assertFalse(signup.expired)
    		signup.created = created=datetime.datetime.utcnow() - datetime.timedelta(hours=49)
    		self.assertTrue(signup.expired)
    
    	def test_completed(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assertFalse(signup.completed)
    		signup.finish('notsecret')
    		db.session.commit()
    		self.assertTrue(signup.completed)
    		signup = refetch_signup(signup)
    		self.assertTrue(signup.completed)
    
    	def test_validate(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_validate_valid(signup)
    		self.assert_validate_valid(refetch_signup(signup))
    
    	def test_validate_completed(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_finish_success(signup, 'notsecret')
    		self.assert_validate_invalid(signup)
    		self.assert_validate_invalid(refetch_signup(signup))
    
    	def test_validate_expired(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com',
    
    Julian's avatar
    Julian committed
    		                password='notsecret', created=datetime.datetime.utcnow()-datetime.timedelta(hours=49))
    		self.assert_validate_invalid(signup)
    		self.assert_validate_invalid(refetch_signup(signup))
    
    	def test_validate_loginname(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_validate_invalid(signup)
    		self.assert_validate_invalid(refetch_signup(signup))
    
    	def test_validate_displayname(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_validate_invalid(signup)
    		self.assert_validate_invalid(refetch_signup(signup))
    
    	def test_validate_mail(self):
    		signup = Signup(loginname='newuser', displayname='New User', mail='', password='notsecret')
    		self.assert_validate_invalid(signup)
    		self.assert_validate_invalid(refetch_signup(signup))
    
    	def test_validate_password(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com')
    
    Julian's avatar
    Julian committed
    		self.assertFalse(signup.set_password(''))
    		self.assert_validate_invalid(signup)
    		self.assert_validate_invalid(refetch_signup(signup))
    
    	def test_validate_exists(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='testuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_validate_invalid(signup)
    		self.assert_validate_invalid(refetch_signup(signup))
    
    	def test_finish(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_finish_success(signup, 'notsecret')
    		user = User.query.filter_by(loginname='newuser').one_or_none()
    		self.assertEqual(user.loginname, 'newuser')
    		self.assertEqual(user.displayname, 'New User')
    
    Julian's avatar
    Julian committed
    		self.assertEqual(user.primary_email.address, 'new@example.com')
    
    Julian's avatar
    Julian committed
    
    	def test_finish_completed(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_finish_success(signup, 'notsecret')
    		self.assert_finish_failure(refetch_signup(signup), 'notsecret')
    
    	def test_finish_expired(self):
    		# TODO: Find a better way to test this!
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com',
    
    Julian's avatar
    Julian committed
    		                password='notsecret', created=datetime.datetime.utcnow()-datetime.timedelta(hours=49))
    		self.assert_finish_failure(signup, 'notsecret')
    		self.assert_finish_failure(refetch_signup(signup), 'notsecret')
    
    	def test_finish_wrongpassword(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com')
    
    Julian's avatar
    Julian committed
    		self.assert_finish_failure(signup, '')
    		self.assert_finish_failure(signup, 'wrongpassword')
    		signup = refetch_signup(signup)
    		self.assert_finish_failure(signup, '')
    		self.assert_finish_failure(signup, 'wrongpassword')
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='newuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_finish_failure(signup, 'wrongpassword')
    		self.assert_finish_failure(refetch_signup(signup), 'wrongpassword')
    
    	def test_finish_duplicate(self):
    
    Julian's avatar
    Julian committed
    		signup = Signup(loginname='testuser', displayname='New User', mail='new@example.com', password='notsecret')
    
    Julian's avatar
    Julian committed
    		self.assert_finish_failure(signup, 'notsecret')
    		self.assert_finish_failure(refetch_signup(signup), 'notsecret')
    
    
    Julian's avatar
    Julian committed
    	def test_finish_duplicate_email_strict_uniqueness(self):
    		FeatureFlag.unique_email_addresses.enable()
    		db.session.commit()
    		signup = Signup(loginname='newuser', displayname='New User', mail='test@example.com', password='notsecret')
    		self.assert_finish_failure(signup, 'notsecret')
    
    
    Julian's avatar
    Julian committed
    	def test_duplicate(self):
    		signup = Signup(loginname='newuser', displayname='New User', mail='test1@example.com', password='notsecret')
    		self.assert_validate_valid(signup)
    		db.session.add(signup)
    		db.session.commit()
    		signup1_id = signup.id
    		signup = Signup(loginname='newuser', displayname='New User', mail='test2@example.com', password='notsecret')
    		self.assert_validate_valid(signup)
    		db.session.add(signup)
    		db.session.commit()
    		signup2_id = signup.id
    		db_flush()
    		signup = Signup.query.get(signup2_id)
    		self.assert_finish_success(signup, 'notsecret')
    		db.session.commit()
    		db_flush()
    		signup = Signup.query.get(signup1_id)
    		self.assert_finish_failure(signup, 'notsecret')
    		user = User.query.filter_by(loginname='newuser').one_or_none()
    		self.assertEqual(user.primary_email.address, 'test2@example.com')