Skip to content
Snippets Groups Projects
Verified Commit a013bb51 authored by David Beniamine's avatar David Beniamine
Browse files

Working test with fixtures

parent 58fea514
Branches
No related tags found
1 merge request!2Draft:Generic api v1
...@@ -6,20 +6,22 @@ from flask_apispec.extension import FlaskApiSpec ...@@ -6,20 +6,22 @@ from flask_apispec.extension import FlaskApiSpec
from Mirador_backend.routes import v1 from Mirador_backend.routes import v1
from Mirador_backend.utils.config import ConfigFactory from Mirador_backend.utils.config import ConfigFactory
from Mirador_backend.utils.database import db from Mirador_backend.utils.database import db
from Mirador_backend.utils.app import setApp
app = Flask(__name__) app = Flask(__name__)
setApp(app)
api = Api(app) api = Api(app)
docs = FlaskApiSpec(app) docs = FlaskApiSpec(app)
app.config.from_object(ConfigFactory.getConfig()) app.config.from_object(ConfigFactory())
app.db = db app.db = db(app.config['DB'], app.config['DEBUG'])
v1.register_routes(api, docs) v1.register_routes(api, docs)
@app.teardown_appcontext @app.teardown_appcontext
def shutdown_session(exception=None): def shutdown_session(exception=None):
db.close() app.db.close()
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -5,7 +5,7 @@ from sqlalchemy import Integer, JSON ...@@ -5,7 +5,7 @@ from sqlalchemy import Integer, JSON
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.exc import NoResultFound from sqlalchemy.exc import NoResultFound
import json import json
from Mirador_backend.utils.database import db from Mirador_backend.utils.app import getApp
class NotFound(NoResultFound): class NotFound(NoResultFound):
...@@ -16,7 +16,10 @@ class BaseModel(DeclarativeBase): ...@@ -16,7 +16,10 @@ class BaseModel(DeclarativeBase):
"""A generic model class """A generic model class
""" """
session = db.db_session session = getApp().db.session
"""Access the db session"""
engine = getApp().db.engine
"""Access the db session""" """Access the db session"""
fillable = [] fillable = []
...@@ -30,9 +33,13 @@ class BaseModel(DeclarativeBase): ...@@ -30,9 +33,13 @@ class BaseModel(DeclarativeBase):
} }
"""Actual data fields""" """Actual data fields"""
def create_tables(): def create_all():
"""Creates all tables for all models""" """Creates all tables for all models"""
BaseModel.metadata.create_all(db.engine) BaseModel.metadata.create_all(getApp().db.engine)
def drop_all():
"""drop all tables for all models"""
BaseModel.metadata.drop_all(getApp().db.engine)
@classmethod @classmethod
def query(cls, stmt): def query(cls, stmt):
......
...@@ -4,15 +4,21 @@ from Mirador_backend.tests.tester import TestCase ...@@ -4,15 +4,21 @@ from Mirador_backend.tests.tester import TestCase
class MiradorResourceTest(TestCase): class MiradorResourceTest(TestCase):
def getData(self):
return self.getFixtureRecordsByModel(self.fixtures[0], 'Mirador_backend.models.MiradorResource')
def testGetOne(self): def testGetOne(self):
id = 1
payload = json.dumps({}) payload = json.dumps({})
response = self.client.get(self.base + '/1', headers={"Content-Type": "application/json"}, data=payload) response = self.client.get(f'{self.base}/{id}', headers={"Content-Type": "application/json"}, data=payload)
self.assertEqual(200, response.status_code) self.assertEqual(200, response.status_code)
self.assertEqual(None, response.json)
expected = next(x for x in self.getData() if x['id'] == id)
self.assertEqual(expected, response.json)
def testGetAll(self): def testGetAll(self):
payload = json.dumps({}) payload = json.dumps({})
response = self.client.get(self.base, headers={"Content-Type": "application/json"}, data=payload) response = self.client.get(self.base, headers={"Content-Type": "application/json"}, data=payload)
self.assertEqual(200, response.status_code) self.assertEqual(200, response.status_code)
self.assertEqual([], response.json) self.assertEqual({str(x['id']): x for x in self.getData()}, response.json)
import unittest import unittest
import json
from os.path import dirname, abspath
from flask_fixtures import FixturesMixin
from Mirador_backend.app import app from Mirador_backend.app import app
from flask_fixtures import FixturesMixin from Mirador_backend.models import BaseModel
class TestCase(unittest.TestCase, FixturesMixin): class TestCase(unittest.TestCase, FixturesMixin):
fixtures = ['test.json'] fixtures = ['test.json']
app = app app = app
db = app.db db = BaseModel
def setUp(self): def setUp(self):
self.base = 'v1/mirador_resource' self.base = 'v1/mirador_resource'
self.client = app.test_client() self.client = app.test_client()
def getFixture(self, name):
with open(f'{dirname(abspath(__file__))}/fixtures/{name}') as f:
return json.load(f)
def getFixtureRecordsByModel(self, name, model):
return next(x['records'] for x in self.getFixture(name) if x['model'] == model)
def tearDown(self): def tearDown(self):
# TODO # TODO
pass pass
def getApp():
return getApp.app
getApp.app = None
def setApp(app):
getApp.app = app
...@@ -14,7 +14,7 @@ class Config(object): ...@@ -14,7 +14,7 @@ class Config(object):
APISPEC_SWAGGER_UI_URL = '/swagger-ui/' # URI to access UI of API Doc APISPEC_SWAGGER_UI_URL = '/swagger-ui/' # URI to access UI of API Doc
ENV = getenv('ENV', 'dev') ENV = getenv('ENV', 'dev')
TESTING = False TESTING = False
DEBUG = False DEBUG = getenv('ENV', 'dev') != 'prod'
DB = { DB = {
'TYPE': getenv('DB_TYPE', 'mariadb+mariadbconnector'), 'TYPE': getenv('DB_TYPE', 'mariadb+mariadbconnector'),
'USER': getenv('MYSQL_USER', 'user'), 'USER': getenv('MYSQL_USER', 'user'),
...@@ -26,14 +26,10 @@ class Config(object): ...@@ -26,14 +26,10 @@ class Config(object):
class TestingConfig(Config): class TestingConfig(Config):
TESTING = True TESTING = True
DEBUG = True
DB = None DB = None
FIXTURES_DIRS = ['tests/fixtures'] FIXTURES_DIRS = ['tests/fixtures']
class ConfigFactory(): def ConfigFactory():
config = None return TestingConfig if getenv('ENV', 'dev') == 'test' else Config
def getConfig():
if ConfigFactory.config is None:
ConfigFactory.config = TestingConfig() if getenv('ENV', 'dev') == 'test' else Config()
return ConfigFactory.config
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.orm import scoped_session, sessionmaker
from Mirador_backend.utils.config import ConfigFactory
def getDBUri(): class db():
params = ConfigFactory.getConfig().DB def __getDBUri(self):
params = self.config
if params is None: if params is None:
return 'sqlite://' return 'sqlite://'
return f'{params["TYPE"]}://{params["USER"]}:{params["PASSWORD"]}@{params["HOST"]}/{params["BASE"]}' return f'{params["TYPE"]}://{params["USER"]}:{params["PASSWORD"]}@{params["HOST"]}/{params["BASE"]}'
def __init__(self, config, debug):
class db(): self.config = config
engine = create_engine(getDBUri(), echo=ConfigFactory.getConfig().DEBUG) self.engine = create_engine(self.__getDBUri(), echo=debug)
db_session = scoped_session(sessionmaker(autocommit=False, self.session = scoped_session(sessionmaker(autocommit=False,
autoflush=False, autoflush=False,
bind=engine)) bind=self.engine))
def close(): def close(self):
db.db_session.remove() self.session.remove()
...@@ -69,7 +69,7 @@ case $action in ...@@ -69,7 +69,7 @@ case $action in
set +x set +x
;; ;;
"mysql_init") "mysql_init")
$cmd python -c 'from Mirador_backend.models import BaseModel; BaseModel.create_tables()' $cmd python -c 'from Mirador_backend.models import BaseModel; BaseModel.create_all()'
;; ;;
"shell") "shell")
$cmd ipython $cmd ipython
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment