-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_user_model.py
137 lines (101 loc) · 3.87 KB
/
test_user_model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
"""User model tests."""
# run these tests like:
#
# python -m unittest test_user_model.py
from app import app
import os
from unittest import TestCase
from sqlalchemy.exc import IntegrityError
from flask_bcrypt import Bcrypt
from models import db, User, Message, Follows, DEFAULT_IMAGE_URL
# BEFORE we import our app, let's set an environmental variable
# to use a different database for tests (we need to do this
# before we import our app, since that will have already
# connected to the database
os.environ['DATABASE_URL'] = "postgresql:///warbler_test"
# Now we can import app
# Create our tables (we do this here, so we only create the tables
# once for all tests --- in each test, we'll delete the data
# and create fresh new clean test data
db.drop_all()
db.create_all()
bcrypt = Bcrypt()
class UserModelTestCase(TestCase):
def setUp(self):
User.query.delete()
u1 = User.signup("u1", "[email protected]", "password", None)
u2 = User.signup("u2", "[email protected]", "password", None)
db.session.commit()
self.u1_id = u1.id
self.u2_id = u2.id
self.client = app.test_client()
def tearDown(self):
db.session.rollback()
def test_user_model(self):
u1 = User.query.get(self.u1_id)
# User should have no messages & no followers
self.assertEqual(len(u1.messages), 0)
self.assertEqual(len(u1.followers), 0)
def test_is_following(self):
u1 = User.query.get(self.u1_id)
u2 = User.query.get(self.u2_id)
# checking if user 1 is not following user 2
self.assertEqual(u1.is_following(u2), False)
# checking if user 1 is following user 2
u1.following.append(u2)
db.session.commit()
self.assertEqual(u1.is_following(u2), True)
def test_is_followed_by(self):
u1 = User.query.get(self.u1_id)
u2 = User.query.get(self.u2_id)
# Checking if user 1 is not followed by user 2
self.assertEqual(u1.is_followed_by(u2), False)
# Checking if user 1 is followed by user 2
u1.followers.append(u2)
db.session.commit()
self.assertEqual(u1.is_followed_by(u2), True)
def test_signup_success(self):
u3 = User.signup(
username="kevin",
email="[email protected]",
password="123456",
image_url="",
)
db.session.add(u3)
db.session.commit()
# Checking valid user attributes and user creation
self.assertIsInstance(u3, User)
self.assertEqual(u3.username, "kevin")
self.assertEqual(u3.email, "[email protected]")
self.assertEqual(u3.image_url, DEFAULT_IMAGE_URL)
# Test for whether hashed password matches for login
self.assertTrue(bcrypt.check_password_hash(u3.password,"123456"))
def test_signup_failure(self):
u3 = User.signup(
username="kevin",
email="[email protected]",
password="123456",
image_url="",
)
u4 = User.signup(
username="",
email="[email protected]",
password="password",
)
# Test fail conditions
self.assertNotEqual(u3.email, "[email protected]")
self.assertRaises(TypeError, u4)
with self.assertRaises(IntegrityError):
u5 = User.signup(
username="kevin",
email="[email protected]",
password="123456",
image_url="",
)
db.session.add(u5)
db.session.commit()
def test_authenticate_returns_user_given_valid_details(self):
self.assertIsInstance(User.authenticate("u1", "password"), User)
def test_authenticate_fails_given_invalid_details(self):
self.assertEqual(User.authenticate("wrong_username", "password"), False)
self.assertEqual(User.authenticate("u1", "wrong_password"), False)