Esempio n. 1
0
    def test_users(self):
        # add two users
        r = Role.query.filter_by(name='User').first()
        self.assertIsNotNone(r)
        u1 = User(email='*****@*****.**',
                  username='******',
                  password='******',
                  confirmed=True,
                  role=r)
        u2 = User(email='*****@*****.**',
                  username='******',
                  password='******',
                  confirmed=True,
                  role=r)
        db.session.add_all([u1, u2])
        db.session.commit()

        # get users
        response = self.client.get('/api/v1/users/{}'.format(u1.id),
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'dog'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertEqual(json_response['username'], 'john')
        response = self.client.get('/api/v1/users/{}'.format(u2.id),
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'dog'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertEqual(json_response['username'], 'susan')
Esempio n. 2
0
 def test_valid_email_change_token(self):
     u = User(email='*****@*****.**', password='******')
     db.session.add(u)
     db.session.commit()
     token = u.generate_email_change_token('*****@*****.**')
     self.assertTrue(u.change_email(token))
     self.assertTrue(u.email == '*****@*****.**')
Esempio n. 3
0
 def test_valid_reset_token(self):
     u = User(password='******')
     db.session.add(u)
     db.session.commit()
     token = u.generate_reset_token()
     self.assertTrue(User.reset_password(token, 'dog'))
     self.assertTrue(u.verify_password('dog'))
Esempio n. 4
0
 def test_invalid_reset_token(self):
     u = User(password='******')
     db.session.add(u)
     db.session.commit()
     token = u.generate_reset_token()
     self.assertFalse(User.reset_password(token + 'a', 'horse'))
     self.assertTrue(u.verify_password('cat'))
Esempio n. 5
0
 def test_expired_confirmation_token(self):
     u = User(password='******')
     db.session.add(u)
     db.session.commit()
     token = u.generate_confirmation_token(1)
     time.sleep(2)
     self.assertFalse(u.confirm(token))
Esempio n. 6
0
 def test_ping(self):
     u = User(password='******')
     db.session.add(u)
     db.session.commit()
     time.sleep(2)
     last_seen_before = u.last_seen
     u.ping()
     self.assertTrue(u.last_seen > last_seen_before)
Esempio n. 7
0
 def test_duplicate_email_change_token(self):
     u1 = User(email='*****@*****.**', password='******')
     u2 = User(email='*****@*****.**', password='******')
     db.session.add(u1)
     db.session.add(u2)
     db.session.commit()
     token = u2.generate_email_change_token('*****@*****.**')
     self.assertFalse(u2.change_email(token))
     self.assertTrue(u2.email == '*****@*****.**')
Esempio n. 8
0
 def test_to_json(self):
     u = User(email='*****@*****.**', password='******')
     db.session.add(u)
     db.session.commit()
     with self.app.test_request_context('/'):
         json_user = u.to_json()
     expected_keys = [
         'url', 'username', 'member_since', 'last_seen', 'posts_url',
         'followed_posts_url', 'post_count'
     ]
     self.assertEqual(sorted(json_user.keys()), sorted(expected_keys))
     self.assertEqual('/api/v1/users/' + str(u.id), json_user['url'])
Esempio n. 9
0
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(email=form.email.data,
                    name=form.username.data,
                    password=form.password.data)
        db.session.add(user)
        db.session.commit()
        token = user.generate_confirmation_token()
        send_email(user.email, 'Confirm Your Account',
                   'auth/email/confirm', user=user, token=token)
        flash('A confirmation email has been sent to you by email.')
        return redirect(url_for('auth.login'))
    return render_template('auth/register.html', form=form)
Esempio n. 10
0
 def test_timestamps(self):
     u = User(password='******')
     db.session.add(u)
     db.session.commit()
     self.assertTrue(
         (datetime.utcnow() - u.member_since).total_seconds() < 3)
     self.assertTrue((datetime.utcnow() - u.last_seen).total_seconds() < 3)
Esempio n. 11
0
    def test_token_auth(self):
        # add a user
        r = Role.query.filter_by(name='User').first()
        self.assertIsNotNone(r)
        u = User(email='*****@*****.**',
                 password='******',
                 confirmed=True,
                 role=r)
        db.session.add(u)
        db.session.commit()

        # issue a request with a bad token
        response = self.client.get('/api/v1/posts/',
                                   headers=self.get_api_headers(
                                       'bad-token', ''))
        self.assertEqual(response.status_code, 401)

        # get a token
        response = self.client.post('/api/v1/tokens/',
                                    headers=self.get_api_headers(
                                        '*****@*****.**', 'cat'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertIsNotNone(json_response.get('token'))
        token = json_response['token']

        # issue a request with the token
        response = self.client.get('/api/v1/posts/',
                                   headers=self.get_api_headers(token, ''))
        self.assertEqual(response.status_code, 200)
Esempio n. 12
0
 def test_user_role(self):
     u = User(email='*****@*****.**', password='******')
     self.assertTrue(u.can(Permission.FOLLOW))
     self.assertTrue(u.can(Permission.COMMENT))
     self.assertTrue(u.can(Permission.WRITE))
     self.assertFalse(u.can(Permission.MODERATE))
     self.assertFalse(u.can(Permission.ADMIN))
Esempio n. 13
0
 def test_administrator_role(self):
     r = Role.query.filter_by(name='Administrator').first()
     u = User(email='*****@*****.**', password='******', role=r)
     self.assertTrue(u.can(Permission.FOLLOW))
     self.assertTrue(u.can(Permission.COMMENT))
     self.assertTrue(u.can(Permission.WRITE))
     self.assertTrue(u.can(Permission.MODERATE))
     self.assertTrue(u.can(Permission.ADMIN))
Esempio n. 14
0
def password_reset(token):
    if not current_user.is_anonymous:
        return redirect(url_for('main.index'))
    form = PasswordResetForm()
    if form.validate_on_submit():
        if User.reset_password(token, form.password.data):
            db.session.commit()
            flash('Your password has been updated.')
            return redirect(url_for('auth.login'))
        else:
            return redirect(url_for('main.index'))
    return redirect('auth/reset_password.html', form=form)
Esempio n. 15
0
def verify_password(email_or_token, password):
    if not email_or_token:
        return False
    if password == "":
        g.current_user = User.verify_auth_token(email_or_token)
        g.token_used = True
        return g.current_user is not None
    user = User.query.filter_by(email=email_or_token).first()
    if not user:
        return False
    g.current_user = user
    g.token_used = False
    return user.verify_password(password)
Esempio n. 16
0
 def test_invalid_confirmation_token(self):
     u1 = User(password='******')
     u2 = User(password='******')
     db.session.add(u1)
     db.session.add(u2)
     db.session.commit()
     token = u1.generate_confirmation_token()
     self.assertFalse(u2.confirm(token))
Esempio n. 17
0
    def test_unconfirmed_account(self):
        # add an unconfirmed user
        r = Role.query.filter_by(name='User').first()
        self.assertIsNotNone(r)
        u = User(email='*****@*****.**',
                 password='******',
                 confirmed=False,
                 role=r)
        db.session.add(u)
        db.session.commit()

        # get list of posts with the unconfirmed account
        response = self.client.get('/api/v1/posts/',
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'cat'))
        self.assertEqual(response.status_code, 403)
Esempio n. 18
0
    def test_bad_auth(self):
        # add a user
        r = Role.query.filter_by(name='User').first()
        self.assertIsNotNone(r)
        u = User(email='*****@*****.**',
                 password='******',
                 confirmed=True,
                 role=r)
        db.session.add(u)
        db.session.commit()

        # authenticate with bad password
        response = self.client.get('/api/v1/posts/',
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'dog'))
        self.assertEqual(response.status_code, 401)
Esempio n. 19
0
 def test_gravatar(self):
     u = User(email='*****@*****.**', password='******')
     with self.app.test_request_context('/'):
         gravatar = u.gravatar()
         gravatar_256 = u.gravatar(size=256)
         gravatar_pg = u.gravatar(rating='pg')
         gravatar_retro = u.gravatar(default='retro')
     self.assertTrue('https://secure.gravatar.com/avatar/' +
                     'd4c74594d841139328695756648b6bd6' in gravatar)
     self.assertTrue('s=256' in gravatar_256)
     self.assertTrue('r=pg' in gravatar_pg)
     self.assertTrue('d=retro' in gravatar_retro)
Esempio n. 20
0
    def setUpClass(cls):
        # start Chrome
        options = webdriver.ChromeOptions()
        options.add_argument('headless')
        try:
            cls.client = webdriver.Chrome(chrome_options=options)
        except:
            pass

        # skip these tests if the browser could not be started
        if cls.client:
            # create the application
            cls.app = create_app('testing')
            cls.app_context = cls.app.app_context()
            cls.app_context.push()

            # suppress logging to keep unittest output clean
            import logging
            logger = logging.getLogger('werkzeug')
            logger.setLevel("ERROR")

            # create the database and populate with some fake data
            db.create_all()
            Role.insert_roles()
            fake.users(10)
            fake.posts(10)

            # add an administrator user
            admin_role = Role.query.filter_by(name='Administrator').first()
            admin = User(email='*****@*****.**',
                         name='john',
                         password='******',
                         role=admin_role,
                         confirmed=True)
            db.session.add(admin)
            db.session.commit()

            # start the Flask server in a thread
            cls.server_thread = threading.Thread(target=cls.app.run,
                                                 kwargs={'debug': False})
            cls.server_thread.start()

            # give the server a second to ensure it is up
            time.sleep(1)
Esempio n. 21
0
    def test_posts(self):
        # add a user
        r = Role.query.filter_by(name='User').first()
        self.assertIsNotNone(r)
        u = User(email='*****@*****.**',
                 password='******',
                 confirmed=True,
                 role=r)
        db.session.add(u)
        db.session.commit()

        # write an empty post
        response = self.client.post('/api/v1/posts/',
                                    headers=self.get_api_headers(
                                        '*****@*****.**', 'cat'),
                                    data=json.dumps({'body': ''}))
        self.assertEqual(response.status_code, 400)

        # write a post
        response = self.client.post(
            '/api/v1/posts/',
            headers=self.get_api_headers('*****@*****.**', 'cat'),
            data=json.dumps({'body': 'body of the *blog* post'}))
        self.assertEqual(response.status_code, 201)
        url = response.headers.get('Location')
        self.assertIsNotNone(url)

        # get the new post
        response = self.client.get(url,
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'cat'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertEqual('http://localhost' + json_response['url'], url)
        self.assertEqual(json_response['body'], 'body of the *blog* post')
        self.assertEqual(json_response['body_html'],
                         '<p>body of the <em>blog</em> post</p>')
        json_post = json_response

        # get the post from the user
        response = self.client.get('/api/v1/users/{}/posts/'.format(u.id),
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'cat'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertIsNotNone(json_response.get('posts'))
        self.assertEqual(json_response.get('count', 0), 1)
        self.assertEqual(json_response['posts'][0], json_post)

        # get the post from the user as a follower
        response = self.client.get('/api/v1/users/{}/timeline/'.format(u.id),
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'cat'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertIsNotNone(json_response.get('posts'))
        self.assertEqual(json_response.get('count', 0), 1)
        self.assertEqual(json_response['posts'][0], json_post)

        # edit post
        response = self.client.put(url,
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'cat'),
                                   data=json.dumps({'body': 'updated body'}))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertEqual('http://localhost' + json_response['url'], url)
        self.assertEqual(json_response['body'], 'updated body')
        self.assertEqual(json_response['body_html'], '<p>updated body</p>')
Esempio n. 22
0
 def test_follows(self):
     u1 = User(email='*****@*****.**', password='******')
     u2 = User(email='*****@*****.**', password='******')
     db.session.add(u1)
     db.session.add(u2)
     db.session.commit()
     self.assertFalse(u1.is_following(u2))
     self.assertFalse(u1.is_followed_by(u2))
     timestamp_before = datetime.utcnow()
     u1.follow(u2)
     db.session.add(u1)
     db.session.commit()
     timestamp_after = datetime.utcnow()
     self.assertTrue(u1.is_following(u2))
     self.assertFalse(u1.is_followed_by(u2))
     self.assertTrue(u2.is_followed_by(u1))
     self.assertTrue(u1.followed.count() == 1)
     self.assertTrue(u2.followers.count() == 1)
     f = u1.followed.all()[-1]
     self.assertTrue(f.followed == u2)
     self.assertTrue(timestamp_before <= f.timestamp <= timestamp_after)
     f = u2.followers.all()[-1]
     self.assertTrue(f.follower == u1)
     u1.unfollow(u2)
     db.session.add(u1)
     db.session.commit()
     self.assertTrue(u1.followed.count() == 0)
     self.assertTrue(u2.followers.count() == 0)
     self.assertTrue(Follow.query.count() == 0)
     u2.follow(u1)
     db.session.add(u1)
     db.session.add(u2)
     db.session.commit()
     db.session.delete(u2)
     db.session.commit()
     self.assertTrue(Follow.query.count() == 0)
Esempio n. 23
0
    def test_comments(self):
        # add two users
        r = Role.query.filter_by(name='User').first()
        self.assertIsNotNone(r)
        u1 = User(email='*****@*****.**',
                  username='******',
                  password='******',
                  confirmed=True,
                  role=r)
        u2 = User(email='*****@*****.**',
                  username='******',
                  password='******',
                  confirmed=True,
                  role=r)
        db.session.add_all([u1, u2])
        db.session.commit()

        # add a post
        post = Post(body='body of the post', author=u1)
        db.session.add(post)
        db.session.commit()

        # write a comment
        response = self.client.post(
            '/api/v1/posts/{}/comments/'.format(post.id),
            headers=self.get_api_headers('*****@*****.**', 'dog'),
            data=json.dumps({'body': 'Good [post](http://example.com)!'}))
        self.assertEqual(response.status_code, 201)
        json_response = json.loads(response.get_data(as_text=True))
        url = response.headers.get('Location')
        self.assertIsNotNone(url)
        self.assertEqual(json_response['body'],
                         'Good [post](http://example.com)!')
        self.assertEqual(re.sub('<.*?>', '', json_response['body_html']),
                         'Good post!')

        # get the new comment
        response = self.client.get(url,
                                   headers=self.get_api_headers(
                                       '*****@*****.**', 'cat'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertEqual('http://localhost' + json_response['url'], url)
        self.assertEqual(json_response['body'],
                         'Good [post](http://example.com)!')

        # add another comment
        comment = Comment(body='Thank you!', author=u1, post=post)
        db.session.add(comment)
        db.session.commit()

        # get the two comments from the post
        response = self.client.get(
            '/api/v1/posts/{}/comments/'.format(post.id),
            headers=self.get_api_headers('*****@*****.**', 'dog'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertIsNotNone(json_response.get('comments'))
        self.assertEqual(json_response.get('count', 0), 2)

        # get all the comments
        response = self.client.get(
            '/api/v1/posts/{}/comments/'.format(post.id),
            headers=self.get_api_headers('*****@*****.**', 'dog'))
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.get_data(as_text=True))
        self.assertIsNotNone(json_response.get('comments'))
        self.assertEqual(json_response.get('count', 0), 2)
Esempio n. 24
0
 def test_password_setter(self):
     user = User(password='******')
     self.assertTrue(user.password_hash is not None)
Esempio n. 25
0
 def test_no_password_getter(self):
     user = User(password='******')
     with self.assertRaises(AttributeError):
         print(user.password)
Esempio n. 26
0
 def test_valid_confirmation_token(self):
     u = User(password='******')
     db.session.add(u)
     db.session.commit()
     token = u.generate_confirmation_token()
     self.assertTrue(u.confirm(token))
Esempio n. 27
0
 def test_password_salts_are_random(self):
     user_1 = User(password='******')
     user_2 = User(password='******')
     self.assertTrue(user_1.password == user_2.password)
Esempio n. 28
0
 def test_password_verification(self):
     user = User(password='******')
     self.assertTrue(user.verify_password('cat'))
     self.assertFalse(user.verify_password('dog'))