API: init api w/ user management
This commit is contained in:
0
mpwo_api/mpwo_api/tests/__init__.py
Normal file
0
mpwo_api/mpwo_api/tests/__init__.py
Normal file
17
mpwo_api/mpwo_api/tests/base.py
Normal file
17
mpwo_api/mpwo_api/tests/base.py
Normal file
@ -0,0 +1,17 @@
|
||||
from flask_testing import TestCase
|
||||
|
||||
from mpwo_api import app, db
|
||||
|
||||
|
||||
class BaseTestCase(TestCase):
|
||||
def create_app(self):
|
||||
app.config.from_object('mpwo_api.config.TestingConfig')
|
||||
return app
|
||||
|
||||
def setUp(self):
|
||||
db.create_all()
|
||||
db.session.commit()
|
||||
|
||||
def tearDown(self):
|
||||
db.session.remove()
|
||||
db.drop_all()
|
192
mpwo_api/mpwo_api/tests/test_auth.py
Normal file
192
mpwo_api/mpwo_api/tests/test_auth.py
Normal file
@ -0,0 +1,192 @@
|
||||
import json
|
||||
import time
|
||||
|
||||
from mpwo_api.tests.base import BaseTestCase
|
||||
from mpwo_api.tests.utils import add_user
|
||||
|
||||
|
||||
class TestAuthBlueprint(BaseTestCase):
|
||||
|
||||
def test_user_registration(self):
|
||||
with self.client:
|
||||
response = self.client.post(
|
||||
'/api/auth/register',
|
||||
data=json.dumps(dict(
|
||||
username='justatest',
|
||||
email='test@test.com',
|
||||
password='123456'
|
||||
)),
|
||||
content_type='application/json'
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'success')
|
||||
self.assertTrue(data['message'] == 'Successfully registered.')
|
||||
self.assertTrue(data['auth_token'])
|
||||
self.assertTrue(response.content_type == 'application/json')
|
||||
self.assertEqual(response.status_code, 201)
|
||||
|
||||
def test_user_registration_user_already_exists(self):
|
||||
add_user('test', 'test@test.com', 'test')
|
||||
with self.client:
|
||||
response = self.client.post(
|
||||
'/api/auth/register',
|
||||
data=json.dumps(dict(
|
||||
username='test',
|
||||
email='test@test.com',
|
||||
password='test'
|
||||
)),
|
||||
content_type='application/json'
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'error')
|
||||
self.assertTrue(data['message'] == 'Sorry. That user already exists.')
|
||||
self.assertTrue(response.content_type == 'application/json')
|
||||
self.assertEqual(response.status_code, 400)
|
||||
|
||||
def test_user_registration_invalid_json(self):
|
||||
with self.client:
|
||||
response = self.client.post(
|
||||
'/api/auth/register',
|
||||
data=json.dumps(dict()),
|
||||
content_type='application/json'
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertEqual(response.status_code, 400)
|
||||
self.assertIn('Invalid payload.', data['message'])
|
||||
self.assertIn('error', data['status'])
|
||||
|
||||
def test_user_registration_invalid_json_keys_no_username(self):
|
||||
with self.client:
|
||||
response = self.client.post(
|
||||
'/api/auth/register',
|
||||
data=json.dumps(dict(email='test@test.com', password='test')),
|
||||
content_type='application/json',
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertEqual(response.status_code, 400)
|
||||
self.assertIn('Invalid payload.', data['message'])
|
||||
self.assertIn('error', data['status'])
|
||||
|
||||
def test_user_registration_invalid_json_keys_no_email(self):
|
||||
with self.client:
|
||||
response = self.client.post(
|
||||
'/api/auth/register',
|
||||
data=json.dumps(dict(
|
||||
username='test', password='test')),
|
||||
content_type='application/json',
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertEqual(response.status_code, 400)
|
||||
self.assertIn('Invalid payload.', data['message'])
|
||||
self.assertIn('error', data['status'])
|
||||
|
||||
def test_user_registration_invalid_json_keys_no_password(self):
|
||||
with self.client:
|
||||
response = self.client.post(
|
||||
'/api/auth/register',
|
||||
data=json.dumps(dict(
|
||||
username='test', email='test@test.com')),
|
||||
content_type='application/json',
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertEqual(response.status_code, 400)
|
||||
self.assertIn('Invalid payload.', data['message'])
|
||||
self.assertIn('error', data['status'])
|
||||
|
||||
def test_registered_user_login(self):
|
||||
with self.client:
|
||||
add_user('test', 'test@test.com', 'test')
|
||||
response = self.client.post(
|
||||
'/api/auth/login',
|
||||
data=json.dumps(dict(
|
||||
email='test@test.com',
|
||||
password='test'
|
||||
)),
|
||||
content_type='application/json'
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'success')
|
||||
self.assertTrue(data['message'] == 'Successfully logged in.')
|
||||
self.assertTrue(data['auth_token'])
|
||||
self.assertTrue(response.content_type == 'application/json')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_no_registered_user_login(self):
|
||||
with self.client:
|
||||
response = self.client.post(
|
||||
'/api/auth/login',
|
||||
data=json.dumps(dict(
|
||||
email='test@test.com',
|
||||
password='test'
|
||||
)),
|
||||
content_type='application/json'
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'error')
|
||||
self.assertTrue(data['message'] == 'User does not exist.')
|
||||
self.assertTrue(response.content_type == 'application/json')
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
def test_valid_logout(self):
|
||||
add_user('test', 'test@test.com', 'test')
|
||||
with self.client:
|
||||
# user login
|
||||
resp_login = self.client.post(
|
||||
'/api/auth/login',
|
||||
data=json.dumps(dict(
|
||||
email='test@test.com',
|
||||
password='test'
|
||||
)),
|
||||
content_type='application/json'
|
||||
)
|
||||
# valid token logout
|
||||
response = self.client.get(
|
||||
'/api/auth/logout',
|
||||
headers=dict(
|
||||
Authorization='Bearer ' + json.loads(
|
||||
resp_login.data.decode()
|
||||
)['auth_token']
|
||||
)
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'success')
|
||||
self.assertTrue(data['message'] == 'Successfully logged out.')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_invalid_logout_expired_token(self):
|
||||
add_user('test', 'test@test.com', 'test')
|
||||
with self.client:
|
||||
resp_login = self.client.post(
|
||||
'/api/auth/login',
|
||||
data=json.dumps(dict(
|
||||
email='test@test.com',
|
||||
password='test'
|
||||
)),
|
||||
content_type='application/json'
|
||||
)
|
||||
# invalid token logout
|
||||
time.sleep(4)
|
||||
response = self.client.get(
|
||||
'/api/auth/logout',
|
||||
headers=dict(
|
||||
Authorization='Bearer ' + json.loads(
|
||||
resp_login.data.decode()
|
||||
)['auth_token']
|
||||
)
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'error')
|
||||
self.assertTrue(
|
||||
data['message'] == 'Signature expired. Please log in again.')
|
||||
self.assertEqual(response.status_code, 401)
|
||||
|
||||
def test_invalid_logout(self):
|
||||
with self.client:
|
||||
response = self.client.get(
|
||||
'/api/auth/logout',
|
||||
headers=dict(Authorization='Bearer invalid'))
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'error')
|
||||
self.assertTrue(
|
||||
data['message'] == 'Invalid token. Please log in again.')
|
||||
self.assertEqual(response.status_code, 401)
|
83
mpwo_api/mpwo_api/tests/test_users.py
Normal file
83
mpwo_api/mpwo_api/tests/test_users.py
Normal file
@ -0,0 +1,83 @@
|
||||
import json
|
||||
|
||||
from mpwo_api.tests.base import BaseTestCase
|
||||
from mpwo_api.users.models import User
|
||||
from mpwo_api.tests.utils import add_user
|
||||
|
||||
|
||||
class TestUserService(BaseTestCase):
|
||||
"""Tests for the Users Service."""
|
||||
|
||||
def test_users(self):
|
||||
""" => Ensure the /ping route behaves correctly."""
|
||||
response = self.client.get('/api/ping')
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn('pong!', data['message'])
|
||||
self.assertIn('success', data['status'])
|
||||
|
||||
def test_single_user(self):
|
||||
"""=> Get single user details"""
|
||||
user = add_user('test', 'test@test.com', 'test')
|
||||
|
||||
with self.client:
|
||||
response = self.client.get(f'/api/users/{user.id}')
|
||||
data = json.loads(response.data.decode())
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn('success', data['status'])
|
||||
|
||||
self.assertTrue('created_at' in data['data'])
|
||||
self.assertIn('test', data['data']['username'])
|
||||
self.assertIn('test@test.com', data['data']['email'])
|
||||
|
||||
def test_single_user_no_id(self):
|
||||
"""=> Ensure error is thrown if an id is not provided."""
|
||||
with self.client:
|
||||
response = self.client.get(f'/api/users/blah')
|
||||
data = json.loads(response.data.decode())
|
||||
|
||||
self.assertEqual(response.status_code, 404)
|
||||
self.assertIn('fail', data['status'])
|
||||
self.assertIn('User does not exist', data['message'])
|
||||
|
||||
def test_single_user_wrong_id(self):
|
||||
"""=> Ensure error is thrown if the id does not exist."""
|
||||
with self.client:
|
||||
response = self.client.get(f'/api/users/99999999999')
|
||||
data = json.loads(response.data.decode())
|
||||
|
||||
self.assertEqual(response.status_code, 404)
|
||||
self.assertIn('fail', data['status'])
|
||||
self.assertIn('User does not exist', data['message'])
|
||||
|
||||
def test_users_list(self):
|
||||
"""=> Ensure get single user behaves correctly."""
|
||||
add_user('test', 'test@test.com', 'test')
|
||||
add_user('toto', 'toto@toto.com', 'toto')
|
||||
with self.client:
|
||||
response = self.client.get('/api/users')
|
||||
data = json.loads(response.data.decode())
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn('success', data['status'])
|
||||
|
||||
self.assertEqual(len(data['data']['users']), 2)
|
||||
self.assertTrue('created_at' in data['data']['users'][0])
|
||||
self.assertTrue('created_at' in data['data']['users'][1])
|
||||
self.assertIn('test', data['data']['users'][0]['username'])
|
||||
self.assertIn('toto', data['data']['users'][1]['username'])
|
||||
self.assertIn('test@test.com', data['data']['users'][0]['email'])
|
||||
self.assertIn('toto@toto.com', data['data']['users'][1]['email'])
|
||||
|
||||
def test_encode_auth_token(self):
|
||||
"""=> Ensure correct auth token generation"""
|
||||
user = add_user('test', 'test@test.com', 'test')
|
||||
auth_token = user.encode_auth_token(user.id)
|
||||
self.assertTrue(isinstance(auth_token, bytes))
|
||||
|
||||
def test_decode_auth_token(self):
|
||||
user = add_user('test', 'test@test.com', 'test')
|
||||
auth_token = user.encode_auth_token(user.id)
|
||||
self.assertTrue(isinstance(auth_token, bytes))
|
||||
self.assertTrue(User.decode_auth_token(auth_token), user.id)
|
9
mpwo_api/mpwo_api/tests/utils.py
Normal file
9
mpwo_api/mpwo_api/tests/utils.py
Normal file
@ -0,0 +1,9 @@
|
||||
from mpwo_api.users.models import User
|
||||
from mpwo_api import db
|
||||
|
||||
|
||||
def add_user(username, email, password):
|
||||
user = User(username=username, email=email, password=password)
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
return user
|
Reference in New Issue
Block a user