|  |  |  | @@ -2,4 +2,94 @@ import os | 
		
	
		
			
				|  |  |  |  | os.environ['DATABASE_URL'] = 'sqlite://' | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | from datetime import datetime, timezone, timedelta | 
		
	
		
			
				|  |  |  |  | import unittest | 
		
	
		
			
				|  |  |  |  | from app import app, db | 
		
	
		
			
				|  |  |  |  | from app.models import User, Post | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | class UserModelCase(unittest.TestCase): | 
		
	
		
			
				|  |  |  |  |     def setUp(self): | 
		
	
		
			
				|  |  |  |  |         self.app_context = app.app_context() | 
		
	
		
			
				|  |  |  |  |         self.app_context.push() | 
		
	
		
			
				|  |  |  |  |         db.create_all() | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     def tearDown(self): | 
		
	
		
			
				|  |  |  |  |         db.session.remove() | 
		
	
		
			
				|  |  |  |  |         db.drop_all() | 
		
	
		
			
				|  |  |  |  |         self.app_context.pop() | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     def test_password_hashing(self): | 
		
	
		
			
				|  |  |  |  |         u = User(username='susan', email='susan@example.com') | 
		
	
		
			
				|  |  |  |  |         u.set_password('cat') | 
		
	
		
			
				|  |  |  |  |         self.assertFalse(u.check_password('dog')) | 
		
	
		
			
				|  |  |  |  |         self.assertTrue(u.check_password('cat')) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     def test_follow(self): | 
		
	
		
			
				|  |  |  |  |         u1 = User(username='john', email='john@example.com') | 
		
	
		
			
				|  |  |  |  |         u2 = User(username='susan', email='susan@example.com') | 
		
	
		
			
				|  |  |  |  |         db.session.add(u1) | 
		
	
		
			
				|  |  |  |  |         db.session.add(u2) | 
		
	
		
			
				|  |  |  |  |         db.session.commit() | 
		
	
		
			
				|  |  |  |  |         following = db.session.scalars(u1.following.select()).all() | 
		
	
		
			
				|  |  |  |  |         followers = db.session.scalars(u2.followers.select()).all() | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(following, []) | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(followers, []) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         u1.follow(u2) | 
		
	
		
			
				|  |  |  |  |         db.session.commit() | 
		
	
		
			
				|  |  |  |  |         self.assertTrue(u1.is_following(u2)) | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(u1.following_count(), 1) | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(u2.followers_count(), 1) | 
		
	
		
			
				|  |  |  |  |         u1_following = db.session.scalars(u1.following.select()).all() | 
		
	
		
			
				|  |  |  |  |         u2_followers = db.session.scalars(u2.followers.select()).all() | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(u1_following[0].username, 'susan') | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(u2_followers[0].username, 'john') | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         u1.unfollow(u2) | 
		
	
		
			
				|  |  |  |  |         db.session.commit() | 
		
	
		
			
				|  |  |  |  |         self.assertFalse(u1.is_following(u2)) | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(u1.following_count(), 0) | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(u2.followers_count(), 0) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     def test_follow_posts(self): | 
		
	
		
			
				|  |  |  |  |         # create four users | 
		
	
		
			
				|  |  |  |  |         u1 = User(username='john', email='john@example.com') | 
		
	
		
			
				|  |  |  |  |         u2 = User(username='susan', email='susan@example.com') | 
		
	
		
			
				|  |  |  |  |         u3 = User(username='mary', email='mary@example.com') | 
		
	
		
			
				|  |  |  |  |         u4 = User(username='david', email='david@example.com') | 
		
	
		
			
				|  |  |  |  |         db.session.add_all([u1, u2, u3, u4]) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         # create four posts | 
		
	
		
			
				|  |  |  |  |         now = datetime.now(timezone.utc) | 
		
	
		
			
				|  |  |  |  |         p1 = Post(body="post from john", author=u1, | 
		
	
		
			
				|  |  |  |  |                   timestamp=now + timedelta(seconds=1)) | 
		
	
		
			
				|  |  |  |  |         p2 = Post(body="post from susan", author=u2, | 
		
	
		
			
				|  |  |  |  |                   timestamp=now + timedelta(seconds=4)) | 
		
	
		
			
				|  |  |  |  |         p3 = Post(body="post from mary", author=u3, | 
		
	
		
			
				|  |  |  |  |                   timestamp=now + timedelta(seconds=3)) | 
		
	
		
			
				|  |  |  |  |         p4 = Post(body="post from david", author=u4, | 
		
	
		
			
				|  |  |  |  |                   timestamp=now + timedelta(seconds=2)) | 
		
	
		
			
				|  |  |  |  |         db.session.add_all([p1, p2, p3, p4]) | 
		
	
		
			
				|  |  |  |  |         db.session.commit() | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         # setup the followers | 
		
	
		
			
				|  |  |  |  |         u1.follow(u2)  # john follows susan | 
		
	
		
			
				|  |  |  |  |         u1.follow(u4)  # john follows david | 
		
	
		
			
				|  |  |  |  |         u2.follow(u3)  # susan follows mary | 
		
	
		
			
				|  |  |  |  |         u3.follow(u4)  # mary follows david | 
		
	
		
			
				|  |  |  |  |         db.session.commit() | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         # check the following posts of each user | 
		
	
		
			
				|  |  |  |  |         f1 = db.session.scalars(u1.following_posts()).all() | 
		
	
		
			
				|  |  |  |  |         f2 = db.session.scalars(u2.following_posts()).all() | 
		
	
		
			
				|  |  |  |  |         f3 = db.session.scalars(u3.following_posts()).all() | 
		
	
		
			
				|  |  |  |  |         f4 = db.session.scalars(u4.following_posts()).all() | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(f1, [p2, p4, p1]) | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(f2, [p2, p3]) | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(f3, [p3, p4]) | 
		
	
		
			
				|  |  |  |  |         self.assertEqual(f4, [p4]) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | if __name__ == '__main__': | 
		
	
		
			
				|  |  |  |  |     unittest.main(verbosity=2) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					| 
							
							
							
						 |  |  |   |