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

Working test with fixtures

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