|
# -*- coding: utf-8 -*-
|
|
from flask import url_for
|
|
|
|
from phshare.models import User
|
|
from phshare.settings import Operations
|
|
from phshare.utils import generate_token
|
|
from tests.base import BaseTestCase
|
|
|
|
|
|
class AuthTestCase(BaseTestCase):
|
|
|
|
def test_login_normal_user(self):
|
|
response = self.login()
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Login success.', data)
|
|
|
|
def test_login_locked_user(self):
|
|
self.login(email='locked@helloflask.com', password='123')
|
|
response = self.client.get(url_for('user.index', username='locked'))
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Your account is locked.', data)
|
|
|
|
def test_login_blocked_user(self):
|
|
response = self.login(email='blocked@helloflask.com', password='123')
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Your account is blocked.', data)
|
|
|
|
def test_fail_login(self):
|
|
response = self.login(email='wrong-username@helloflask.com', password='wrong-password')
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Invalid email or password.', data)
|
|
|
|
def test_logout_user(self):
|
|
self.login()
|
|
response = self.logout()
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Logout success.', data)
|
|
|
|
def test_login_protect(self):
|
|
response = self.client.get(url_for('main.upload'), follow_redirects=True)
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Please log in to access this page.', data)
|
|
|
|
def test_unconfirmed_user_permission(self):
|
|
self.login(email='unconfirmed@helloflask.com', password='123')
|
|
response = self.client.get(url_for('main.upload'), follow_redirects=True)
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Please confirm your account first.', data)
|
|
|
|
def test_locked_user_permission(self):
|
|
self.login(email='locked@helloflask.com', password='123')
|
|
response = self.client.get(url_for('main.upload'), follow_redirects=True)
|
|
self.assertEqual(response.status_code, 403)
|
|
|
|
def test_register_account(self):
|
|
response = self.client.post(url_for('auth.register'), data=dict(
|
|
name='swz',
|
|
email='test@helloflask.com',
|
|
username='test',
|
|
password='12345678',
|
|
password2='12345678'
|
|
), follow_redirects=True)
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Confirm email sent, check your inbox.', data)
|
|
|
|
def test_confirm_account(self):
|
|
user = User.query.filter_by(email='unconfirmed@helloflask.com').first()
|
|
self.assertFalse(user.confirmed)
|
|
token = generate_token(user=user, operation='confirm')
|
|
self.login(email='unconfirmed@helloflask.com', password='123')
|
|
response = self.client.get(url_for('auth.confirm', token=token), follow_redirects=True)
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Account confirmed.', data)
|
|
self.assertTrue(user.confirmed)
|
|
|
|
def test_bad_confirm_token(self):
|
|
self.login(email='unconfirmed@helloflask.com', password='123')
|
|
response = self.client.get(url_for('auth.confirm', token='bad token'), follow_redirects=True)
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Invalid or expired token.', data)
|
|
self.assertNotIn('Account confirmed.', data)
|
|
|
|
def test_reset_password(self):
|
|
response = self.client.post(url_for('auth.forget_password'), data=dict(
|
|
email='normal@helloflask.com',
|
|
), follow_redirects=True)
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Password reset email sent, check your inbox.', data)
|
|
user = User.query.filter_by(email='normal@helloflask.com').first()
|
|
self.assertTrue(user.validate_password('123'))
|
|
|
|
token = generate_token(user=user, operation=Operations.RESET_PASSWORD)
|
|
response = self.client.post(url_for('auth.reset_password', token=token), data=dict(
|
|
email='normal@helloflask.com',
|
|
password='new-password',
|
|
password2='new-password'
|
|
), follow_redirects=True)
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Password updated.', data)
|
|
self.assertTrue(user.validate_password('new-password'))
|
|
self.assertFalse(user.validate_password('123'))
|
|
|
|
# bad token
|
|
response = self.client.post(url_for('auth.reset_password', token='bad token'), data=dict(
|
|
email='normal@helloflask.com',
|
|
password='new-password',
|
|
password2='new-password'
|
|
), follow_redirects=True)
|
|
data = response.get_data(as_text=True)
|
|
self.assertIn('Invalid or expired link.', data)
|
|
self.assertNotIn('Password updated.', data)
|