112 lines
2.8 KiB
Python
112 lines
2.8 KiB
Python
from pathlib import Path
|
|
|
|
import pytest
|
|
import yaml
|
|
from sqlalchemy.exc import ProgrammingError
|
|
|
|
from ereuse_devicehub.client import Client, UserClient
|
|
from ereuse_devicehub.config import DevicehubConfig
|
|
from ereuse_devicehub.db import db
|
|
from ereuse_devicehub.devicehub import Devicehub
|
|
from ereuse_devicehub.resources.tag import Tag
|
|
from ereuse_devicehub.resources.user.models import User
|
|
|
|
|
|
class TestConfig(DevicehubConfig):
|
|
SQLALCHEMY_DATABASE_URI = 'postgresql://dhub:ereuse@localhost/dh_test'
|
|
SCHEMA = 'test'
|
|
TESTING = True
|
|
ORGANIZATION_NAME = 'FooOrg'
|
|
ORGANIZATION_TAX_ID = 'FooOrgId'
|
|
|
|
|
|
@pytest.fixture(scope='module')
|
|
def config():
|
|
return TestConfig()
|
|
|
|
|
|
@pytest.fixture(scope='module')
|
|
def _app(config: TestConfig) -> Devicehub:
|
|
return Devicehub(config=config, db=db)
|
|
|
|
|
|
@pytest.fixture()
|
|
def app(request, _app: Devicehub) -> Devicehub:
|
|
# More robust than 'yield'
|
|
def _drop(*args, **kwargs):
|
|
with _app.app_context():
|
|
db.drop_all()
|
|
|
|
with _app.app_context():
|
|
try:
|
|
_app.init_db()
|
|
except ProgrammingError:
|
|
print('Database was not correctly emptied. Re-empty and re-installing...')
|
|
_drop()
|
|
_app.init_db()
|
|
|
|
request.addfinalizer(_drop)
|
|
return _app
|
|
|
|
|
|
@pytest.fixture()
|
|
def client(app: Devicehub) -> Client:
|
|
return app.test_client()
|
|
|
|
|
|
@pytest.fixture()
|
|
def app_context(app: Devicehub):
|
|
with app.app_context():
|
|
yield
|
|
|
|
|
|
@pytest.fixture()
|
|
def user(app: Devicehub) -> UserClient:
|
|
"""Gets a client with a logged-in dummy user."""
|
|
with app.app_context():
|
|
password = 'foo'
|
|
user = create_user(password=password)
|
|
client = UserClient(application=app,
|
|
response_wrapper=app.response_class,
|
|
email=user.email,
|
|
password=password)
|
|
client.user, _ = client.login(client.email, client.password)
|
|
return client
|
|
|
|
|
|
def create_user(email='foo@foo.com', password='foo') -> User:
|
|
user = User(email=email, password=password)
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
return user
|
|
|
|
|
|
@pytest.fixture()
|
|
def auth_app_context(app: Devicehub):
|
|
"""Creates an app context with a set user."""
|
|
with app.app_context():
|
|
user = create_user()
|
|
|
|
class Auth: # Mock
|
|
username = user.token
|
|
password = ''
|
|
|
|
app.auth.perform_auth(Auth())
|
|
yield
|
|
|
|
|
|
def file(name: str) -> dict:
|
|
"""Opens and parses a YAML file from the ``files`` subdir."""
|
|
with Path(__file__).parent.joinpath('files').joinpath(name + '.yaml').open() as f:
|
|
return yaml.load(f)
|
|
|
|
|
|
@pytest.fixture()
|
|
def tag_id(app: Devicehub) -> str:
|
|
"""Creates a tag and returns its id."""
|
|
with app.app_context():
|
|
t = Tag(id='foo')
|
|
db.session.add(t)
|
|
db.session.commit()
|
|
return t.id
|