X-Git-Url: http://git.datanom.net/flask-test.git/blobdiff_plain/db4f0ba9d4aec596f179335f1d86b3dd2bb206c6..163c4d87c8cefd45e8c8836daa28c53956be1e1a:/tests.py diff --git a/tests.py b/tests.py new file mode 100755 index 0000000..51c7389 --- /dev/null +++ b/tests.py @@ -0,0 +1,176 @@ +#!flask/bin/python +# -*- coding: utf8 -*- + +from coverage import coverage +cov = coverage(branch=True, omit=['flask/*', 'tests.py']) +cov.start() + +import os +import unittest +from datetime import datetime, timedelta + +from config import basedir +from app import app, db +from app.models import User, Post + +class TestCase(unittest.TestCase): + def setUp(self): + app.config['TESTING'] = True + app.config['WTF_CSRF_ENABLED'] = False + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + \ + os.path.join(basedir, 'test.db') + db.create_all() + + def tearDown(self): + db.session.remove() + db.drop_all() + + def test_user(self): + # make valid nicknames + n = User.make_valid_nickname('John_123') + assert n == 'John_123' + n = User.make_valid_nickname('John_[123]\n') + assert n == 'John_123' + # create a user + u = User(nickname='john', email='john@example.com') + db.session.add(u) + db.session.commit() + assert u.is_authenticated is True + assert u.is_active is True + assert u.is_anonymous is False + assert u.id == int(u.get_id()) + + def test_avatar(self): + # create a user + u = User(nickname='john', email='john@example.com') + avatar = u.avatar(128) + expected = 'http://www.gravatar.com/avatar/' + \ + 'd4c74594d841139328695756648b6bd6' + assert avatar[0:len(expected)] == expected + + def test_make_unique_nickname(self): + # create a user and write it to the database + u = User(nickname='john', email='john@example.com') + db.session.add(u) + db.session.commit() + nickname = User.make_unique_nickname('susan') + assert nickname == 'susan' + nickname = User.make_unique_nickname('john') + assert nickname != 'john' + # make another user with the new nickname + u = User(nickname=nickname, email='susan@example.com') + db.session.add(u) + db.session.commit() + nickname2 = User.make_unique_nickname('john') + assert nickname2 != 'john' + assert nickname2 != nickname + + def test_follow(self): + u1 = User(nickname='john', email='john@example.com') + u2 = User(nickname='susan', email='susan@example.com') + db.session.add(u1) + db.session.add(u2) + db.session.commit() + assert u1.unfollow(u2) is None + u = u1.follow(u2) + db.session.add(u) + db.session.commit() + assert u1.follow(u2) is None + assert u1.is_following(u2) + assert u1.followed.count() == 1 + assert u1.followed.first().nickname == 'susan' + assert u2.followers.count() == 1 + assert u2.followers.first().nickname == 'john' + u = u1.unfollow(u2) + assert u is not None + db.session.add(u) + db.session.commit() + assert not u1.is_following(u2) + assert u1.followed.count() == 0 + assert u2.followers.count() == 0 + + def test_follow_posts(self): + # make four users + u1 = User(nickname='john', email='john@example.com') + u2 = User(nickname='susan', email='susan@example.com') + u3 = User(nickname='mary', email='mary@example.com') + u4 = User(nickname='david', email='david@example.com') + db.session.add(u1) + db.session.add(u2) + db.session.add(u3) + db.session.add(u4) + # make four posts + utcnow = datetime.utcnow() + p1 = Post(body="post from john", author=u1, + timestamp=utcnow + timedelta(seconds=1)) + p2 = Post(body="post from susan", author=u2, + timestamp=utcnow + timedelta(seconds=2)) + p3 = Post(body="post from mary", author=u3, + timestamp=utcnow + timedelta(seconds=3)) + p4 = Post(body="post from david", author=u4, + timestamp=utcnow + timedelta(seconds=4)) + db.session.add(p1) + db.session.add(p2) + db.session.add(p3) + db.session.add(p4) + db.session.commit() + # setup the followers + u1.follow(u1) # john follows himself + u1.follow(u2) # john follows susan + u1.follow(u4) # john follows david + u2.follow(u2) # susan follows herself + u2.follow(u3) # susan follows mary + u3.follow(u3) # mary follows herself + u3.follow(u4) # mary follows david + u4.follow(u4) # david follows himself + db.session.add(u1) + db.session.add(u2) + db.session.add(u3) + db.session.add(u4) + db.session.commit() + # check the followed posts of each user + f1 = u1.followed_posts().all() + f2 = u2.followed_posts().all() + f3 = u3.followed_posts().all() + f4 = u4.followed_posts().all() + assert len(f1) == 3 + assert len(f2) == 2 + assert len(f3) == 2 + assert len(f4) == 1 + assert f1[0].id == p4.id + assert f1[1].id == p2.id + assert f1[2].id == p1.id + assert f2[0].id == p3.id + assert f2[1].id == p2.id + assert f3[0].id == p4.id + assert f3[1].id == p3.id + assert f4[0].id == p4.id + + def test_delete_post(self): + # create a user and a post + u = User(nickname='john', email='john@example.com') + p = Post(body='test post', author=u, timestamp=datetime.utcnow()) + db.session.add(u) + db.session.add(p) + db.session.commit() + # query the post and destroy the session + p = Post.query.get(1) + db.session.remove() + # delete the post using a new session + db.session = db.create_scoped_session() + db.session.delete(p) + db.session.commit() + +if __name__ == '__main__': + try: + unittest.main() + except: + pass + cov.stop() + cov.save() + print ("\n\nCoverage Report:\n") + cov.report() + s = "\nHTML version: " + os.path.join(basedir, "tmp/coverage/index.html") + print(s) + cov.html_report(directory='tmp/coverage') + cov.erase()