Unit Tests¶
Flask-Philo-Core provides support for unit testing through the library pytest.
Writing Unit Tests with Flask-Philo-Core¶
The class flask_philo_core.test.FlaskPhiloTestCase provides common
functionality to implement unit testing in your application.
E.g.
from flask_philo_core.views import BaseView
from flask_philo_core.test import FlaskPhiloTestCase, BaseTestFactory
from flask import json
class SimpleView(BaseView):
def get(self):
return self.json_response(data={'msg': 'ok'})
class SimpleCorsView(BaseView):
def get(self):
return self.json_response(data={'msg': 'ok-cors'})
URLS = (
('/', SimpleView, 'home'),
('/cors-api/test-cors', SimpleCorsView, 'cors'),
)
class TestViews(FlaskPhiloTestCase):
def test_urls(self):
app = BaseTestFactory.create_test_app()
assert 'URLS' not in app.config
rules = [r for r in app.url_map.iter_rules()]
endpoints = [rl.endpoint for rl in rules]
assert 1 == len(endpoints)
assert 'static' in endpoints
app = BaseTestFactory.create_test_app(urls=URLS)
assert 'URLS' in app.config
rules2 = [r for r in app.url_map.iter_rules()]
endpoints2 = [rl.endpoint for rl in rules2]
assert 3 == len(endpoints2)
assert 'cors' in endpoints2
assert 'static' in endpoints2
assert 'home' in endpoints2
def test_simple_view(self):
app = BaseTestFactory.create_test_app(urls=URLS)
client = app.test_client()
result = client.get('/')
assert 200 == result.status_code
j_content = json.loads(result.get_data().decode('utf-8'))
assert 'msg' in j_content
assert 'ok' == j_content['msg']
Mocking Configuration¶
We use the unittest.mock library to mock the Flask-Philo-Core configuration object.
The following example shows how to use the
flask_philo_core.test.BaseTestFactory.create_test_app function to create a
Flask-Philo-Core application for unit testing:
def test_cors(self):
config = {}
config['CORS'] = {
r"/cors-api/*": {"origins": "FLASK_PHILO_CORE_TEST_CORS"}}
app = BaseTestFactory.create_test_app(config=config, urls=URLS)
client = app.test_client()
result = client.get('/cors-api/test-cors')
assert 'Access-Control-Allow-Origin' in result.headers
cors_val = result.headers['Access-Control-Allow-Origin']
assert 'FLASK_PHILO_CORE_TEST_CORS' == cors_val
assert 200 == result.status_code
j_content = json.loads(result.get_data().decode('utf-8'))
assert 'msg' in j_content
assert 'ok-cors' == j_content['msg']
The flask_philo_core.test.BaseTestFactory.create_test_app function expects
two optional parameters:
- config: dictionary with the configuration options to mock.
- URLS: tuple to mock the
urls.pyfile.
Running Unit Tests¶
To run all Unit Tests for a Flask-Philo-Core app, use the following console command:
flask-philo test
To execute only the Unit Tests from one source file, use the --q <test_source.py> argument:
flask-philo test --q tests/test_db.py
To execute only the tests from one class :
flask-philo test --q tests/test_db.py::TestDBAccess
To execute a single specific unit test :
flask-philo test --q tests/test_db.py::TestDBAccess::test_create_index