Skip to content

Commit

Permalink
Added following
Browse files Browse the repository at this point in the history
added unfollowing
added followed posts
added unit tests for User
  • Loading branch information
JayKayAce committed Jul 13, 2019
1 parent 081f8ef commit f079e23
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 2 deletions.
2 changes: 0 additions & 2 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
"module": "flask",
"env": {
"FLASK_APP": "dvdcollection.py",
"MAIL_SERVER":"localhost",
"MAIL_PORT":8025
},
"args": [
"run",
Expand Down
Binary file modified app.db
Binary file not shown.
24 changes: 24 additions & 0 deletions app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,30 @@ def avatar(self, size):
backref = db.backref("followers", lazy = "dynamic"), lazy="dynamic"
)

def follow(self, user):
if not self.is_following(user):
self.followed.append(user)

def unfollow(self, user):
if self.is_following(user):
self.followed.remove(user)

def is_following(self, user):
return self.followed.filter(
followers.c.followed_id == user.id ).count() > 0

def followed_posts(self):
followed = Post.query.join(
followers, (followers.c.followed_id == Post.user_id )
).filter(
followers.c.follower_id == self.id
)

own = Post.query.filter_by(user_id = self.id)
return followed.union(own).order_by(
Post.timestamp.desc()
)



class Post(db.Model):
Expand Down
87 changes: 87 additions & 0 deletions app/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
from datetime import datetime, timedelta
import unittest

from app import app, db
from app.models import User, Post


class UserModelCase(unittest.TestCase):
def setUp(self):
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://"
db.create_all()

def tearDown(self):
db.session.remove()
db.drop_all()

def test_password_hashing(self):
u = User(username="susan")
u.set_password("cat")
self.assertFalse(u.check_password("dog"))
self.assertTrue(u.check_password("cat"))

def test_avatar(self):
u = User(username = "john", email = "[email protected]")
self.assertEqual(u.avatar(128),('https://www.gravatar.com/avatar/'
'd4c74594d841139328695756648b6bd6'
'?d=identicon&s=128'))

def test_follow(self):
u1 = User(username = "john", email = "[email protected]")
u2 = User(username = "susan", email = "[email protected]")
db.session.add(u1)
db.session.add(u2)
db.session.commit()
self.assertEqual(u1.followed.all(), [])
self.assertEqual(u2.followed.all(), [])

u1.follow(u2)
db.session.commit()
self.assertTrue(u1.is_following(u2))
self.assertEqual(u1.followed.count(), 1)
self.assertEqual(u1.followed.first().username, "susan")
self.assertEqual(u2.followers.count(), 1)
self.assertEqual(u2.followers.first().username, "john")

u1.unfollow(u2)
db.session.commit()
self.assertFalse(u1.is_following(u2))
self.assertEqual(u1.followed.count(), 0)
self.assertEqual(u2.followers.count(), 0)

def test_follow_posts(self):
u1 = User(username = "john", email = "[email protected]")
u2 = User(username = "susan", email = "[email protected]")
u3 = User(username = "mary", email = "[email protected]")
u4 = User(username = "david", email = "[email protected]")
db.session.add_all([u1, u2, u3, u4])

# Create four posts
now = datetime.utcnow()
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])

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()

f1 = u1.followed_posts().all()
f2 = u2.followed_posts().all()
f3 = u3.followed_posts().all()
f4 = u4.followed_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)

0 comments on commit f079e23

Please sign in to comment.